Changeset 76074 in vbox
- Timestamp:
- Dec 8, 2018 9:46:20 PM (6 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
r75111 r76074 323 323 DEV_BT_958D = 0, /* BusLogic BT-958D, PCI. */ 324 324 DEV_BT_545C = 1, /* BusLogic BT-545C, ISA. */ 325 DEV_AHA_1540 C = 2 /* Adaptec AHA-1540C, ISA. */325 DEV_AHA_1540B = 2 /* Adaptec AHA-1540B, ISA. */ 326 326 }; 327 327 … … 407 407 /** Emulated device type. */ 408 408 uint8_t uDevType; 409 /** Signature index for Adaptec models. */ 410 uint8_t uAhaSigIdx; 409 411 410 412 /** Number of mailboxes the guest set up. */ … … 1151 1153 pBusLogic->uMailboxOutgoingPositionCurrent = 0; 1152 1154 pBusLogic->uMailboxIncomingPositionCurrent = 0; 1155 pBusLogic->uAhaSigIdx = 0; 1153 1156 1154 1157 /* Clear any active/pending interrupts. */ … … 1840 1843 * the adapter only when the byte is *not* '0' or 'B'. 1841 1844 */ 1842 pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */ 1843 pBusLogic->aReplyBuffer[1] = 'A'; /* Special option byte */ 1845 if (pBusLogic->uDevType == DEV_AHA_1540B) 1846 { 1847 pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */ 1848 pBusLogic->aReplyBuffer[1] = '0'; /* Special option byte */ 1849 } 1850 else 1851 { 1852 pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */ 1853 pBusLogic->aReplyBuffer[1] = 'A'; /* Special option byte */ 1854 } 1844 1855 1845 1856 /* We report version 5.07B. This reply will provide the first two digits. */ … … 1851 1862 case BUSLOGICCOMMAND_INQUIRE_FIRMWARE_VERSION_3RD_LETTER: 1852 1863 { 1864 if (pBusLogic->uDevType == DEV_AHA_1540B) 1865 { 1866 /* Newer ASPI4DOS.SYS versions expect this command to fail. */ 1867 Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode)); 1868 pBusLogic->cbReplyParametersLeft = 0; 1869 pBusLogic->regStatus |= BL_STAT_CMDINV; 1870 break; 1871 } 1872 1853 1873 pBusLogic->aReplyBuffer[0] = '7'; 1854 1874 pBusLogic->cbReplyParametersLeft = 1; … … 1907 1927 case BUSLOGICCOMMAND_INQUIRE_HOST_ADAPTER_MODEL_NUMBER: 1908 1928 { 1929 /* Not supported on AHA-154x. */ 1930 if (pBusLogic->uDevType == DEV_AHA_1540B) 1931 { 1932 Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode)); 1933 pBusLogic->cbReplyParametersLeft = 0; 1934 pBusLogic->regStatus |= BL_STAT_CMDINV; 1935 break; 1936 } 1937 1909 1938 /* The reply length is set by the guest and is found in the first byte of the command buffer. */ 1910 1939 if (pBusLogic->aCommandBuffer[0] > sizeof(pBusLogic->aReplyBuffer)) … … 1968 1997 * Adaptec 154x models supposedly support it too?? 1969 1998 */ 1999 if (pBusLogic->uDevType == DEV_AHA_1540B) 2000 { 2001 Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode)); 2002 pBusLogic->cbReplyParametersLeft = 0; 2003 pBusLogic->regStatus |= BL_STAT_CMDINV; 2004 break; 2005 } 1970 2006 1971 2007 /* The reply length is set by the guest and is found in the first byte of the command buffer. */ … … 1996 2032 pReply->cMailbox = pBusLogic->cMailbox; 1997 2033 U32_TO_ADDR(pReply->MailboxAddress, pBusLogic->GCPhysAddrMailboxOutgoingBase); 1998 pReply->uSignature = 'B';1999 /* The 'D' signature prevents Adaptec's OS/2 drivers from getting too2000 * friendly with BusLogic hardwareand upsetting the HBA state.2034 /* The 'D' signature (actually 'SD' for Storage Dimensions, and 'BD' for BusLogic) 2035 * prevents Adaptec's OS/2 drivers from getting too friendly with BusLogic hardware 2036 * and upsetting the HBA state. 2001 2037 */ 2002 pReply->uCharacterD = 'D'; /* BusLogic model. */ 2038 if (pBusLogic->uDevType == DEV_AHA_1540B) 2039 { 2040 pReply->uSignature = 0; /* Zeros for Adaptec. */ 2041 pReply->uCharacterD = 0; 2042 } 2043 else 2044 { 2045 pReply->uSignature = 'B'; 2046 pReply->uCharacterD = 'D'; /* BusLogic model. */ 2047 } 2003 2048 pReply->uHostBusType = 'F'; /* PCI bus. */ 2004 2049 break; … … 2044 2089 case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX: 2045 2090 { 2091 if (pBusLogic->uDevType == DEV_AHA_1540B) 2092 { 2093 Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode)); 2094 pBusLogic->cbReplyParametersLeft = 0; 2095 pBusLogic->regStatus |= BL_STAT_CMDINV; 2096 break; 2097 } 2098 2046 2099 PRequestInitializeExtendedMailbox pRequest = (PRequestInitializeExtendedMailbox)pBusLogic->aCommandBuffer; 2047 2100 … … 2145 2198 case BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT: 2146 2199 { 2200 /* Not supported on AHA-154x HBAs. */ 2201 if (pBusLogic->uDevType == DEV_AHA_1540B) 2202 { 2203 Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode)); 2204 pBusLogic->cbReplyParametersLeft = 0; 2205 pBusLogic->regStatus |= BL_STAT_CMDINV; 2206 break; 2207 } 2208 2147 2209 pBusLogic->cbReplyParametersLeft = 0; 2148 2210 if (pBusLogic->aCommandBuffer[0] == 0) … … 2272 2334 static int buslogicRegisterRead(PBUSLOGIC pBusLogic, unsigned iRegister, uint32_t *pu32) 2273 2335 { 2336 static const char achAhaSig[] = "ADAP"; 2274 2337 int rc = VINF_SUCCESS; 2275 2338 … … 2341 2404 case BUSLOGIC_REGISTER_GEOMETRY: 2342 2405 { 2343 *pu32 = pBusLogic->regGeometry; 2406 if (pBusLogic->uDevType == DEV_AHA_1540B) 2407 { 2408 *pu32 = achAhaSig[pBusLogic->uAhaSigIdx]; 2409 pBusLogic->uAhaSigIdx = (pBusLogic->uAhaSigIdx + 1) & 3; 2410 } 2411 else 2412 *pu32 = pBusLogic->regGeometry; 2344 2413 break; 2345 2414 } … … 2449 2518 case BUSLOGICCOMMAND_MODIFY_IO_ADDRESS: 2450 2519 case BUSLOGICCOMMAND_INQUIRE_EXTENDED_SETUP_INFORMATION: 2520 case BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT: 2521 case BUSLOGICCOMMAND_INQUIRE_HOST_ADAPTER_MODEL_NUMBER: 2522 /* These commands are not on AHA-154x, some Adaptec drivers (ASPI4DOS.SYS) test them. */ 2523 if (pBusLogic->uDevType == DEV_AHA_1540B) 2524 { 2525 pBusLogic->cbCommandParametersLeft = 0; 2526 break; 2527 } 2528 /* Fall through. */ 2451 2529 case BUSLOGICCOMMAND_INQUIRE_SETUP_INFORMATION: 2452 case BUSLOGICCOMMAND_INQUIRE_HOST_ADAPTER_MODEL_NUMBER:2453 2530 case BUSLOGICCOMMAND_ENABLE_STRICT_ROUND_ROBIN_MODE: 2454 2531 case BUSLOGICCOMMAND_SET_CCB_FORMAT: 2455 2532 case BUSLOGICCOMMAND_INQUIRE_SYNCHRONOUS_PERIOD: 2456 case BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT:2457 2533 case BUSLOGICCOMMAND_ECHO_COMMAND_DATA: 2458 2534 case BUSLOGICCOMMAND_ENABLE_OUTGOING_MAILBOX_AVAILABLE_INTERRUPT: … … 2476 2552 break; 2477 2553 case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX: 2554 /* Some Adaptec drivers (ASPI4DOS.SYS) test this command. */ 2555 if (pBusLogic->uDevType == DEV_AHA_1540B) 2556 { 2557 pBusLogic->cbCommandParametersLeft = 0; 2558 break; 2559 } 2478 2560 pBusLogic->cbCommandParametersLeft = sizeof(RequestInitializeExtendedMailbox); 2479 2561 break; … … 2530 2612 */ 2531 2613 case BUSLOGIC_REGISTER_INTERRUPT: 2614 if (pBusLogic->uDevType == DEV_AHA_1540B) 2615 break; 2532 2616 pBusLogic->regInterrupt = uVal; 2533 2617 break; 2534 2618 2535 2619 case BUSLOGIC_REGISTER_GEOMETRY: 2620 if (pBusLogic->uDevType == DEV_AHA_1540B) 2621 break; 2536 2622 pBusLogic->regGeometry = uVal; 2537 2623 break; … … 3752 3838 static DECLCALLBACK(void) buslogicR3Info(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 3753 3839 { 3754 static const char *apszModels[] = { "BusLogic BT-958D", "BusLogic BT-545C", "Adaptec AHA-1540 C" };3840 static const char *apszModels[] = { "BusLogic BT-958D", "BusLogic BT-545C", "Adaptec AHA-1540B" }; 3755 3841 PBUSLOGIC pThis = PDMINS_2_DATA(pDevIns, PBUSLOGIC); 3756 3842 unsigned i; … … 4201 4287 pThis->uIsaIrq = 11; 4202 4288 } 4203 #if 0 /* Maybe someday. */ 4204 else if (!strcmp(achCfgStr, "AHA-1540C")) /* Competitor ISA device. */ 4205 { 4206 pThis->uDevType = DEV_AHA_1540C; 4289 else if (!strcmp(achCfgStr, "AHA-1540B")) /* Competitor ISA device. */ 4290 { 4291 pThis->uDevType = DEV_AHA_1540B; 4207 4292 pThis->uIsaIrq = 11; 4208 4293 } 4209 #endif4210 4294 else 4211 4295 return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
Note:
See TracChangeset
for help on using the changeset viewer.

