xref: /plan9/sys/src/cmd/usb/disk/ums.h (revision 12009bff671a91993ae58f16dab833e809f4a6f3)
13a827ddcSDavid du Colombier /*
23a827ddcSDavid du Colombier  * mass storage transport protocols and subclasses,
33a827ddcSDavid du Colombier  * from usb mass storage class specification overview rev 1.2
43a827ddcSDavid du Colombier  */
53a827ddcSDavid du Colombier 
63a827ddcSDavid du Colombier typedef struct Umsc Umsc;
73a827ddcSDavid du Colombier typedef struct Ums Ums;
83a827ddcSDavid du Colombier typedef struct Cbw Cbw;			/* command block wrapper */
93a827ddcSDavid du Colombier typedef struct Csw Csw;			/* command status wrapper */
103a827ddcSDavid du Colombier 
113a827ddcSDavid du Colombier enum
123a827ddcSDavid du Colombier {
133a827ddcSDavid du Colombier 	Protocbi =	0,	/* control/bulk/interrupt; mainly floppies */
143a827ddcSDavid du Colombier 	Protocb =	1,	/*   "  with no interrupt; mainly floppies */
153a827ddcSDavid du Colombier 	Protobulk =	0x50,	/* bulk only */
163a827ddcSDavid du Colombier 
173a827ddcSDavid du Colombier 	Subrbc =	1,	/* reduced blk cmds */
183a827ddcSDavid du Colombier 	Subatapi =	2,	/* cd/dvd using sff-8020i or mmc-2 cmd blks */
193a827ddcSDavid du Colombier 	Subqic 	=	3,	/* QIC-157 tapes */
203a827ddcSDavid du Colombier 	Subufi =	4,	/* floppy */
213a827ddcSDavid du Colombier 	Sub8070 =	5,	/* removable media, atapi-like */
223a827ddcSDavid du Colombier 	Subscsi =	6,	/* scsi transparent cmd set */
233a827ddcSDavid du Colombier 	Subisd200 =	7,	/* ISD200 ATA */
243a827ddcSDavid du Colombier 	Subdev =	0xff,	/* use device's value */
253a827ddcSDavid du Colombier 
263a827ddcSDavid du Colombier 	Umsreset =	0xFF,
273a827ddcSDavid du Colombier 	Getmaxlun =	0xFE,
283a827ddcSDavid du Colombier 
293a827ddcSDavid du Colombier //	Maxlun		= 256,
303a827ddcSDavid du Colombier 	Maxlun		= 32,
313a827ddcSDavid du Colombier 
323a827ddcSDavid du Colombier 	CMreset = 1,
333a827ddcSDavid du Colombier 
343a827ddcSDavid du Colombier 	Pcmd = 0,
353a827ddcSDavid du Colombier 	Pdata,
363a827ddcSDavid du Colombier 	Pstatus,
373a827ddcSDavid du Colombier 
383a827ddcSDavid du Colombier 	CbwLen		= 31,
393a827ddcSDavid du Colombier 	CbwDataIn	= 0x80,
403a827ddcSDavid du Colombier 	CbwDataOut	= 0x00,
413a827ddcSDavid du Colombier 	CswLen		= 13,
423a827ddcSDavid du Colombier 	CswOk		= 0,
433a827ddcSDavid du Colombier 	CswFailed	= 1,
443a827ddcSDavid du Colombier 	CswPhaseErr	= 2,
453a827ddcSDavid du Colombier };
463a827ddcSDavid du Colombier 
473a827ddcSDavid du Colombier /*
483a827ddcSDavid du Colombier  * corresponds to a lun.
493a827ddcSDavid du Colombier  * these are ~600+Maxiosize bytes each; ScsiReq is not tiny.
503a827ddcSDavid du Colombier  */
513a827ddcSDavid du Colombier struct Umsc
523a827ddcSDavid du Colombier {
533a827ddcSDavid du Colombier 	ScsiReq;
543a827ddcSDavid du Colombier 	uvlong	blocks;
553a827ddcSDavid du Colombier 	vlong	capacity;
563a827ddcSDavid du Colombier 
573a827ddcSDavid du Colombier 	/* from setup */
583a827ddcSDavid du Colombier 	char	*bufp;
593a827ddcSDavid du Colombier 	long	off;		/* offset within a block */
603a827ddcSDavid du Colombier 	long	nb;		/* byte count */
613a827ddcSDavid du Colombier 
62*12009bffSDavid du Colombier 	uchar 	rawcmd[16];
633a827ddcSDavid du Colombier 	uchar	phase;
643a827ddcSDavid du Colombier 	char	*inq;
653a827ddcSDavid du Colombier 	Ums	*ums;
663a827ddcSDavid du Colombier 	Usbfs	fs;
673a827ddcSDavid du Colombier 	char	buf[Maxiosize];
683a827ddcSDavid du Colombier };
693a827ddcSDavid du Colombier 
703a827ddcSDavid du Colombier struct Ums
713a827ddcSDavid du Colombier {
723a827ddcSDavid du Colombier 	QLock;
733a827ddcSDavid du Colombier 	Dev	*dev;
743a827ddcSDavid du Colombier 	Dev	*epin;
753a827ddcSDavid du Colombier 	Dev	*epout;
763a827ddcSDavid du Colombier 	Umsc	*lun;
773a827ddcSDavid du Colombier 	uchar	maxlun;
783a827ddcSDavid du Colombier 	int	seq;
793a827ddcSDavid du Colombier 	int	nerrs;
803a827ddcSDavid du Colombier 	int	wrongresidues;
813a827ddcSDavid du Colombier };
823a827ddcSDavid du Colombier 
833a827ddcSDavid du Colombier /*
843a827ddcSDavid du Colombier  * USB transparent SCSI devices
853a827ddcSDavid du Colombier  */
863a827ddcSDavid du Colombier struct Cbw
873a827ddcSDavid du Colombier {
883a827ddcSDavid du Colombier 	char	signature[4];		/* "USBC" */
893a827ddcSDavid du Colombier 	long	tag;
903a827ddcSDavid du Colombier 	long	datalen;
913a827ddcSDavid du Colombier 	uchar	flags;
923a827ddcSDavid du Colombier 	uchar	lun;
933a827ddcSDavid du Colombier 	uchar	len;
943a827ddcSDavid du Colombier 	char	command[16];
953a827ddcSDavid du Colombier };
963a827ddcSDavid du Colombier 
973a827ddcSDavid du Colombier struct Csw
983a827ddcSDavid du Colombier {
993a827ddcSDavid du Colombier 	char	signature[4];		/* "USBS" */
1003a827ddcSDavid du Colombier 	long	tag;
1013a827ddcSDavid du Colombier 	long	dataresidue;
1023a827ddcSDavid du Colombier 	uchar	status;
1033a827ddcSDavid du Colombier };
1043a827ddcSDavid du Colombier 
1053a827ddcSDavid du Colombier 
1063a827ddcSDavid du Colombier int	diskmain(Dev*, int, char**);
107