9
0
Fork 0

ata: ahci: only use lba48 on drives which support it

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Sascha Hauer 2013-06-06 09:19:05 +02:00
parent 7ffc9df31d
commit 05002a942c
1 changed files with 15 additions and 4 deletions

View File

@ -224,13 +224,19 @@ static int ahci_rw(struct ata_port *ata, void *rbuf, const void *wbuf,
struct ahci_port *ahci = container_of(ata, struct ahci_port, ata);
u8 fis[20];
int ret;
int lba48 = ata_id_has_lba48(ata->id);
memset(fis, 0, sizeof(fis));
/* Construct the FIS */
fis[0] = 0x27; /* Host to device FIS. */
fis[1] = 1 << 7; /* Command FIS. */
fis[2] = wbuf ? ATA_CMD_WRITE_EXT : ATA_CMD_READ_EXT; /* Command byte. */
/* Command byte. */
if (lba48)
fis[2] = wbuf ? ATA_CMD_WRITE_EXT : ATA_CMD_READ_EXT;
else
fis[2] = wbuf ? ATA_CMD_WRITE : ATA_CMD_READ;
while (num_blocks) {
int now;
@ -240,9 +246,14 @@ static int ahci_rw(struct ata_port *ata, void *rbuf, const void *wbuf,
fis[4] = (block >> 0) & 0xff;
fis[5] = (block >> 8) & 0xff;
fis[6] = (block >> 16) & 0xff;
fis[7] = 1 << 6; /* device reg: set LBA mode */
fis[8] = ((block >> 24) & 0xff);
fis[3] = 0xe0; /* features */
if (lba48) {
fis[7] = 1 << 6; /* device reg: set LBA mode */
fis[8] = ((block >> 24) & 0xff);
fis[3] = 0xe0; /* features */
} else {
fis[7] = ((block >> 24) & 0xf) | 0xe0;
}
/* Block (sector) count */
fis[12] = (now >> 0) & 0xff;