diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2008-03-13 19:09:49 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2008-03-13 19:09:49 -0400 |
commit | 049d5a237dcc05431829e2afe2bb8fb46cfb33b0 (patch) | |
tree | 7c73221bd3a6ccd538e440f34972551511c4d7c8 | |
parent | 2018eff2cf3f4caced677a7c3bc0b0b9af5bc8d7 (diff) | |
download | seabios-hppa-049d5a237dcc05431829e2afe2bb8fb46cfb33b0.zip seabios-hppa-049d5a237dcc05431829e2afe2bb8fb46cfb33b0.tar.gz seabios-hppa-049d5a237dcc05431829e2afe2bb8fb46cfb33b0.tar.bz2 |
Use LBA disk access methods always; don't use CHS methods.
Using CHS is dependent on the drive type, not the request type. So,
old code was not correct. It is simpler to just always use LBA.
-rw-r--r-- | src/ata.c | 12 | ||||
-rw-r--r-- | src/ata.h | 20 | ||||
-rw-r--r-- | src/disk.c | 23 |
3 files changed, 11 insertions, 44 deletions
@@ -546,9 +546,9 @@ ata_detect() SET_EBDA(ata.devices[device].device,ATA_DEVICE_HD); SET_EBDA(ata.devices[device].mode, ATA_MODE_PIO16); - u16 ret = ata_cmd_data_chs(device, ATA_CMD_IDENTIFY_DEVICE - , 0, 0, 1, 1 - , MAKE_32_PTR(GET_SEG(SS), (u32)buffer)); + u16 ret = ata_cmd_data(device, ATA_CMD_IDENTIFY_DEVICE + , 1, 1 + , MAKE_32_PTR(GET_SEG(SS), (u32)buffer)); if (ret) BX_PANIC("ata-detect: Failed to detect ATA device\n"); @@ -650,9 +650,9 @@ ata_detect() SET_EBDA(ata.devices[device].device,ATA_DEVICE_CDROM); SET_EBDA(ata.devices[device].mode, ATA_MODE_PIO16); - u16 ret = ata_cmd_data_chs(device, ATA_CMD_IDENTIFY_DEVICE_PACKET - , 0, 0, 1, 1 - , MAKE_32_PTR(GET_SEG(SS), (u32)buffer)); + u16 ret = ata_cmd_data(device, ATA_CMD_IDENTIFY_DEVICE_PACKET + , 1, 1 + , MAKE_32_PTR(GET_SEG(SS), (u32)buffer)); if (ret != 0) BX_PANIC("ata-detect: Failed to detect ATAPI device\n"); @@ -68,24 +68,4 @@ ata_cmd_data(u16 biosid, u16 command, u32 lba, u16 count, void *far_buffer) return ata_transfer(&cmd); } -static inline int -ata_cmd_data_chs(u16 biosid, u16 command, u16 cyl, u16 head, u16 sect, u16 count - , void *far_buffer) -{ - u8 slave = biosid % 2; - - struct ata_pio_command cmd; - cmd.far_buffer = far_buffer; - cmd.biosid = biosid; - - cmd.sector_count = count & 0xff; - cmd.feature = 0; - cmd.lba_low = sect; - cmd.lba_mid = cyl; - cmd.lba_high = cyl >> 8; - cmd.device = (slave ? ATA_CB_DH_DEV1 : ATA_CB_DH_DEV0) | (head & 0xff); - cmd.command = command; - return ata_transfer(&cmd); -} - #endif /* __ATA_H */ @@ -54,8 +54,6 @@ basic_access(struct bregs *regs, u8 device, u16 command) u16 nlc = GET_EBDA(ata.devices[device].lchs.cylinders); u16 nlh = GET_EBDA(ata.devices[device].lchs.heads); u16 nlspt = GET_EBDA(ata.devices[device].lchs.spt); - u16 nph = GET_EBDA(ata.devices[device].pchs.heads); - u16 npspt = GET_EBDA(ata.devices[device].pchs.spt); // sanity check on cyl heads, sec if (cylinder >= nlc || head >= nlh || sector > nlspt) { @@ -75,23 +73,12 @@ basic_access(struct bregs *regs, u8 device, u16 command) u16 segment = regs->es; u16 offset = regs->bx; - irq_enable(); - - u8 status; - u32 lba; - if (nph != nlh || npspt != nlspt) { - // translate lchs to lba - lba = (((((u32)cylinder * (u32)nlh) + (u32)head) * (u32)nlspt) + // translate lchs to lba + u32 lba = (((((u32)cylinder * (u32)nlh) + (u32)head) * (u32)nlspt) + (u32)sector - 1); - status = ata_cmd_data(device, command, lba, count - , MAKE_32_PTR(segment, offset)); - } else { - // XXX - see if lba access can always be used. - status = ata_cmd_data_chs(device, command - , cylinder, head, sector, count - , MAKE_32_PTR(segment, offset)); - } - + irq_enable(); + u8 status = ata_cmd_data(device, command, lba, count + , MAKE_32_PTR(segment, offset)); irq_disable(); // Set nb of sector transferred |