Changeset 12508 in vbox
- Timestamp:
- Sep 16, 2008 4:52:11 PM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 36646
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmifs.h
r12476 r12508 643 643 * @thread Any thread. 644 644 */ 645 DECLR3CALLBACKMEMBER(int, pfnSendCmd,(PPDMIBLOCK pInterface, const uint8_t *pbCmd, PDMBLOCKTXDIR enmTxDir, void *pvBuf, size_t *pcbBuf, uint8_t *p bSenseKey, uint32_t cTimeoutMillies));645 DECLR3CALLBACKMEMBER(int, pfnSendCmd,(PPDMIBLOCK pInterface, const uint8_t *pbCmd, PDMBLOCKTXDIR enmTxDir, void *pvBuf, size_t *pcbBuf, uint8_t *pabSense, size_t cbSense, uint32_t cTimeoutMillies)); 646 646 647 647 /** -
trunk/src/VBox/Devices/Storage/ATAController.h
r11159 r12508 61 61 */ 62 62 #define ATA_UDMA_MODE_MAX 6 63 64 /** ATAPI sense info size. */ 65 #define ATAPI_SENSE_SIZE 64 63 66 64 67 /** The maximum number of release log entries per device. */ … … 149 152 /** ATAPI current command. */ 150 153 uint8_t aATAPICmd[ATAPI_PACKET_SIZE]; 151 /** ATAPI sense key. */ 152 uint8_t uATAPISenseKey; 153 /** ATAPI additional sense code. */ 154 uint8_t uATAPIASC; 154 /** ATAPI sense data. */ 155 uint8_t abATAPISense[ATAPI_SENSE_SIZE]; 155 156 /** HACK: Countdown till we report a newly unmounted drive as mounted. */ 156 157 uint8_t cNotifiedMediaChange; -
trunk/src/VBox/Devices/Storage/DevATA.cpp
r11582 r12508 28 28 29 29 /** 30 * The SSM saved state version .30 * The SSM saved state versions. 31 31 */ 32 #define ATA_SAVED_STATE_VERSION 16 32 #define ATA_SAVED_STATE_VERSION 17 33 #define ATA_SAVED_STATE_VERSION_WITHOUT_FULL_SENSE 16 33 34 34 35 … … 1213 1214 | (!s->cbTotalTransfer ? ATAPI_INT_REASON_CD : 0); 1214 1215 Log2(("%s: interrupt reason %#04x\n", __FUNCTION__, s->uATARegNSector)); 1215 s->uATAPISenseKey = SCSI_SENSE_NONE; 1216 s->uATAPIASC = SCSI_ASC_NONE; 1217 } 1218 1219 1220 static void atapiCmdError(ATADevState *s, uint8_t uATAPISenseKey, uint8_t uATAPIASC) 1221 { 1222 Log(("%s: sense=%#x asc=%#x\n", __FUNCTION__, uATAPISenseKey, uATAPIASC)); 1223 s->uATARegError = uATAPISenseKey << 4; 1216 1217 memset(s->abATAPISense, '\0', sizeof(s->abATAPISense)); 1218 s->abATAPISense[0] = 0x70 | (1 << 7); 1219 s->abATAPISense[7] = 10; 1220 } 1221 1222 1223 static void atapiCmdError(ATADevState *s, const uint8_t *pabATAPISense, size_t cbATAPISense) 1224 { 1225 Log(("%s: sense=%#x asc=%#x\n", __FUNCTION__, pabATAPISense[2] & 0x0f, pabATAPISense[12])); 1226 s->uATARegError = pabATAPISense[2] << 4; 1224 1227 ataSetStatusValue(s, ATA_STAT_READY | ATA_STAT_ERR); 1225 1228 s->uATARegNSector = (s->uATARegNSector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 1226 1229 Log2(("%s: interrupt reason %#04x\n", __FUNCTION__, s->uATARegNSector)); 1227 s->uATAPISenseKey = uATAPISenseKey;1228 s->uATAPIASC = uATAPIASC;1230 memset(s->abATAPISense, '\0', sizeof(s->abATAPISense)); 1231 memcpy(s->abATAPISense, pabATAPISense, RT_MIN(cbATAPISense, sizeof(s->abATAPISense))); 1229 1232 s->cbTotalTransfer = 0; 1230 1233 s->cbElementaryTransfer = 0; … … 1234 1237 s->iBeginTransfer = ATAFN_BT_NULL; 1235 1238 s->iSourceSink = ATAFN_SS_NULL; 1239 } 1240 1241 1242 /** @todo deprecated function - doesn't provide enough info. Replace by direct 1243 * calls to atapiCmdError() with full data. */ 1244 static void atapiCmdErrorSimple(ATADevState *s, uint8_t uATAPISenseKey, uint8_t uATAPIASC) 1245 { 1246 uint8_t abATAPISense[ATAPI_SENSE_SIZE]; 1247 memset(abATAPISense, '\0', sizeof(abATAPISense)); 1248 abATAPISense[0] = 0x70 | (1 << 7); 1249 abATAPISense[2] = uATAPISenseKey & 0x0f; 1250 abATAPISense[7] = 10; 1251 abATAPISense[12] = uATAPIASC; 1252 atapiCmdError(s, abATAPISense, sizeof(abATAPISense)); 1236 1253 } 1237 1254 … … 1278 1295 if (RT_FAILURE(rc)) 1279 1296 { 1280 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_NONE);1297 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_NONE); 1281 1298 return; 1282 1299 } … … 1397 1414 if (s->cErrors++ < MAX_LOG_REL_ERRORS) 1398 1415 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM read error, %d sectors at LBA %d\n", s->iLUN, cSectors, s->iATAPILBA)); 1399 atapiCmdError (s, SCSI_SENSE_MEDIUM_ERROR, SCSI_ASC_READ_ERROR);1416 atapiCmdErrorSimple(s, SCSI_SENSE_MEDIUM_ERROR, SCSI_ASC_READ_ERROR); 1400 1417 } 1401 1418 return false; … … 1407 1424 PATACONTROLLER pCtl = ATADEVSTATE_2_CONTROLLER(s); 1408 1425 int rc = VINF_SUCCESS; 1409 uint8_t uATAPISenseKey;1426 uint8_t abATAPISense[ATAPI_SENSE_SIZE]; 1410 1427 size_t cbTransfer; 1411 1428 PSTAMPROFILEADV pProf = NULL; … … 1470 1487 if (s->cErrors++ < MAX_LOG_REL_ERRORS) 1471 1488 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough split error\n", s->iLUN)); 1472 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);1489 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE); 1473 1490 { 1474 1491 STAM_PROFILE_START(&pCtl->StatLockWait, a); … … 1509 1526 break; 1510 1527 } 1511 rc = s->pDrvBlock->pfnSendCmd(s->pDrvBlock, aATAPICmd, (PDMBLOCKTXDIR)s->uTxDir, pbBuf, &cbCurrTX, &uATAPISenseKey, 30000 /**< @todo timeout */);1528 rc = s->pDrvBlock->pfnSendCmd(s->pDrvBlock, aATAPICmd, (PDMBLOCKTXDIR)s->uTxDir, pbBuf, &cbCurrTX, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */); 1512 1529 if (rc != VINF_SUCCESS) 1513 1530 break; … … 1517 1534 } 1518 1535 else 1519 rc = s->pDrvBlock->pfnSendCmd(s->pDrvBlock, s->aATAPICmd, (PDMBLOCKTXDIR)s->uTxDir, s->CTX_SUFF(pbIOBuffer), &cbTransfer, &uATAPISenseKey, 30000 /**< @todo timeout */);1536 rc = s->pDrvBlock->pfnSendCmd(s->pDrvBlock, s->aATAPICmd, (PDMBLOCKTXDIR)s->uTxDir, s->CTX_SUFF(pbIOBuffer), &cbTransfer, abATAPISense, sizeof(abATAPISense), 30000 /**< @todo timeout */); 1520 1537 if (pProf) { STAM_PROFILE_ADV_STOP(pProf, b); } 1521 1538 … … 1580 1597 break; 1581 1598 s->cErrors++; 1582 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough command (%#04x) error %d %Rrc\n", s->iLUN, u8Cmd, uATAPISenseKey, rc));1599 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough command (%#04x) error %d %Rrc\n", s->iLUN, u8Cmd, abATAPISense[2] & 0x0f, rc)); 1583 1600 } while (0); 1584 1601 } 1585 atapiCmdError(s, uATAPISenseKey, 0); 1586 /* This is a drive-reported error. atapiCmdError() sets both the error 1587 * error code in the ATA error register and in s->uATAPISenseKey. The 1588 * former is correct, the latter is not. Otherwise the drive would not 1589 * get the next REQUEST SENSE command which is necessary to clear the 1590 * error status of the drive. Easy fix: clear s->uATAPISenseKey. */ 1591 s->uATAPISenseKey = SCSI_SENSE_NONE; 1592 s->uATAPIASC = SCSI_ASC_NONE; 1602 atapiCmdError(s, abATAPISense, sizeof(abATAPISense)); 1593 1603 } 1594 1604 return false; … … 1655 1665 if ((s->aATAPICmd[1] & 0x03) != 1 || ataBE2H_U32(&s->aATAPICmd[2]) != 1) 1656 1666 { 1657 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);1667 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 1658 1668 return false; 1659 1669 } … … 1684 1694 if ((s->aATAPICmd[1] & 0x03) == 3 || ataBE2H_U16(&s->aATAPICmd[2]) != 0) 1685 1695 { 1686 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);1696 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 1687 1697 return false; 1688 1698 } … … 1819 1829 1820 1830 Assert(s->uTxDir == PDMBLOCKTXDIR_FROM_DEVICE); 1821 Assert(s->cbElementaryTransfer <= 18); 1822 memset(pbBuf, 0, 18); 1823 pbBuf[0] = 0x70 | (1 << 7); 1824 pbBuf[2] = s->uATAPISenseKey; 1825 pbBuf[7] = 10; 1826 pbBuf[12] = s->uATAPIASC; 1831 memset(pbBuf, '\0', s->cbElementaryTransfer); 1832 memcpy(pbBuf, s->abATAPISense, RT_MIN(s->cbElementaryTransfer, sizeof(s->abATAPISense))); 1827 1833 s->iSourceSink = ATAFN_SS_NULL; 1828 1834 atapiCmdOK(s); … … 1861 1867 if (iStartTrack > 1 && iStartTrack != 0xaa) 1862 1868 { 1863 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);1869 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 1864 1870 return false; 1865 1871 } … … 2045 2051 { 2046 2052 if (s->cNotifiedMediaChange-- > 2) 2047 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2053 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2048 2054 else 2049 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2055 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2050 2056 } 2051 2057 else if (s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2052 2058 atapiCmdOK(s); 2053 2059 else 2054 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2060 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2055 2061 break; 2056 2062 case SCSI_MODE_SENSE_10: … … 2081 2087 default: 2082 2088 case SCSI_PAGECONTROL_SAVED: 2083 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_SAVING_PARAMETERS_NOT_SUPPORTED);2089 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_SAVING_PARAMETERS_NOT_SUPPORTED); 2084 2090 break; 2085 2091 } … … 2100 2106 } 2101 2107 else 2102 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2108 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2103 2109 break; 2104 2110 case SCSI_READ_10: … … 2110 2116 { 2111 2117 s->cNotifiedMediaChange-- ; 2112 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2118 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2113 2119 break; 2114 2120 } 2115 2121 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2116 2122 { 2117 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2123 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2118 2124 break; 2119 2125 } … … 2140 2146 uLastLogTS = RTTimeMilliTS(); 2141 2147 } 2142 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR);2148 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR); 2143 2149 break; 2144 2150 } … … 2153 2159 { 2154 2160 s->cNotifiedMediaChange-- ; 2155 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2161 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2156 2162 break; 2157 2163 } 2158 2164 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2159 2165 { 2160 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2166 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2161 2167 break; 2162 2168 } … … 2180 2186 uLastLogTS = RTTimeMilliTS(); 2181 2187 } 2182 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR);2188 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR); 2183 2189 break; 2184 2190 } … … 2199 2205 default: 2200 2206 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM sector format not supported\n", s->iLUN)); 2201 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);2207 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 2202 2208 break; 2203 2209 } … … 2210 2216 { 2211 2217 s->cNotifiedMediaChange-- ; 2212 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2218 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2213 2219 break; 2214 2220 } 2215 2221 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2216 2222 { 2217 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2223 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2218 2224 break; 2219 2225 } … … 2231 2237 uLastLogTS = RTTimeMilliTS(); 2232 2238 } 2233 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR);2239 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR); 2234 2240 break; 2235 2241 } … … 2272 2278 atapiCmdOK(s); 2273 2279 else 2274 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIA_LOAD_OR_EJECT_FAILED);2280 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIA_LOAD_OR_EJECT_FAILED); 2275 2281 } 2276 2282 break; … … 2288 2294 { 2289 2295 s->cNotifiedMediaChange-- ; 2290 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2296 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2291 2297 break; 2292 2298 } 2293 2299 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2294 2300 { 2295 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2301 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2296 2302 break; 2297 2303 } … … 2314 2320 default: 2315 2321 error_cmd: 2316 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);2322 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 2317 2323 break; 2318 2324 } … … 2323 2329 { 2324 2330 s->cNotifiedMediaChange-- ; 2325 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2331 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2326 2332 break; 2327 2333 } 2328 2334 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2329 2335 { 2330 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2336 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2331 2337 break; 2332 2338 } … … 2337 2343 { 2338 2344 s->cNotifiedMediaChange-- ; 2339 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2345 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2340 2346 break; 2341 2347 } 2342 2348 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2343 2349 { 2344 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2350 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2345 2351 break; 2346 2352 } … … 2352 2358 { 2353 2359 s->cNotifiedMediaChange-- ; 2354 atapiCmdError (s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */2360 atapiCmdErrorSimple(s, SCSI_SENSE_UNIT_ATTENTION, SCSI_ASC_MEDIUM_MAY_HAVE_CHANGED); /* media changed */ 2355 2361 break; 2356 2362 } 2357 2363 else if (!s->pDrvMount->pfnIsMounted(s->pDrvMount)) 2358 2364 { 2359 atapiCmdError (s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT);2365 atapiCmdErrorSimple(s, SCSI_SENSE_NOT_READY, SCSI_ASC_MEDIUM_NOT_PRESENT); 2360 2366 break; 2361 2367 } … … 2373 2379 break; 2374 2380 default: 2375 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);2381 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE); 2376 2382 break; 2377 2383 } … … 2522 2528 case SCSI_REQUEST_SENSE: 2523 2529 cbTransfer = pbPacket[4]; 2524 if ( s->uATAPISenseKey!= SCSI_SENSE_NONE)2530 if ((s->abATAPISense[2] & 0x0f) != SCSI_SENSE_NONE) 2525 2531 { 2526 2532 ataStartTransfer(s, RT_MIN(cbTransfer, 18), PDMBLOCKTXDIR_FROM_DEVICE, ATAFN_BT_ATAPI_CMD, ATAFN_SS_ATAPI_REQUEST_SENSE, true); … … 2623 2629 case 0x0f: /* activate deferred microcode */ 2624 2630 LogRel(("PIIX3 ATA: LUN#%d: CD-ROM passthrough command attempted to update firmware, blocked\n", s->iLUN)); 2625 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);2631 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 2626 2632 break; 2627 2633 default: … … 2641 2647 * opcode 0x01" in syslog) and replies with a sense code of 0, 2642 2648 * which sends cdrecord to an endless loop. */ 2643 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);2649 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE); 2644 2650 break; 2645 2651 default: 2646 2652 LogRel(("PIIX3 ATA: LUN#%d: passthrough unimplemented for command %#x\n", s->iLUN, pbPacket[0])); 2647 atapiCmdError (s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);2653 atapiCmdErrorSimple(s, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE); 2648 2654 break; 2649 2655 sendcmd: … … 5355 5361 SSMR3PutU32(pSSMHandle, pThis->aCts[i].aIfs[j].cbATAPISector); 5356 5362 SSMR3PutMem(pSSMHandle, &pThis->aCts[i].aIfs[j].aATAPICmd, sizeof(pThis->aCts[i].aIfs[j].aATAPICmd)); 5357 SSMR3PutU8(pSSMHandle, pThis->aCts[i].aIfs[j].uATAPISenseKey); 5358 SSMR3PutU8(pSSMHandle, pThis->aCts[i].aIfs[j].uATAPIASC); 5363 SSMR3PutMem(pSSMHandle, &pThis->aCts[i].aIfs[j].abATAPISense, sizeof(pThis->aCts[i].aIfs[j].abATAPISense)); 5359 5364 SSMR3PutU8(pSSMHandle, pThis->aCts[i].aIfs[j].cNotifiedMediaChange); 5360 5365 SSMR3PutMem(pSSMHandle, &pThis->aCts[i].aIfs[j].Led, sizeof(pThis->aCts[i].aIfs[j].Led)); … … 5386 5391 uint32_t u32; 5387 5392 5388 if (u32Version != ATA_SAVED_STATE_VERSION) 5393 if ( u32Version != ATA_SAVED_STATE_VERSION 5394 && u32Version != ATA_SAVED_STATE_VERSION_WITHOUT_FULL_SENSE) 5389 5395 { 5390 5396 AssertMsgFailed(("u32Version=%d\n", u32Version)); … … 5460 5466 SSMR3GetU32(pSSMHandle, &pThis->aCts[i].aIfs[j].cbATAPISector); 5461 5467 SSMR3GetMem(pSSMHandle, &pThis->aCts[i].aIfs[j].aATAPICmd, sizeof(pThis->aCts[i].aIfs[j].aATAPICmd)); 5462 SSMR3GetU8(pSSMHandle, &pThis->aCts[i].aIfs[j].uATAPISenseKey); 5463 SSMR3GetU8(pSSMHandle, &pThis->aCts[i].aIfs[j].uATAPIASC); 5468 if (u32Version != ATA_SAVED_STATE_VERSION_WITHOUT_FULL_SENSE) 5469 { 5470 SSMR3GetMem(pSSMHandle, pThis->aCts[i].aIfs[j].abATAPISense, sizeof(pThis->aCts[i].aIfs[j].abATAPISense)); 5471 } 5472 else 5473 { 5474 uint8_t uATAPISenseKey, uATAPIASC; 5475 memset(pThis->aCts[i].aIfs[j].abATAPISense, '\0', sizeof(pThis->aCts[i].aIfs[j].abATAPISense)); 5476 pThis->aCts[i].aIfs[j].abATAPISense[0] = 0x70 | (1 << 7); 5477 pThis->aCts[i].aIfs[j].abATAPISense[7] = 10; 5478 SSMR3GetU8(pSSMHandle, &uATAPISenseKey); 5479 SSMR3GetU8(pSSMHandle, &uATAPIASC); 5480 pThis->aCts[i].aIfs[j].abATAPISense[2] = uATAPISenseKey & 0x0f; 5481 pThis->aCts[i].aIfs[j].abATAPISense[12] = uATAPIASC; 5482 } 5483 /** @todo triple-check this hack after passthrough is working */ 5464 5484 SSMR3GetU8(pSSMHandle, &pThis->aCts[i].aIfs[j].cNotifiedMediaChange); 5465 5485 SSMR3GetMem(pSSMHandle, &pThis->aCts[i].aIfs[j].Led, sizeof(pThis->aCts[i].aIfs[j].Led)); -
trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
r12125 r12508 393 393 394 394 /** @copydoc PDMIBLOCK::pfnSendCmd */ 395 static int drvHostDvdSendCmd(PPDMIBLOCK pInterface, const uint8_t *pbCmd, PDMBLOCKTXDIR enmTxDir, void *pvBuf, size_t *pcbBuf, 396 uint8_t *pbStat, uint32_t cTimeoutMillies) 395 static int drvHostDvdSendCmd(PPDMIBLOCK pInterface, const uint8_t *pbCmd, 396 PDMBLOCKTXDIR enmTxDir, void *pvBuf, size_t *pcbBuf, 397 uint8_t *pabSense, size_t cbSense, uint32_t cTimeoutMillies) 397 398 { 398 399 PDRVHOSTBASE pThis = PDMIBLOCK_2_DRVHOSTBASE(pInterface); … … 407 408 if (enmTxDir == PDMBLOCKTXDIR_FROM_DEVICE) 408 409 memset(pvBuf, '\0', *pcbBuf); /* we got read size, but zero it anyway. */ 409 uint8_t abSense[32]; 410 rc = DRVHostBaseScsiCmd(pThis, pbCmd, 12, PDMBLOCKTXDIR_FROM_DEVICE, pvBuf, pcbBuf, abSense, sizeof(abSense), cTimeoutMillies); 410 rc = DRVHostBaseScsiCmd(pThis, pbCmd, 12, PDMBLOCKTXDIR_FROM_DEVICE, pvBuf, pcbBuf, pabSense, cbSense, cTimeoutMillies); 411 411 if (rc == VERR_UNRESOLVED_ERROR) 412 {413 *pbStat = abSense[2] & 0x0f;414 412 rc = VINF_SUCCESS; 415 }416 413 417 414 #elif defined(RT_OS_L4) … … 455 452 cgc.buflen = *pcbBuf; 456 453 cgc.stat = 0; 457 cgc.sense = &sense; 454 Assert(cbSense >= sizeof(struct request_sense)); 455 cgc.sense = (struct request_sense *)pabSense; 458 456 cgc.data_direction = direction; 459 457 cgc.quiet = false; … … 468 466 else 469 467 { 468 rc = RTErrConvertFromErrno(errno); 470 469 if (rc == VERR_ACCESS_DENIED && cgc.sense->sense_key == SCSI_SENSE_NONE) 471 470 cgc.sense->sense_key = SCSI_SENSE_ILLEGAL_REQUEST; 472 *pbStat = cgc.sense->sense_key;473 rc = RTErrConvertFromErrno(errno);474 471 Log2(("%s: error status %d, rc=%Rrc\n", __FUNCTION__, cgc.stat, rc)); 475 472 } … … 513 510 AssertMsgFailedReturn(("%d\n", enmTxDir), VERR_INTERNAL_ERROR); 514 511 } 515 char aSense[32];516 512 usc.uscsi_flags |= USCSI_RQENABLE; 517 usc.uscsi_rqbuf = aSense;518 usc.uscsi_rqlen = 32;513 usc.uscsi_rqbuf = pabSense; 514 usc.uscsi_rqlen = cbSense; 519 515 usc.uscsi_cdb = (caddr_t)&scdb; 520 516 usc.uscsi_cdblen = 12; … … 539 535 if (usc.uscsi_status) 540 536 { 541 *pbStat = aSense[2] & 0x0f;542 537 rc = RTErrConvertFromErrno(errno); 543 538 Log2(("%s: error status. rc=%Rrc\n", __FUNCTION__, rc)); 544 539 } 545 else546 *pbStat = SCSI_SENSE_NONE;547 540 } 548 541 Log2(("%s: after ioctl: residual buflen=%d original buflen=%d\n", __FUNCTION__, usc.uscsi_resid, usc.uscsi_buflen)); … … 589 582 Req.spt.DataIn = direction; 590 583 Req.spt.TimeOutValue = (cTimeoutMillies + 999) / 1000; /* Convert to seconds */ 591 Req.spt.SenseInfoLength = sizeof(Req.aSense); 584 Assert(cbSense <= sizeof(Req.aSense)) 585 Req.spt.SenseInfoLength = cbSense; 592 586 Req.spt.SenseInfoOffset = RT_OFFSETOF(struct _REQ, aSense); 593 587 if (DeviceIoControl((HANDLE)pThis->FileDevice, IOCTL_SCSI_PASS_THROUGH_DIRECT, … … 595 589 { 596 590 if (cbReturned > RT_OFFSETOF(struct _REQ, aSense)) 597 *pbStat = Req.aSense[2] & 0x0f;591 memcpy(pabSense, Req.aSense, cbSense); 598 592 else 599 *pbStat = SCSI_SENSE_NONE;593 memset(pabSense, '\0', cbSense); 600 594 /* Windows shares the property of not properly reflecting the actually 601 595 * transferred data size. See above. Assume that everything worked ok. */
Note:
See TracChangeset
for help on using the changeset viewer.