#ifdef UMASS_DEBUG
#define DIF(m, x) if (umassdebug & (m)) do { x ; } while (0)
#define DPRINTF(m, x) do { if (umassdebug & (m)) printf x; } while (0)
#define UDMASS_UPPER 0x00008000
#define UDMASS_GEN 0x00010000
#define UDMASS_SCSI 0x00020000
#define UDMASS_UFI 0x00040000
#define UDMASS_8070 0x00080000
#define UDMASS_USB 0x00100000
#define UDMASS_BBB 0x00200000
#define UDMASS_CBI 0x00400000
#define UDMASS_ALL 0xffff0000
#define UDMASS_XFER 0x40000000
#define UDMASS_CMD 0x80000000
extern int umassdebug;
#else
#define DIF(m, x)
#define DPRINTF(m, x)
#endif
#define UFI_COMMAND_LENGTH 12
#define DIR_NONE 0
#define DIR_IN 1
#define DIR_OUT 2
#define UMASS_BULKIN 0
#define UMASS_BULKOUT 1
#define UMASS_INTRIN 2
#define UMASS_NEP 3
#define UR_BBB_RESET 0xff
#define UR_BBB_GET_MAX_LUN 0xfe
struct umass_bbb_cbw {
uDWord dCBWSignature;
#define CBWSIGNATURE 0x43425355
uDWord dCBWTag;
uDWord dCBWDataTransferLength;
uByte bCBWFlags;
#define CBWFLAGS_OUT 0x00
#define CBWFLAGS_IN 0x80
uByte bCBWLUN;
uByte bCDBLength;
#define CBWCDBLENGTH 16
uByte CBWCDB[CBWCDBLENGTH];
};
#define UMASS_BBB_CBW_SIZE 31
struct umass_bbb_csw {
uDWord dCSWSignature;
#define CSWSIGNATURE 0x53425355
#define CSWSIGNATURE_OLYMPUS_C1 0x55425355
uDWord dCSWTag;
uDWord dCSWDataResidue;
uByte bCSWStatus;
#define CSWSTATUS_GOOD 0x0
#define CSWSTATUS_FAILED 0x1
#define CSWSTATUS_PHASE 0x2
};
#define UMASS_BBB_CSW_SIZE 13
#define UR_CBI_ADSC 0x00
typedef unsigned char umass_cbi_cbl_t[16];
typedef union {
struct {
uByte type;
#define IDB_TYPE_CCI 0x00
uByte value;
#define IDB_VALUE_PASS 0x00
#define IDB_VALUE_FAIL 0x01
#define IDB_VALUE_PHASE 0x02
#define IDB_VALUE_PERSISTENT 0x03
#define IDB_VALUE_STATUS_MASK 0x03
} common;
struct {
uByte asc;
uByte ascq;
} ufi;
} umass_cbi_sbl_t;
struct umass_softc;
typedef void (*umass_callback)(struct umass_softc *, void *, int, int);
#define STATUS_CMD_OK 0
#define STATUS_CMD_UNKNOWN 1
#define STATUS_CMD_FAILED 2
#define STATUS_WIRE_FAILED 3
typedef void (*umass_wire_xfer)(struct umass_softc *, int, void *, int, void *,
int, int, u_int, umass_callback, void *);
typedef void (*umass_wire_reset)(struct umass_softc *, int);
typedef void (*umass_wire_state)(struct usbd_xfer *, void *, usbd_status);
struct umass_wire_methods {
umass_wire_xfer wire_xfer;
umass_wire_reset wire_reset;
umass_wire_state wire_state;
};
struct umass_scsi_softc;
struct umass_softc {
struct device sc_dev;
struct usbd_device *sc_udev;
struct usbd_interface *sc_iface;
int sc_ifaceno;
u_int8_t sc_epaddr[UMASS_NEP];
struct usbd_pipe *sc_pipe[UMASS_NEP];
usb_device_request_t sc_req;
const struct umass_wire_methods *sc_methods;
u_int8_t sc_wire;
#define UMASS_WPROTO_UNSPEC 0
#define UMASS_WPROTO_BBB 1
#define UMASS_WPROTO_CBI 2
#define UMASS_WPROTO_CBI_I 3
u_int8_t sc_cmd;
#define UMASS_CPROTO_UNSPEC 0
#define UMASS_CPROTO_SCSI 1
#define UMASS_CPROTO_ATAPI 2
#define UMASS_CPROTO_UFI 3
#define UMASS_CPROTO_RBC 4
#define UMASS_CPROTO_ISD_ATA 5
u_int32_t sc_quirks;
#define UMASS_QUIRK_WRONG_CSWSIG 0x00000001
#define UMASS_QUIRK_WRONG_CSWTAG 0x00000002
#define UMASS_QUIRK_IGNORE_RESIDUE 0x00000004
u_int32_t sc_busquirks;
struct umass_bbb_cbw cbw;
struct umass_bbb_csw csw;
umass_cbi_cbl_t cbl;
umass_cbi_sbl_t sbl;
#define XFER_BBB_CBW 0
#define XFER_BBB_DATA 1
#define XFER_BBB_DCLEAR 2
#define XFER_BBB_CSW1 3
#define XFER_BBB_CSW2 4
#define XFER_BBB_SCLEAR 5
#define XFER_BBB_RESET1 6
#define XFER_BBB_RESET2 7
#define XFER_BBB_RESET3 8
#define XFER_CBI_CB 0
#define XFER_CBI_DATA 1
#define XFER_CBI_STATUS 2
#define XFER_CBI_DCLEAR 3
#define XFER_CBI_SCLEAR 4
#define XFER_CBI_RESET1 5
#define XFER_CBI_RESET2 6
#define XFER_CBI_RESET3 7
#define XFER_NR 9
struct usbd_xfer *transfer_xfer[XFER_NR];
void *data_buffer;
int transfer_dir;
void *transfer_data;
int transfer_datalen;
int transfer_actlen;
umass_callback transfer_cb;
void *transfer_priv;
int transfer_status;
int transfer_state;
#define TSTATE_IDLE 0
#define TSTATE_BBB_COMMAND 1
#define TSTATE_BBB_DATA 2
#define TSTATE_BBB_DCLEAR 3
#define TSTATE_BBB_STATUS1 4
#define TSTATE_BBB_SCLEAR 5
#define TSTATE_BBB_STATUS2 6
#define TSTATE_BBB_RESET1 7
#define TSTATE_BBB_RESET2 8
#define TSTATE_BBB_RESET3 9
#define TSTATE_CBI_COMMAND 10
#define TSTATE_CBI_DATA 11
#define TSTATE_CBI_STATUS 12
#define TSTATE_CBI_DCLEAR 13
#define TSTATE_CBI_SCLEAR 14
#define TSTATE_CBI_RESET1 15
#define TSTATE_CBI_RESET2 16
#define TSTATE_CBI_RESET3 17
#define TSTATE_STATES 18
int timeout;
u_int8_t maxlun;
#ifdef UMASS_DEBUG
struct timeval tv;
#endif
int sc_xfer_flags;
int sc_refcnt;
int sc_sense;
struct umass_scsi_softc *bus;
int polling_depth;
usbd_status polled_xfer_status;
struct usbd_xfer *next_polled_xfer;
};
#define UMASS_MAX_TRANSFER_SIZE MAXBSIZE