Changeset 178 for trunk/src/os2ahci/ioctl.c
- Timestamp:
- Nov 29, 2016, 5:30:22 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/os2ahci/ioctl.c
r165 r178 4 4 * Copyright (c) 2011 thi.guten Software Development 5 5 * Copyright (c) 2011 Mensys B.V. 6 * Copyright (c) 2013-2016 David Azarewicz 6 7 * 7 8 * Authors: Christian Mueller, Markus Thielen … … 54 55 SCATGATENTRY sg_lst[AHCI_MAX_SG / 2]; /* scatter/gather list */ 55 56 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() */ 57 58 } IOCTL_CONTEXT; 58 59 … … 60 61 61 62 static 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); 64 static int map_unit (BYTE unit, USHORT *a, USHORT *p, 65 USHORT *d); 66 67 IORBH *IoctlWakeup(ULONG ulArg); 68 extern IORBH FAR16DATA * __far16 IoctlWakeup16(IORBH FAR16DATA*); 68 69 69 70 /* ------------------------ global/static variables ------------------------ */ … … 75 76 * adapter/port/device combinations are available. 76 77 */ 77 USHORT ioctl_get_devlist(R P_GENIOCTL _far*ioctl)78 { 79 OS2AHCI_DEVLIST _far *devlst = (OS2AHCI_DEVLIST _far *) ioctl->DataPacket;78 USHORT ioctl_get_devlist(REQPACKET *ioctl) 79 { 80 OS2AHCI_DEVLIST *devlst = (OS2AHCI_DEVLIST*)Far16ToFlat(ioctl->ioctl.pvData); 80 81 USHORT maxcnt = 0; 81 82 USHORT cnt = 0; … … 84 85 USHORT d; 85 86 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); 103 90 } 104 91 105 92 /* fill-in device list */ 106 for (a = 0; a < ad_info_cnt; a++) { 93 for (a = 0; a < ad_info_cnt; a++) 94 { 107 95 AD_INFO *ai = ad_infos + a; 108 96 109 for (p = 0; p <= ai->port_max; p++) { 97 for (p = 0; p <= ai->port_max; p++) 98 { 110 99 P_INFO *pi = ai->ports + p; 111 100 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 { 114 105 /* add this device to the device list */ 115 if (cnt >= maxcnt) { 106 if (cnt >= maxcnt) 107 { 116 108 /* not enough room in devlst */ 117 109 goto ioctl_get_device_done; … … 136 128 ioctl_get_device_done: 137 129 devlst->cnt = cnt; 138 return( STDON);130 return(RPDONE); 139 131 } 140 132 … … 143 135 * requests. 144 136 */ 145 USHORT ioctl_passthrough(R P_GENIOCTL _far*ioctl)146 { 147 OS2AHCI_PASSTHROUGH _far *req = (OS2AHCI_PASSTHROUGH _far *) ioctl->ParmPacket;148 char _far *sense_buf = (char _far *) ioctl->DataPacket;137 USHORT ioctl_passthrough(REQPACKET *ioctl) 138 { 139 OS2AHCI_PASSTHROUGH *req = (OS2AHCI_PASSTHROUGH *)Far16ToFlat(ioctl->ioctl.pvParm); 140 char *sense_buf = (char *)Far16ToFlat(ioctl->ioctl.pvData); 149 141 IOCTL_CONTEXT *ic; 150 142 USHORT ret; … … 152 144 USHORT p; 153 145 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 }172 146 173 147 /* Verify basic request parameters such as adapter/port/device, size of … … 178 152 d = req->device; 179 153 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); 182 157 } 183 158 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); 186 162 } 187 163 188 164 /* 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); 191 168 } 192 169 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 }204 170 205 171 /* fill in adapter passthrough fields */ … … 210 176 ic->iorb.iorbh.RequestControl = IORB_ASYNC_POST; 211 177 ic->iorb.iorbh.Timeout = req->timeout; 212 ic->iorb.iorbh.NotifyAddress = ioctl_wakeup;213 214 ic->iorb.cSGList 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); 217 183 218 184 memcpy(ic->cmd, req->cmd.cdb, sizeof(ic->cmd)); 219 185 ic->iorb.ControllerCmdLen = req->cmdlen; 220 ic->iorb.pControllerCmd = ic->cmd;186 ic->iorb.pControllerCmd = MemFar16Adr(ic->cmd); 221 187 ic->iorb.Flags = (req->flags & PT_WRITE) ? 0 : PT_DIRECTION_IN; 222 188 223 if (req->sense_len > 0) { 189 if (req->sense_len > 0) 190 { 224 191 /* 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)); 226 193 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; 228 195 ic->ssb.ReqSenseLen = sizeof(ic->sense); 229 196 ic->iorb.iorbh.RequestControl |= IORB_REQ_STATUSBLOCK; … … 231 198 232 199 /* send IORB on its way */ 233 add_entry( &ic->iorb.iorbh);200 add_entry(MemFar16Adr(&ic->iorb.iorbh)); 234 201 235 202 /* Wait for IORB completion. */ 236 203 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); 239 207 } 240 208 spin_unlock(drv_lock); 241 209 242 ret = STDON;210 ret = RPDONE; 243 211 244 212 /* 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 { 250 219 case IOERR_UNIT_NOT_READY: 251 ret |= ERROR_I24_NOT_READY;220 ret |= RPERR_NOTREADY; 252 221 break; 253 222 254 223 case IOERR_MEDIA_CHANGED: 255 ret |= ERROR_I24_DISK_CHANGE;224 ret |= RPERR_DISK; 256 225 break; 257 226 258 227 case IOERR_MEDIA: 259 228 case IOERR_MEDIA_NOT_FORMATTED: 260 ret |= ERROR_I24_CRC;229 ret |= RPERR_CRC; 261 230 break; 262 231 263 232 case IOERR_CMD_SYNTAX: 264 233 case IOERR_CMD_NOT_SUPPORTED: 265 ret |= ERROR_I24_BAD_COMMAND;234 ret |= RPERR_BADCOMMAND; 266 235 break; 267 236 268 237 case IOERR_MEDIA_WRITE_PROTECT: 269 ret |= ERROR_I24_WRITE_PROTECT;238 ret |= RPERR_PROTECT; 270 239 break; 271 240 272 241 case IOERR_CMD_ABORTED: 273 ret |= ERROR_I24_CHAR_CALL_INTERRUPTED;242 ret |= RPERR_INTERRUPTED; 274 243 break; 275 244 276 245 case IOERR_RBA_ADDRESSING_ERROR: 277 ret |= ERROR_I24_SEEK;246 ret |= RPERR_SEEK; 278 247 break; 279 248 280 249 case IOERR_RBA_LIMIT: 281 ret |= ERROR_I24_SECTOR_NOT_FOUND;250 ret |= RPERR_SECTOR; 282 251 break; 283 252 284 253 case IOERR_CMD_SGLIST_BAD: 285 ret |= ERROR_I24_INVALID_PARAMETER;254 ret |= RPERR_PARAMETER; 286 255 break; 287 256 … … 292 261 case IOERR_CMD_SW_RESOURCE: 293 262 default: 294 ret |= ERROR_I24_GEN_FAILURE;263 ret |= RPERR_GENERAL; 295 264 break; 296 265 } … … 298 267 /* copy sense information, if there is any */ 299 268 if ((ic->iorb.iorbh.Status & IORB_STATUSBLOCK_AVAIL) && 300 (ic->ssb.Flags | STATUS_SENSEDATA_VALID)) {301 memcpy(sense_buf, ic->ssb.SenseData,302 269 (ic->ssb.Flags | STATUS_SENSEDATA_VALID)) 270 { 271 memcpy(sense_buf, ic->ssb.SenseData, min(ic->ssb.ReqSenseLen, req->sense_len)); 303 272 } 304 273 305 } else if ((req->flags & PT_ATAPI) == 0) { 274 } 275 else if ((req->flags & PT_ATAPI) == 0) 276 { 306 277 /* Copy ATA cmd back to IOCTL request (ATA commands are effectively 307 278 * registers which are sometimes used to indicate return conditions, … … 311 282 } 312 283 313 free(ic); 314 if (req->buflen > 0) { 315 DevHelp_VMUnLock(lin(ic->lh)); 316 } 284 MemFree(ic); 317 285 return(ret); 318 286 } … … 325 293 * point, basically those calls required to get HDMON working. 326 294 */ 327 USHORT ioctl_gen_dsk(R P_GENIOCTL _far*ioctl)328 { 329 DSKSP_CommandParameters _far *cp = (DSKSP_CommandParameters _far *) ioctl->ParmPacket;330 UnitInformationData _far*ui;295 USHORT ioctl_gen_dsk(REQPACKET *ioctl) 296 { 297 DSKSP_CommandParameters *cp = (DSKSP_CommandParameters*)Far16ToFlat(ioctl->ioctl.pvParm); 298 UnitInformationData *ui; 331 299 OS2AHCI_PASSTHROUGH pt; 332 R P_GENIOCTLtmp_ioctl;300 REQPACKET tmp_ioctl; 333 301 USHORT size = 0; 334 302 USHORT ret; … … 338 306 UCHAR unit; 339 307 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 }347 308 unit = cp->byPhysicalUnit; 348 309 349 310 /* verify addressability of data buffer (depends on function code) */ 350 switch (ioctl-> Function) {351 311 switch (ioctl->ioctl.bFunction) 312 { 352 313 case DSKSP_GEN_GET_COUNTERS: 353 314 size = sizeof(DeviceCountersData); … … 363 324 } 364 325 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); 375 329 } 376 330 377 331 /* execute generic disk request */ 378 switch (ioctl-> Function) {379 332 switch (ioctl->ioctl.bFunction) 333 { 380 334 case DSKSP_GEN_GET_COUNTERS: 381 335 /* Not supported, yet; we would need dynamically allocated device … … 383 337 * statistics buffer. For the time being, we'll return an empty buffer. 384 338 */ 385 memset( ioctl->DataPacket, 0x00, sizeof(DeviceCountersData));386 ret = STDON;339 memset(Far16ToFlat(ioctl->ioctl.pvData), 0x00, sizeof(DeviceCountersData)); 340 ret = RPDONE; 387 341 break; 388 342 … … 391 345 * even bother returning those. 392 346 */ 393 ui = (UnitInformationData _far *) ioctl->DataPacket;347 ui = (UnitInformationData*)Far16ToFlat(ioctl->ioctl.pvData); 394 348 memset(ui, 0x00, sizeof(*ui)); 395 349 … … 402 356 ui->wFlags |= UIF_SATA; 403 357 404 ret = STDON;358 ret = RPDONE; 405 359 break; 406 360 … … 408 362 /* return ATA ID buffer */ 409 363 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); 413 367 414 368 memset(&pt, 0x00, sizeof(pt)); … … 420 374 ATA_CMD_ID_ATAPI : ATA_CMD_ID_ATA; 421 375 pt.buflen = size; 422 pt.buf = lin(ioctl->DataPacket);376 pt.buf = Far16ToFlat(ioctl->ioctl.pvData); 423 377 424 378 ret = gen_ioctl(&tmp_ioctl); … … 426 380 427 381 default: 428 ret = STDON | STATUS_ERR_UNKCMD;382 ret = RPDONE | RPERR_BADCOMMAND; 429 383 break; 430 384 } … … 437 391 * IBM1S506; the code has been more or less copied from DANIS506. 438 392 */ 439 USHORT ioctl_smart(R P_GENIOCTL _far*ioctl)440 { 441 DSKSP_CommandParameters _far *cp = (DSKSP_CommandParameters _far *) ioctl->ParmPacket;393 USHORT ioctl_smart(REQPACKET *ioctl) 394 { 395 DSKSP_CommandParameters *cp = (DSKSP_CommandParameters *)Far16ToFlat(ioctl->ioctl.pvParm); 442 396 USHORT size = 0; 443 397 USHORT ret; … … 445 399 UCHAR parm; 446 400 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 }454 401 unit = cp->byPhysicalUnit; 455 402 456 403 /* verify addressability of data buffer (depends on SMART function) */ 457 switch (ioctl->Function) { 404 switch (ioctl->ioctl.bFunction) 405 { 458 406 459 407 case DSKSP_SMART_GETSTATUS: … … 468 416 } 469 417 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); 477 421 } 478 422 479 423 /* execute SMART request */ 480 switch (ioctl-> Function) {481 424 switch (ioctl->ioctl.bFunction) 425 { 482 426 case DSKSP_SMART_ONOFF: 483 427 ret = do_smart(unit, (BYTE) ((parm) ? ATA_SMART_ENABLE : ATA_SMART_DISABLE), 0, 0, NULL); … … 501 445 502 446 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)); 504 448 break; 505 449 506 450 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)); 508 452 break; 509 453 510 454 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)); 512 456 break; 513 457 514 458 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)); 516 460 break; 517 461 518 462 default: 519 ret = STDON | STATUS_ERR_UNKCMD;463 ret = RPDONE | RPERR_BADCOMMAND; 520 464 } 521 465 … … 526 470 * Perform SMART request. The code has been more or less copied from DANIS506. 527 471 */ 528 static USHORT do_smart(BYTE unit, BYTE sub_func, BYTE cnt, BYTE lba_l, void _far*buf)472 static USHORT do_smart(BYTE unit, BYTE sub_func, BYTE cnt, BYTE lba_l, void *buf) 529 473 { 530 474 OS2AHCI_PASSTHROUGH pt; 531 R P_GENIOCTLioctl;475 REQPACKET ioctl; 532 476 USHORT ret; 533 477 USHORT a; … … 535 479 USHORT d; 536 480 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); 539 484 } 540 485 … … 543 488 */ 544 489 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); 548 493 549 494 memset(&pt, 0x00, sizeof(pt)); … … 557 502 pt.cmd.ata.cmd = ATA_CMD_SMART; 558 503 559 if (buf != NULL && sub_func != ATA_SMART_STATUS) { 504 if (buf != NULL && sub_func != ATA_SMART_STATUS) 505 { 560 506 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 { 566 512 /* ATA_SMART_STATUS doesn't transfer anything but instead relies on the 567 513 * returned D2H FIS, mapped to the ATA CMD, to have a certain value … … 569 515 * the data buffer. 570 516 */ 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; 573 520 } else { 574 *((ULONG _far*) buf) = 0;521 *((ULONG *) buf) = 0; 575 522 } 576 523 } … … 585 532 * ATA/ATAPI units sequentially. 586 533 */ 587 static int map_unit(BYTE unit, USHORT _far *a, USHORT _far *p, USHORT _far*d)534 static int map_unit(BYTE unit, USHORT *a, USHORT *p, USHORT *d) 588 535 { 589 536 USHORT _a; … … 592 539 593 540 /* 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 { 595 543 AD_INFO *ai = ad_infos + _a; 596 544 597 for (_p = 0; _p <= ai->port_max; _p++) { 545 for (_p = 0; _p <= ai->port_max; _p++) 546 { 598 547 P_INFO *pi = ai->ports + _p; 599 548 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 { 603 555 /* found the device */ 604 556 *a = _a; … … 617 569 618 570 /****************************************************************************** 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 /******************************************************************************633 571 * IORB notification routine; used to wake up the sleeping application thread 634 572 * when the IOCTL IORB is complete. 635 573 */ 636 IORBH _far * _far _cdecl ioctl_wakeup(IORBH _far *iorb) 637 { 638 USHORT awake_count; 639 640 DevHelp_ProcRun((ULONG) iorb, &awake_count); 641 574 IORBH *IoctlWakeup(ULONG ulArg) 575 { 576 KernWakeup(ulArg, 0, NULL, 0); 642 577 return(NULL); 643 578 }
Note:
See TracChangeset
for help on using the changeset viewer.