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