Only use 2 bytes of the signature instead of all four. Even though the specs

clearly state that the other two bytes need to be 0x01 (and they always did,
even back to the very first ATA/ATAPI specs), I have one device here that
doesn't set the sector count register to 1. Since those two bytes are the unique
ones of the signatures anyway, it shouldn't harm to just ignore the others.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30311 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Michael Lotz 2009-04-22 00:14:33 +00:00
parent 0750bc97a5
commit 22a6e4bb80
2 changed files with 14 additions and 14 deletions

View File

@ -123,7 +123,7 @@ ATAChannel::ScanBus()
}
bool devicePresent[fDeviceCount];
uint32 deviceSignature[fDeviceCount];
uint16 deviceSignature[fDeviceCount];
status_t result = Reset(devicePresent, deviceSignature);
if (result != B_OK) {
TRACE_ERROR("resetting the channel failed\n");
@ -289,7 +289,7 @@ ATAChannel::SelectedDevice()
status_t
ATAChannel::Reset(bool *presence, uint32 *signatures)
ATAChannel::Reset(bool *presence, uint16 *signatures)
{
TRACE_FUNCTION("\n");
@ -335,8 +335,8 @@ ATAChannel::Reset(bool *presence, uint32 *signatures)
}
ata_task_file taskFile;
if (_ReadRegs(&taskFile, ATA_MASK_SECTOR_COUNT | ATA_MASK_LBA_LOW
| ATA_MASK_LBA_MID | ATA_MASK_LBA_HIGH | ATA_MASK_ERROR) != B_OK) {
if (_ReadRegs(&taskFile, ATA_MASK_LBA_MID | ATA_MASK_LBA_HIGH
| ATA_MASK_ERROR) != B_OK) {
TRACE_ERROR("reading status failed\n");
return B_ERROR;
}
@ -357,12 +357,12 @@ ATAChannel::Reset(bool *presence, uint32 *signatures)
if (presence != NULL)
presence[i] = true;
if (signatures != NULL) {
signatures[i] = taskFile.lba.sector_count
| (((uint32)taskFile.lba.lba_0_7) << 8)
| (((uint32)taskFile.lba.lba_8_15) << 16)
| (((uint32)taskFile.lba.lba_16_23) << 24);
}
uint16 signature = taskFile.lba.lba_8_15
| (((uint16)taskFile.lba.lba_16_23) << 8);
TRACE_ALWAYS("signature of device %d: 0x%04x\n", i, signature);
if (signatures != NULL)
signatures[i] = signature;
}
return B_OK;

View File

@ -29,9 +29,9 @@
#define ATA_MAX_DMA_FAILURES 3
#define ATA_STANDARD_TIMEOUT 10 * 1000 * 1000
#define ATA_RELEASE_TIMEOUT 10 * 1000 * 1000
#define ATA_SIGNATURE_ATA 0x00000101
#define ATA_SIGNATURE_ATAPI 0xeb140101
#define ATA_SIGNATURE_SATA 0xc33c0101
#define ATA_SIGNATURE_ATA 0x0000
#define ATA_SIGNATURE_ATAPI 0xeb14
#define ATA_SIGNATURE_SATA 0xc33c
#define ATA_SIM_MODULE_NAME "bus_managers/ata/sim/driver_v1"
#define ATA_CHANNEL_ID_GENERATOR "ide/channel_id"
#define ATA_CHANNEL_ID_ITEM "ide/channel_id"
@ -79,7 +79,7 @@ public:
status_t SelectDevice(uint8 index);
uint8 SelectedDevice();
status_t Reset(bool *presence, uint32 *signatures);
status_t Reset(bool *presence, uint16 *signatures);
bool UseDMA() { return fUseDMA; };