Changeset 65 for trunk


Ignore:
Timestamp:
Dec 21, 2010, 6:06:19 PM (15 years ago)
Author:
root
Message:

added padding to ATAPI CDBs

Location:
trunk/src/os2ahci
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/os2ahci/atapi.c

    r64 r65  
    3232
    3333static void atapi_req_sense_pp      (IORBH _far *iorb);
    34 
    3534
    3635/* ------------------------ global/static variables ------------------------ */
     
    9493                 AP_DEVICE,    0x4000,
    9594                 AP_FEATURES,  ATAPI_FEAT_DMA | ATAPI_FEAT_DMA_TO_HOST,
    96                  AP_SECTOR_28, ATAPI_LBA_DMA,
    9795                 AP_END);
    9896
     
    145143  IORB_ADAPTER_PASSTHRU _far *pt = (IORB_ADAPTER_PASSTHRU _far *) iorb;
    146144  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);
    147157
    148158  /* we do not perform the S/G limitation recovery loop here:
     
    154164               iorb_unit_device(iorb),
    155165               slot, ATA_CMD_PACKET,
    156                AP_ATAPI_CMD, (void _far *) pt->pControllerCmd,
    157                              pt->ControllerCmdLen,
     166               AP_ATAPI_CMD, (void _far *) cdb, cdb_len,
    158167               AP_SGLIST,    pt->pSGList, pt->cSGList,
    159168               /* TODO: do we have to clear DMA_TO_HOST bit for
     
    161170                */
    162171               AP_FEATURES,  ATAPI_FEAT_DMA | ATAPI_FEAT_DMA_TO_HOST,
    163                AP_SECTOR_28, ATAPI_LBA_DMA,
    164172               AP_END);
    165173
     
    184192{
    185193  ADD_WORKSPACE _far *aws = add_workspace(iorb);
    186   ATAPI_CDB_6 cdb;
    187194  int rc;
     195  u8 cdb[ATAPI_MIN_CDB_LEN];
     196  ATAPI_CDB_6 *pcdb; = (ATAPI_CDB_6*) cdb;
    188197 
    189198  /* allocate sense buffer in ADD workspace */
     
    196205
    197206  /* 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;
    201210 
    202211  aws->ppfunc = atapi_req_sense_pp;
     
    206215               slot,
    207216               ATA_CMD_PACKET,
    208                AP_ATAPI_CMD, (void _far*) &cdb, sizeof(cdb),
     217               AP_ATAPI_CMD, (void _far*) cdb, sizeof(cdb),
    209218               AP_VADDR, (void _far *) aws->buf, ATAPI_SENSE_LEN,
    210219               AP_FEATURES,  ATAPI_FEAT_DMA,
    211                AP_SECTOR_28, ATAPI_LBA_DMA,
    212220               AP_END);
    213221
    214222  if (rc > 0) {
    215     /* should never happen - we got 64 bytes here */
    216223    iorb_seterr(iorb, IOERR_CMD_SGLIST_BAD);
    217224
     
    281288
    282289}
     290
  • trunk/src/os2ahci/atapi.h

    r64 r65  
    2222
    2323/* -------------------------- 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
    2427
    2528/******************************************************************************
     
    6871#define ATAPI_FEAT_DMA             0x0001
    6972#define ATAPI_FEAT_DMA_TO_HOST     0x0004
    70 
    71 #define ATAPI_LBA_DMA              ((u32)0xffff << 8)
    7273
    7374/******************************************************************************
     
    152153  u8   lun;            /* SCSI lun (ignored) */
    153154  u8   resvd[2];
    154   u8   trans_len;      /* trasnfer length */
     155  u8   trans_len;      /* transfer length */
    155156  u8   control;
    156157} ATAPI_CDB_6;
Note: See TracChangeset for help on using the changeset viewer.