- Timestamp:
- Dec 21, 2010, 6:06:19 PM (15 years ago)
- Location:
- trunk/src/os2ahci
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/os2ahci/atapi.c
r64 r65 32 32 33 33 static void atapi_req_sense_pp (IORBH _far *iorb); 34 35 34 36 35 /* ------------------------ global/static variables ------------------------ */ … … 94 93 AP_DEVICE, 0x4000, 95 94 AP_FEATURES, ATAPI_FEAT_DMA | ATAPI_FEAT_DMA_TO_HOST, 96 AP_SECTOR_28, ATAPI_LBA_DMA,97 95 AP_END); 98 96 … … 145 143 IORB_ADAPTER_PASSTHRU _far *pt = (IORB_ADAPTER_PASSTHRU _far *) iorb; 146 144 int rc; 145 u8 cdb[ATAPI_MAX_CDB_LEN] = {0}; 146 u16 cdb_len; 147 148 if (pt->ControllerCmdLen > ATAPI_MAX_CDB_LEN) { 149 ioerb_seterr(IOERR_CMD_SYNTAX); 150 return -1; 151 } 152 /* AHCI requires 12 or 16 byte commands; for now, we pad them 153 * since I have no idea what to do with commands that do not 154 * have a 12 or 16 byte equivalent */ 155 memcpy(cdb, pt->pControllerCmd, pt->ControllerCmdLen); 156 cdb_len = max(ATAPI_MIN_CDB_LEN, pt->ControllerCmdLen); 147 157 148 158 /* we do not perform the S/G limitation recovery loop here: … … 154 164 iorb_unit_device(iorb), 155 165 slot, ATA_CMD_PACKET, 156 AP_ATAPI_CMD, (void _far *) pt->pControllerCmd, 157 pt->ControllerCmdLen, 166 AP_ATAPI_CMD, (void _far *) cdb, cdb_len, 158 167 AP_SGLIST, pt->pSGList, pt->cSGList, 159 168 /* TODO: do we have to clear DMA_TO_HOST bit for … … 161 170 */ 162 171 AP_FEATURES, ATAPI_FEAT_DMA | ATAPI_FEAT_DMA_TO_HOST, 163 AP_SECTOR_28, ATAPI_LBA_DMA,164 172 AP_END); 165 173 … … 184 192 { 185 193 ADD_WORKSPACE _far *aws = add_workspace(iorb); 186 ATAPI_CDB_6 cdb;187 194 int rc; 195 u8 cdb[ATAPI_MIN_CDB_LEN]; 196 ATAPI_CDB_6 *pcdb; = (ATAPI_CDB_6*) cdb; 188 197 189 198 /* allocate sense buffer in ADD workspace */ … … 196 205 197 206 /* prepare request sense command */ 198 memset( &cdb, 0x00, sizeof(cdb));199 cdb.cmd = ATAPI_CMD_REQUEST_SENSE;200 cdb.trans_len = (u8) ATAPI_SENSE_LEN;207 memset(cdb, 0x00, sizeof(cdb)); 208 pcdb->cmd = ATAPI_CMD_REQUEST_SENSE; 209 pcdb->trans_len = (u8) ATAPI_SENSE_LEN; 201 210 202 211 aws->ppfunc = atapi_req_sense_pp; … … 206 215 slot, 207 216 ATA_CMD_PACKET, 208 AP_ATAPI_CMD, (void _far*) &cdb, sizeof(cdb),217 AP_ATAPI_CMD, (void _far*) cdb, sizeof(cdb), 209 218 AP_VADDR, (void _far *) aws->buf, ATAPI_SENSE_LEN, 210 219 AP_FEATURES, ATAPI_FEAT_DMA, 211 AP_SECTOR_28, ATAPI_LBA_DMA,212 220 AP_END); 213 221 214 222 if (rc > 0) { 215 /* should never happen - we got 64 bytes here */216 223 iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD); 217 224 … … 281 288 282 289 } 290 -
trunk/src/os2ahci/atapi.h
r64 r65 22 22 23 23 /* -------------------------- macros and constants ------------------------- */ 24 25 #define ATAPI_MIN_CDB_LEN 12 /* minimum ATAPI CDB len acc to AHCI spec */ 26 #define ATAPI_MAX_CDB_LEN 16 24 27 25 28 /****************************************************************************** … … 68 71 #define ATAPI_FEAT_DMA 0x0001 69 72 #define ATAPI_FEAT_DMA_TO_HOST 0x0004 70 71 #define ATAPI_LBA_DMA ((u32)0xffff << 8)72 73 73 74 /****************************************************************************** … … 152 153 u8 lun; /* SCSI lun (ignored) */ 153 154 u8 resvd[2]; 154 u8 trans_len; /* tra snfer length */155 u8 trans_len; /* transfer length */ 155 156 u8 control; 156 157 } ATAPI_CDB_6;
Note:
See TracChangeset
for help on using the changeset viewer.