Commit 93bd9868 authored by Linus Torvalds's avatar Linus Torvalds

Merge bk://kernel.bkbits.net/jgarzik/libata-upstream-2.6

into ppc970.osdl.org:/home/torvalds/v2.6/linux
parents 9e9c96de 3a540dab
......@@ -817,6 +817,7 @@ static void __init quirk_alder_ioapic(struct pci_dev *pdev)
static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
{
u8 prog, comb, tmp;
int ich = 0;
/*
* Narrow down to Intel SATA PCI devices.
......@@ -827,8 +828,12 @@ static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
case 0x24df:
case 0x25a3:
case 0x25b0:
ich = 5;
break;
case 0x2651:
case 0x2652:
case 0x2653:
ich = 6;
break;
default:
/* we do not handle this PCI device */
......@@ -839,6 +844,8 @@ static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
* Read combined mode register.
*/
pci_read_config_byte(pdev, 0x90, &tmp); /* combined mode reg */
if (ich == 5) {
tmp &= 0x6; /* interesting bits 2:1, PATA primary/secondary */
if (tmp == 0x4) /* bits 10x */
comb = (1 << 0); /* SATA port 0, PATA port 1 */
......@@ -846,6 +853,16 @@ static void __init quirk_intel_ide_combined(struct pci_dev *pdev)
comb = (1 << 2); /* PATA port 0, SATA port 1 */
else
return; /* not in combined mode */
} else {
WARN_ON(ich != 6);
tmp &= 0x3; /* interesting bits 1:0 */
if (tmp & (1 << 0))
comb = (1 << 2); /* PATA port 0, SATA port 1 */
else if (tmp & (1 << 1))
comb = (1 << 0); /* SATA port 0, PATA port 1 */
else
return; /* not in combined mode */
}
/*
* Read programming interface register.
......
......@@ -2029,6 +2029,7 @@ static void ata_pio_sector(struct ata_port *ap)
{
struct ata_queued_cmd *qc;
struct scatterlist *sg;
struct page *page;
unsigned char *buf;
u8 status;
......@@ -2065,7 +2066,8 @@ static void ata_pio_sector(struct ata_port *ap)
if (qc->cursect == (qc->nsect - 1))
ap->pio_task_state = PIO_ST_LAST;
buf = kmap(sg[qc->cursg].page) +
page = sg[qc->cursg].page;
buf = kmap(page) +
sg[qc->cursg].offset + (qc->cursg_ofs * ATA_SECT_SIZE);
qc->cursect++;
......@@ -2088,7 +2090,7 @@ static void ata_pio_sector(struct ata_port *ap)
else
insl(ap->ioaddr.data_addr, buf, ATA_SECT_DWORDS);
kunmap(sg[qc->cursg].page);
kunmap(page);
}
static void ata_pio_task(void *_data)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment