Ignore:
Timestamp:
Nov 29, 2016, 5:30:22 AM (9 years ago)
Author:
David Azarewicz
Message:

Major reorganization

File:
1 edited

Legend:

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

    r165 r178  
    44 * Copyright (c) 2011 thi.guten Software Development
    55 * Copyright (c) 2011 Mensys B.V.
     6 * Copyright (c) 2013-2016 David Azarewicz
    67 *
    78 * Authors: Christian Mueller, Markus Thielen
     
    5455  SCATGATENTRY        sg_lst[AHCI_MAX_SG / 2]; /* scatter/gather list */
    5556  ULONG               sg_cnt;                  /* number of S/G elements */
    56   UCHAR               lh[16];                  /* lock handle for VMLock() */
     57  struct _KernVMLock_t *lh;                  /* lock handle for VMLock() */
    5758} IOCTL_CONTEXT;
    5859
     
    6061
    6162static USHORT do_smart  (BYTE unit, BYTE sub_func, BYTE cnt, BYTE lba_l,
    62                          void _far *buf);
    63 static int    map_unit  (BYTE unit, USHORT _far *a, USHORT _far *p,
    64                          USHORT _far *d);
    65 static LIN    lin       (void _far *p);
    66 
    67 IORBH _far * _far _cdecl ioctl_wakeup(IORBH _far *iorb);
     63                         void *buf);
     64static int    map_unit  (BYTE unit, USHORT *a, USHORT *p,
     65                         USHORT *d);
     66
     67IORBH *IoctlWakeup(ULONG ulArg);
     68extern IORBH FAR16DATA * __far16 IoctlWakeup16(IORBH FAR16DATA*);
    6869
    6970/* ------------------------ global/static variables ------------------------ */
     
    7576 * adapter/port/device combinations are available.
    7677 */
    77 USHORT ioctl_get_devlist(RP_GENIOCTL _far *ioctl)
    78 {
    79   OS2AHCI_DEVLIST _far *devlst = (OS2AHCI_DEVLIST _far *) ioctl->DataPacket;
     78USHORT ioctl_get_devlist(REQPACKET *ioctl)
     79{
     80  OS2AHCI_DEVLIST *devlst = (OS2AHCI_DEVLIST*)Far16ToFlat(ioctl->ioctl.pvData);
    8081  USHORT maxcnt = 0;
    8182  USHORT cnt = 0;
     
    8485  USHORT d;
    8586
    86   /* verify addressability of parm buffer (number of devlst elements) */
    87   if (DevHelp_VerifyAccess((SEL) ((ULONG) ioctl->ParmPacket >> 16),
    88                             sizeof(USHORT),
    89                             (USHORT) (ULONG) ioctl->ParmPacket,
    90                             VERIFY_READONLY) != 0) {
    91     return(STDON | STERR | 0x05);
    92   }
    93 
    94   maxcnt = *((USHORT _far *) ioctl->ParmPacket);
    95 
    96   /* verify addressability of return buffer (OS2AHCI_DEVLIST) */
    97   if (DevHelp_VerifyAccess((SEL) ((ULONG) devlst >> 16),
    98                             offsetof(OS2AHCI_DEVLIST, devs) +
    99                               sizeof(devlst->devs) * maxcnt,
    100                             (USHORT) (ULONG) devlst,
    101                             VERIFY_READWRITE) != 0) {
    102     return(STDON | STERR | 0x05);
     87  if (KernCopyIn(&maxcnt, ioctl->ioctl.pvParm, sizeof(maxcnt)))
     88  {
     89    return(RPDONE | RPERR_PARAMETER);
    10390  }
    10491
    10592  /* fill-in device list */
    106   for (a = 0; a < ad_info_cnt; a++) {
     93  for (a = 0; a < ad_info_cnt; a++)
     94  {
    10795    AD_INFO *ai = ad_infos + a;
    10896
    109     for (p = 0; p <= ai->port_max; p++) {
     97    for (p = 0; p <= ai->port_max; p++)
     98    {
    11099      P_INFO *pi = ai->ports + p;
    111100
    112       for (d = 0; d <= pi->dev_max; d++) {
    113         if (pi->devs[d].present) {
     101      for (d = 0; d <= pi->dev_max; d++)
     102      {
     103        if (pi->devs[d].present)
     104        {
    114105          /* add this device to the device list */
    115           if (cnt >= maxcnt) {
     106          if (cnt >= maxcnt)
     107          {
    116108            /* not enough room in devlst */
    117109            goto ioctl_get_device_done;
     
    136128ioctl_get_device_done:
    137129  devlst->cnt = cnt;
    138   return(STDON);
     130  return(RPDONE);
    139131}
    140132
     
    143135 * requests.
    144136 */
    145 USHORT ioctl_passthrough(RP_GENIOCTL _far *ioctl)
    146 {
    147   OS2AHCI_PASSTHROUGH _far *req = (OS2AHCI_PASSTHROUGH _far *) ioctl->ParmPacket;
    148   char _far *sense_buf = (char _far *) ioctl->DataPacket;
     137USHORT ioctl_passthrough(REQPACKET *ioctl)
     138{
     139  OS2AHCI_PASSTHROUGH *req = (OS2AHCI_PASSTHROUGH *)Far16ToFlat(ioctl->ioctl.pvParm);
     140  char *sense_buf = (char *)Far16ToFlat(ioctl->ioctl.pvData);
    149141  IOCTL_CONTEXT *ic;
    150142  USHORT ret;
     
    152144  USHORT p;
    153145  USHORT d;
    154 
    155   /* verify addressability of parm buffer (OS2AHCI_PASSTHROUGH) */
    156   if (DevHelp_VerifyAccess((SEL) ((ULONG) req >> 16),
    157                             sizeof(OS2AHCI_PASSTHROUGH),
    158                             (USHORT) (ULONG) req,
    159                             VERIFY_READWRITE) != 0) {
    160     return(STDON | STERR | 0x05);
    161   }
    162 
    163   /* verify addressability of data buffer (sense data) */
    164   if (req->sense_len > 0) {
    165     if (DevHelp_VerifyAccess((SEL) ((ULONG) sense_buf >> 16),
    166                               req->sense_len,
    167                               (USHORT) (ULONG) sense_buf,
    168                               VERIFY_READWRITE) != 0) {
    169       return(STDON | STERR | 0x05);
    170     }
    171   }
    172146
    173147  /* Verify basic request parameters such as adapter/port/device, size of
     
    178152  d = req->device;
    179153  if (a >= ad_info_cnt || p > ad_infos[a].port_max ||
    180       d > ad_infos[a].ports[p].dev_max || !ad_infos[a].ports[p].devs[d].present) {
    181     return(STDON | STERR | ERROR_I24_BAD_UNIT);
     154      d > ad_infos[a].ports[p].dev_max || !ad_infos[a].ports[p].devs[d].present)
     155  {
     156    return(RPDONE | RPERR_UNIT);
    182157  }
    183158  if ((req->buflen + 4095) / 4096 + 1 > AHCI_MAX_SG / 2 ||
    184       req->cmdlen < 6 || req->cmdlen > sizeof(req->cmd)) {
    185     return(STDON | STERR | ERROR_I24_INVALID_PARAMETER);
     159      req->cmdlen < 6 || req->cmdlen > sizeof(req->cmd))
     160  {
     161    return(RPDONE | RPERR_PARAMETER);
    186162  }
    187163
    188164  /* allocate IOCTL context data */
    189   if ((ic = malloc(sizeof(*ic))) == NULL) {
    190     return(STDON | STERR | ERROR_I24_GEN_FAILURE);
     165  if ((ic = MemAlloc(sizeof(*ic))) == NULL)
     166  {
     167    return(RPDONE | RPERR_GENERAL);
    191168  }
    192169  memset(ic, 0x00, sizeof(*ic));
    193 
    194   /* lock DMA transfer buffer into memory and construct S/G list */
    195   if (req->buflen > 0) {
    196     if (DevHelp_VMLock(VMDHL_LONG | !((req->flags & PT_WRITE) ? VMDHL_WRITE : 0),
    197                        req->buf, req->buflen, lin(ic->sg_lst), lin(&ic->lh),
    198                        &ic->sg_cnt) != 0) {
    199       /* couldn't lock buffer and/or produce a S/G list */
    200       free(ic);
    201       return(STDON | STERR | ERROR_I24_INVALID_PARAMETER);
    202     }
    203   }
    204170
    205171  /* fill in adapter passthrough fields */
     
    210176  ic->iorb.iorbh.RequestControl   = IORB_ASYNC_POST;
    211177  ic->iorb.iorbh.Timeout          = req->timeout;
    212   ic->iorb.iorbh.NotifyAddress    = ioctl_wakeup;
    213 
    214   ic->iorb.cSGList          = ic->sg_cnt;
    215   ic->iorb.pSGList          = ic->sg_lst;
    216   ic->iorb.ppSGLIST         = virt_to_phys(ic->sg_lst);
     178  ic->iorb.iorbh.NotifyAddress    = IoctlWakeup16;
     179
     180  ic->iorb.cSGList = ic->sg_cnt;
     181  ic->iorb.pSGList = MemFar16Adr(ic->sg_lst);
     182  ic->iorb.ppSGLIST = MemPhysAdr(ic->sg_lst);
    217183
    218184  memcpy(ic->cmd, req->cmd.cdb, sizeof(ic->cmd));
    219185  ic->iorb.ControllerCmdLen = req->cmdlen;
    220   ic->iorb.pControllerCmd   = ic->cmd;
     186  ic->iorb.pControllerCmd   = MemFar16Adr(ic->cmd);
    221187  ic->iorb.Flags            = (req->flags & PT_WRITE) ? 0 : PT_DIRECTION_IN;
    222188
    223   if (req->sense_len > 0) {
     189  if (req->sense_len > 0)
     190  {
    224191    /* initialize SCSI status block to allow getting sense data */
    225     ic->iorb.iorbh.pStatusBlock     = (BYTE *) &ic->ssb;
     192    ic->iorb.iorbh.pStatusBlock     = CastFar16ToULONG(MemFar16Adr(&ic->ssb));
    226193    ic->iorb.iorbh.StatusBlockLen   = sizeof(ic->ssb);
    227     ic->ssb.SenseData               = (SCSI_REQSENSE_DATA _far *) ic->sense;
     194    ic->ssb.SenseData               = (SCSI_REQSENSE_DATA *) ic->sense;
    228195    ic->ssb.ReqSenseLen             = sizeof(ic->sense);
    229196    ic->iorb.iorbh.RequestControl  |= IORB_REQ_STATUSBLOCK;
     
    231198
    232199  /* send IORB on its way */
    233   add_entry(&ic->iorb.iorbh);
     200  add_entry(MemFar16Adr(&ic->iorb.iorbh));
    234201
    235202  /* Wait for IORB completion. */
    236203  spin_lock(drv_lock);
    237   while (!(ic->iorb.iorbh.Status & IORB_DONE)) {
    238     DevHelp_ProcBlock((ULONG) (void _far *) &ic->iorb.iorbh, 30000, 1);
     204  while (!(ic->iorb.iorbh.Status & IORB_DONE))
     205  {
     206    KernBlock((ULONG)&ic->iorb.iorbh, 30000, 0, NULL, NULL);
    239207  }
    240208  spin_unlock(drv_lock);
    241209
    242   ret = STDON;
     210  ret = RPDONE;
    243211
    244212  /* map IORB error codes to device driver error codes */
    245   if (ic->iorb.iorbh.Status & IORB_ERROR) {
    246     ret |= STERR;
    247 
    248     switch (ic->iorb.iorbh.ErrorCode) {
    249 
     213  if (ic->iorb.iorbh.Status & IORB_ERROR)
     214  {
     215    ret |= RPERR;
     216
     217    switch (ic->iorb.iorbh.ErrorCode)
     218    {
    250219    case IOERR_UNIT_NOT_READY:
    251       ret |= ERROR_I24_NOT_READY;
     220      ret |= RPERR_NOTREADY;
    252221      break;
    253222
    254223    case IOERR_MEDIA_CHANGED:
    255       ret |= ERROR_I24_DISK_CHANGE;
     224      ret |= RPERR_DISK;
    256225      break;
    257226
    258227    case IOERR_MEDIA:
    259228    case IOERR_MEDIA_NOT_FORMATTED:
    260       ret |= ERROR_I24_CRC;
     229      ret |= RPERR_CRC;
    261230      break;
    262231
    263232    case IOERR_CMD_SYNTAX:
    264233    case IOERR_CMD_NOT_SUPPORTED:
    265       ret |= ERROR_I24_BAD_COMMAND;
     234      ret |= RPERR_BADCOMMAND;
    266235      break;
    267236
    268237    case IOERR_MEDIA_WRITE_PROTECT:
    269       ret |= ERROR_I24_WRITE_PROTECT;
     238      ret |= RPERR_PROTECT;
    270239      break;
    271240
    272241    case IOERR_CMD_ABORTED:
    273       ret |= ERROR_I24_CHAR_CALL_INTERRUPTED;
     242      ret |= RPERR_INTERRUPTED;
    274243      break;
    275244
    276245    case IOERR_RBA_ADDRESSING_ERROR:
    277       ret |= ERROR_I24_SEEK;
     246      ret |= RPERR_SEEK;
    278247      break;
    279248
    280249    case IOERR_RBA_LIMIT:
    281       ret |= ERROR_I24_SECTOR_NOT_FOUND;
     250      ret |= RPERR_SECTOR;
    282251      break;
    283252
    284253    case IOERR_CMD_SGLIST_BAD:
    285       ret |= ERROR_I24_INVALID_PARAMETER;
     254      ret |= RPERR_PARAMETER;
    286255      break;
    287256
     
    292261    case IOERR_CMD_SW_RESOURCE:
    293262    default:
    294       ret |= ERROR_I24_GEN_FAILURE;
     263      ret |= RPERR_GENERAL;
    295264      break;
    296265    }
     
    298267    /* copy sense information, if there is any */
    299268    if ((ic->iorb.iorbh.Status & IORB_STATUSBLOCK_AVAIL) &&
    300         (ic->ssb.Flags | STATUS_SENSEDATA_VALID)) {
    301       memcpy(sense_buf, ic->ssb.SenseData,
    302             min(ic->ssb.ReqSenseLen, req->sense_len));
     269        (ic->ssb.Flags | STATUS_SENSEDATA_VALID))
     270    {
     271      memcpy(sense_buf, ic->ssb.SenseData, min(ic->ssb.ReqSenseLen, req->sense_len));
    303272    }
    304273
    305   } else if ((req->flags & PT_ATAPI) == 0) {
     274  }
     275  else if ((req->flags & PT_ATAPI) == 0)
     276  {
    306277    /* Copy ATA cmd back to IOCTL request (ATA commands are effectively
    307278     * registers which are sometimes used to indicate return conditions,
     
    311282  }
    312283
    313   free(ic);
    314   if (req->buflen > 0) {
    315     DevHelp_VMUnLock(lin(ic->lh));
    316   }
     284  MemFree(ic);
    317285  return(ret);
    318286}
     
    325293 *       point, basically those calls required to get HDMON working.
    326294 */
    327 USHORT ioctl_gen_dsk(RP_GENIOCTL _far *ioctl)
    328 {
    329   DSKSP_CommandParameters _far *cp = (DSKSP_CommandParameters _far *) ioctl->ParmPacket;
    330   UnitInformationData _far *ui;
     295USHORT ioctl_gen_dsk(REQPACKET *ioctl)
     296{
     297  DSKSP_CommandParameters *cp = (DSKSP_CommandParameters*)Far16ToFlat(ioctl->ioctl.pvParm);
     298  UnitInformationData *ui;
    331299  OS2AHCI_PASSTHROUGH pt;
    332   RP_GENIOCTL tmp_ioctl;
     300  REQPACKET tmp_ioctl;
    333301  USHORT size = 0;
    334302  USHORT ret;
     
    338306  UCHAR unit;
    339307
    340   /* verify addressability of parm buffer (DSKSP_CommandParameters) */
    341   if (DevHelp_VerifyAccess((SEL) ((ULONG) cp >> 16),
    342                             sizeof(DSKSP_CommandParameters),
    343                             (USHORT) (ULONG) cp,
    344                             VERIFY_READONLY) != 0) {
    345     return(STDON | STERR | 0x05);
    346   }
    347308  unit = cp->byPhysicalUnit;
    348309
    349310  /* verify addressability of data buffer (depends on function code) */
    350   switch (ioctl->Function) {
    351 
     311  switch (ioctl->ioctl.bFunction)
     312  {
    352313  case DSKSP_GEN_GET_COUNTERS:
    353314    size = sizeof(DeviceCountersData);
     
    363324  }
    364325
    365   if (size > 0) {
    366     if (DevHelp_VerifyAccess((SEL) ((ULONG) ioctl->DataPacket >> 16),
    367                              size, (USHORT) (ULONG) ioctl->DataPacket,
    368                              VERIFY_READWRITE) != 0) {
    369       return(STDON | STERR | 0x05);
    370     }
    371   }
    372 
    373   if (map_unit(unit, &a, &p, &d)) {
    374     return(STDON | STERR | ERROR_I24_BAD_UNIT);
     326  if (map_unit(unit, &a, &p, &d))
     327  {
     328    return(RPDONE | RPERR | RPERR_UNIT);
    375329  }
    376330
    377331  /* execute generic disk request */
    378   switch (ioctl->Function) {
    379 
     332  switch (ioctl->ioctl.bFunction)
     333  {
    380334  case DSKSP_GEN_GET_COUNTERS:
    381335    /* Not supported, yet; we would need dynamically allocated device
     
    383337     * statistics buffer. For the time being, we'll return an empty buffer.
    384338     */
    385     memset(ioctl->DataPacket, 0x00, sizeof(DeviceCountersData));
    386     ret = STDON;
     339    memset(Far16ToFlat(ioctl->ioctl.pvData), 0x00, sizeof(DeviceCountersData));
     340    ret = RPDONE;
    387341    break;
    388342
     
    391345     * even bother returning those.
    392346     */
    393     ui = (UnitInformationData _far *) ioctl->DataPacket;
     347    ui = (UnitInformationData*)Far16ToFlat(ioctl->ioctl.pvData);
    394348    memset(ui, 0x00, sizeof(*ui));
    395349
     
    402356    ui->wFlags         |= UIF_SATA;
    403357
    404     ret = STDON;
     358    ret = RPDONE;
    405359    break;
    406360
     
    408362    /* return ATA ID buffer */
    409363    memset(&tmp_ioctl, 0x00, sizeof(tmp_ioctl));
    410     tmp_ioctl.Category   = OS2AHCI_IOCTL_CATEGORY;
    411     tmp_ioctl.Function   = OS2AHCI_IOCTL_PASSTHROUGH;
    412     tmp_ioctl.ParmPacket = (void _far *) &pt;
     364    tmp_ioctl.ioctl.bCategory   = OS2AHCI_IOCTL_CATEGORY;
     365    tmp_ioctl.ioctl.bFunction   = OS2AHCI_IOCTL_PASSTHROUGH;
     366    tmp_ioctl.ioctl.pvParm = FlatToFar16(&pt);
    413367
    414368    memset(&pt, 0x00, sizeof(pt));
     
    420374                           ATA_CMD_ID_ATAPI : ATA_CMD_ID_ATA;
    421375    pt.buflen           = size;
    422     pt.buf              = lin(ioctl->DataPacket);
     376    pt.buf              = Far16ToFlat(ioctl->ioctl.pvData);
    423377
    424378    ret = gen_ioctl(&tmp_ioctl);
     
    426380
    427381  default:
    428     ret = STDON | STATUS_ERR_UNKCMD;
     382    ret = RPDONE | RPERR_BADCOMMAND;
    429383    break;
    430384  }
     
    437391 * IBM1S506; the code has been more or less copied from DANIS506.
    438392 */
    439 USHORT ioctl_smart(RP_GENIOCTL _far *ioctl)
    440 {
    441   DSKSP_CommandParameters _far *cp = (DSKSP_CommandParameters _far *) ioctl->ParmPacket;
     393USHORT ioctl_smart(REQPACKET *ioctl)
     394{
     395  DSKSP_CommandParameters *cp = (DSKSP_CommandParameters *)Far16ToFlat(ioctl->ioctl.pvParm);
    442396  USHORT size = 0;
    443397  USHORT ret;
     
    445399  UCHAR parm;
    446400
    447   /* verify addressability of parm buffer (DSKSP_CommandParameters) */
    448   if (DevHelp_VerifyAccess((SEL) ((ULONG) cp >> 16),
    449                             sizeof(DSKSP_CommandParameters),
    450                             (USHORT) (ULONG) cp,
    451                             VERIFY_READONLY) != 0) {
    452     return(STDON | STERR | 0x05);
    453   }
    454401  unit = cp->byPhysicalUnit;
    455402
    456403  /* verify addressability of data buffer (depends on SMART function) */
    457   switch (ioctl->Function) {
     404  switch (ioctl->ioctl.bFunction)
     405  {
    458406
    459407  case DSKSP_SMART_GETSTATUS:
     
    468416  }
    469417
    470   if (size > 0) {
    471     if (DevHelp_VerifyAccess((SEL) ((ULONG) ioctl->DataPacket >> 16),
    472                              size, (USHORT) (ULONG) ioctl->DataPacket,
    473                              VERIFY_READWRITE) != 0) {
    474       return(STDON | STERR | 0x05);
    475     }
    476     parm = ioctl->DataPacket[0];
     418  if (size > 0)
     419  {
     420    parm = *(UCHAR*)Far16ToFlat(ioctl->ioctl.pvData);
    477421  }
    478422
    479423  /* execute SMART request */
    480   switch (ioctl->Function) {
    481 
     424  switch (ioctl->ioctl.bFunction)
     425  {
    482426  case DSKSP_SMART_ONOFF:
    483427    ret = do_smart(unit, (BYTE) ((parm) ? ATA_SMART_ENABLE : ATA_SMART_DISABLE), 0, 0, NULL);
     
    501445
    502446  case DSKSP_SMART_GETSTATUS:
    503     ret = do_smart(unit, ATA_SMART_STATUS, 0, 0, ioctl->DataPacket);
     447    ret = do_smart(unit, ATA_SMART_STATUS, 0, 0, Far16ToFlat(ioctl->ioctl.pvData));
    504448    break;
    505449
    506450  case DSKSP_SMART_GET_ATTRIBUTES:
    507     ret = do_smart(unit, ATA_SMART_READ_VALUES, 0, 0, ioctl->DataPacket);
     451    ret = do_smart(unit, ATA_SMART_READ_VALUES, 0, 0, Far16ToFlat(ioctl->ioctl.pvData));
    508452    break;
    509453
    510454  case DSKSP_SMART_GET_THRESHOLDS:
    511     ret = do_smart(unit, ATA_SMART_READ_THRESHOLDS, 0, 0, ioctl->DataPacket);
     455    ret = do_smart(unit, ATA_SMART_READ_THRESHOLDS, 0, 0, Far16ToFlat(ioctl->ioctl.pvData));
    512456    break;
    513457
    514458  case DSKSP_SMART_GET_LOG:
    515     ret = do_smart(unit, ATA_SMART_READ_LOG, 1, parm, ioctl->DataPacket);
     459    ret = do_smart(unit, ATA_SMART_READ_LOG, 1, parm, Far16ToFlat(ioctl->ioctl.pvData));
    516460    break;
    517461
    518462  default:
    519     ret = STDON | STATUS_ERR_UNKCMD;
     463    ret = RPDONE | RPERR_BADCOMMAND;
    520464  }
    521465
     
    526470 * Perform SMART request. The code has been more or less copied from DANIS506.
    527471 */
    528 static USHORT do_smart(BYTE unit, BYTE sub_func, BYTE cnt, BYTE lba_l, void _far *buf)
     472static USHORT do_smart(BYTE unit, BYTE sub_func, BYTE cnt, BYTE lba_l, void *buf)
    529473{
    530474  OS2AHCI_PASSTHROUGH pt;
    531   RP_GENIOCTL ioctl;
     475  REQPACKET ioctl;
    532476  USHORT ret;
    533477  USHORT a;
     
    535479  USHORT d;
    536480
    537   if (map_unit(unit, &a, &p, &d)) {
    538     return(STDON | STERR | ERROR_I24_BAD_UNIT);
     481  if (map_unit(unit, &a, &p, &d))
     482  {
     483    return(RPDONE | RPERR_UNIT);
    539484  }
    540485
     
    543488   */
    544489  memset(&ioctl, 0x00, sizeof(ioctl));
    545   ioctl.Category   = OS2AHCI_IOCTL_CATEGORY;
    546   ioctl.Function   = OS2AHCI_IOCTL_PASSTHROUGH;
    547   ioctl.ParmPacket = (void _far *) &pt;
     490  ioctl.ioctl.bCategory   = OS2AHCI_IOCTL_CATEGORY;
     491  ioctl.ioctl.bFunction   = OS2AHCI_IOCTL_PASSTHROUGH;
     492  ioctl.ioctl.pvParm = FlatToFar16(&pt);
    548493
    549494  memset(&pt, 0x00, sizeof(pt));
     
    557502  pt.cmd.ata.cmd      = ATA_CMD_SMART;
    558503
    559   if (buf != NULL && sub_func != ATA_SMART_STATUS) {
     504  if (buf != NULL && sub_func != ATA_SMART_STATUS)
     505  {
    560506    pt.buflen         = 512;
    561     pt.buf            = lin(buf);
    562   }
    563 
    564   if (((ret = gen_ioctl(&ioctl)) & STERR) == 0 && sub_func == ATA_SMART_STATUS) {
    565 
     507    pt.buf            = buf;
     508  }
     509
     510  if (((ret = gen_ioctl(&ioctl)) & RPERR) == 0 && sub_func == ATA_SMART_STATUS)
     511  {
    566512    /* ATA_SMART_STATUS doesn't transfer anything but instead relies on the
    567513     * returned D2H FIS, mapped to the ATA CMD, to have a certain value
     
    569515     * the data buffer.
    570516     */
    571     if (((pt.cmd.ata.lba_l >> 8) & 0xffff) == 0xf42c) {
    572       *((ULONG _far *) buf) = 1;
     517    if (((pt.cmd.ata.lba_l >> 8) & 0xffff) == 0xf42c)
     518    {
     519      *((ULONG *) buf) = 1;
    573520    } else {
    574       *((ULONG _far *) buf) = 0;
     521      *((ULONG *) buf) = 0;
    575522    }
    576523  }
     
    585532 * ATA/ATAPI units sequentially.
    586533 */
    587 static int map_unit(BYTE unit, USHORT _far *a, USHORT _far *p, USHORT _far *d)
     534static int map_unit(BYTE unit, USHORT *a, USHORT *p, USHORT *d)
    588535{
    589536  USHORT _a;
     
    592539
    593540  /* map unit to adapter/port/device */
    594   for (_a = 0; _a < ad_info_cnt; _a++) {
     541  for (_a = 0; _a < ad_info_cnt; _a++)
     542  {
    595543    AD_INFO *ai = ad_infos + _a;
    596544
    597     for (_p = 0; _p <= ai->port_max; _p++) {
     545    for (_p = 0; _p <= ai->port_max; _p++)
     546    {
    598547      P_INFO *pi = ai->ports + _p;
    599548
    600       for (_d = 0; _d <= pi->dev_max; _d++) {
    601         if (pi->devs[_d].present) {
    602           if (unit-- == 0) {
     549      for (_d = 0; _d <= pi->dev_max; _d++)
     550      {
     551        if (pi->devs[_d].present)
     552        {
     553          if (unit-- == 0)
     554          {
    603555            /* found the device */
    604556            *a = _a;
     
    617569
    618570/******************************************************************************
    619  * Get linear address for specified virtual address.
    620  */
    621 static LIN lin(void _far *p)
    622 {
    623   LIN l;
    624 
    625   if (DevHelp_VirtToLin((SEL) ((ULONG) p >> 16), (USHORT) (ULONG) p, &l) != 0) {
    626     return(0);
    627   }
    628 
    629   return(l);
    630 }
    631 
    632 /******************************************************************************
    633571 * IORB notification routine; used to wake up the sleeping application thread
    634572 * when the IOCTL IORB is complete.
    635573 */
    636 IORBH _far * _far _cdecl ioctl_wakeup(IORBH _far *iorb)
    637 {
    638   USHORT awake_count;
    639 
    640   DevHelp_ProcRun((ULONG) iorb, &awake_count);
    641 
     574IORBH *IoctlWakeup(ULONG ulArg)
     575{
     576  KernWakeup(ulArg, 0, NULL, 0);
    642577  return(NULL);
    643578}
Note: See TracChangeset for help on using the changeset viewer.