More BT-946C bug fixes and made it use a newer BIOS, and AutoSCSI should now work *correctly*.

This commit is contained in:
OBattler
2017-08-26 04:38:12 +02:00
parent 2b980aae72
commit a48ecb45e1
2 changed files with 45 additions and 38 deletions

View File

@@ -39,7 +39,7 @@
#include "scsi_buslogic.h"
#define BUSLOGIC_RESET_DURATION_NS UINT64_C(250000)
#define BUSLOGIC_RESET_DURATION_US UINT64_C(50000)
/*
@@ -148,14 +148,16 @@ typedef struct {
uint8_t fInt13Extension : 1;
uint8_t fReserved9 : 1;
uint8_t fCDROMBoot : 1;
unsigned char uReserved10 : 5;
unsigned char uReserved10 : 2;
uint8_t fMultiBoot : 1;
unsigned char uReserved11 : 2;
unsigned char uBootTargetId : 4;
unsigned char uBootChannel : 4;
uint8_t fForceBusDeviceScanningOrder : 1;
unsigned char uReserved11 : 7;
unsigned char uReserved12 : 7;
uint16_t u16NonTaggedToAlternateLunPermittedMask;
uint16_t u16RenegotiateSyncAfterCheckConditionMask;
uint8_t aReserved12[10];
uint8_t aReserved14[10];
uint8_t aManufacturingDiagnostic[2];
uint16_t u16Checksum;
} AutoSCSIRam;
@@ -612,11 +614,12 @@ BuslogicInitializeAutoSCSIRam(Buslogic_t *bl, uint8_t safe)
HALR->structured.autoSCSIData.cbInformation = 64;
HALR->structured.autoSCSIData.aHostAdaptertype[0] = (bl->chip == CHIP_BUSLOGIC_PCI) ? '9' : '5';
HALR->structured.autoSCSIData.aHostAdaptertype[1] = '4';
HALR->structured.autoSCSIData.aHostAdaptertype[2] = (bl->chip == CHIP_BUSLOGIC_PCI) ? '6' : '2';
HALR->structured.autoSCSIData.aHostAdaptertype[3] = (bl->chip == CHIP_BUSLOGIC_PCI) ? 'C' : 'B';
HALR->structured.autoSCSIData.aHostAdaptertype[4] = ' ';
HALR->structured.autoSCSIData.aHostAdaptertype[0] = ' ';
HALR->structured.autoSCSIData.aHostAdaptertype[1] = (bl->chip == CHIP_BUSLOGIC_PCI) ? '9' : '5';
HALR->structured.autoSCSIData.aHostAdaptertype[2] = '4';
HALR->structured.autoSCSIData.aHostAdaptertype[3] = (bl->chip == CHIP_BUSLOGIC_PCI) ? '6' : '2';
HALR->structured.autoSCSIData.aHostAdaptertype[4] = (bl->chip == CHIP_BUSLOGIC_PCI) ? 'C' : 'B';
HALR->structured.autoSCSIData.aHostAdaptertype[5] = ' ';
HALR->structured.autoSCSIData.fLevelSensitiveInterrupt = (bl->chip == CHIP_BUSLOGIC_PCI) ? 1 : 0;
HALR->structured.autoSCSIData.uSystemRAMAreForBIOS = 6;
@@ -672,7 +675,7 @@ BuslogicInitializeAutoSCSIRam(Buslogic_t *bl, uint8_t safe)
HALR->structured.autoSCSIData.uDMATransferRate = (bl->chip == CHIP_BUSLOGIC_ISA) ? 1 : 0;
HALR->structured.autoSCSIData.uSCSIId = 15;
HALR->structured.autoSCSIData.uSCSIId = 7;
HALR->structured.autoSCSIData.uSCSIConfiguration = 0x3F;
HALR->structured.autoSCSIData.uBusOnDelay = (bl->chip == CHIP_BUSLOGIC_PCI) ? 0 : 7;
HALR->structured.autoSCSIData.uBusOffDelay = (bl->chip == CHIP_BUSLOGIC_PCI) ? 0 : 4;
@@ -693,8 +696,12 @@ BuslogicInitializeAutoSCSIRam(Buslogic_t *bl, uint8_t safe)
HALR->structured.autoSCSIData.uAutoSCSIMaximumLUN = 7;
HALR->structured.autoSCSIData.fForceBusDeviceScanningOrder = 1;
HALR->structured.autoSCSIData.uReserved12 = 0x7f;
HALR->structured.autoSCSIData.fInt13Extension = safe ? 0 : 1;
HALR->structured.autoSCSIData.fCDROMBoot = safe ? 0 : 1;
HALR->structured.autoSCSIData.fMultiBoot = safe ? 0 : 1;
}
@@ -749,7 +756,7 @@ BuslogicResetControl(Buslogic_t *bl, uint8_t Reset)
bl->Status |= STAT_STST;
bl->Status &= ~STAT_IDLE;
}
BuslogicResetCallback = BUSLOGIC_RESET_DURATION_NS * TIMER_USEC;
BuslogicResetCallback = BUSLOGIC_RESET_DURATION_US * TIMER_USEC;
}
@@ -1994,7 +2001,7 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
for (i=0; i<8; i++) {
bl->DataBuf[i] = 0;
for (j=0; j<8; j++) {
if (scsi_device_present(i, j))
if (scsi_device_present(i, j) && (i != 7))
bl->DataBuf[i] |= (1 << j);
}
}
@@ -2012,8 +2019,7 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
bl->DataBuf[1] = 0;
{
}
/* bl->DataBuf[2] = 7; */ /* HOST ID */
bl->DataBuf[2] = 15; /* HOST ID */
bl->DataBuf[2] = 7; /* HOST ID */
bl->DataReplyLeft = 3;
break;
@@ -2095,7 +2101,6 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
bl->DataBuf[i-8] |= (1<<j);
}
}
bl->DataBuf[7] = 0;
bl->DataReplyLeft = 8;
break;
@@ -2104,7 +2109,7 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
uint16_t TargetsPresentMask = 0;
for (i=0; i<15; i++) {
if (scsi_device_present(i, 0))
if (scsi_device_present(i, 0) && (i != 7))
TargetsPresentMask |= (1 << i);
}
bl->DataBuf[0] = TargetsPresentMask & 0xFF;
@@ -2303,7 +2308,7 @@ BuslogicWrite(uint16_t Port, uint8_t Val, void *p)
f = nvrfopen(BuslogicGetNVRFileName(bl), L"wb");
if (f)
{
fwrite(&(bl->LocalRAM.u8View[64]), 1, 64, f);
fwrite(&(bl->LocalRAM.structured.autoSCSIData), 1, 64, f);
fclose(f);
f = NULL;
}
@@ -3039,10 +3044,12 @@ BuslogicInit(int chip)
}
else
{
rom_init(&bl->bios, L"roms/scsi/buslogic/428A494G.BIN", 0xd8000, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL);
memset(bl->AutoSCSIROM, 0xff, 32768);
/* rom_init(&bl->bios, L"roms/scsi/buslogic/428A494G.BIN", 0xd8000, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL); */
/* rom_init(&bl->bios, L"roms/scsi/buslogic/BT9X6C_BIOS.rom", 0xd8000, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL); */
rom_init(&bl->bios, L"roms/scsi/buslogic/Womper97.rom", 0xd8000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
}
memset(bl->AutoSCSIROM, 0xff, 32768);
f = romfopen(L"roms/scsi/buslogic/AutoSCSI.rom", L"rb");
if (f)
{
@@ -3063,18 +3070,6 @@ BuslogicInit(int chip)
timer_add(BuslogicCommandCallback,
&BuslogicCallback, &BuslogicCallback, bl);
f = nvrfopen(BuslogicGetNVRFileName(bl), L"rb");
if (f)
{
fread(&(bl->LocalRAM.u8View[64]), 1, 64, f);
fclose(f);
f = NULL;
}
else
{
BuslogicInitializeAutoSCSIRam(bl, 0);
}
if (bl->chip == CHIP_BUSLOGIC_PCI) {
bl->Card = pci_add(BuslogicPCIRead, BuslogicPCIWrite, bl);
@@ -3112,6 +3107,18 @@ BuslogicInit(int chip)
BuslogicResetControl(bl, CTRL_HRST);
BuslogicInitializeLocalRAM(bl);
f = nvrfopen(BuslogicGetNVRFileName(bl), L"rb");
if (f)
{
fread(&(bl->LocalRAM.structured.autoSCSIData), 1, 64, f);
fclose(f);
f = NULL;
}
else
{
BuslogicInitializeAutoSCSIRam(bl, 0);
}
return(bl);
}

View File

@@ -307,13 +307,13 @@ int scsi_hd_read_capacity(uint8_t id, uint8_t *cdb, uint8_t *buffer, uint32_t *l
buffer[3] = size & 0xff;
buffer[6] = 2; /* 512 = 0x0200 */
*len = 8;
pclog("Read Capacity\n");
pclog("buffer[0]=%x\n", buffer[0]);
pclog("buffer[1]=%x\n", buffer[1]);
pclog("buffer[2]=%x\n", buffer[2]);
pclog("buffer[3]=%x\n", buffer[3]);
scsi_hd_log("Read Capacity\n");
scsi_hd_log("buffer[0]=%x\n", buffer[0]);
scsi_hd_log("buffer[1]=%x\n", buffer[1]);
scsi_hd_log("buffer[2]=%x\n", buffer[2]);
scsi_hd_log("buffer[3]=%x\n", buffer[3]);
return 1;
}