Skip to content

Commit

Permalink
sata_nv: enable hotplug interrupt and fix some readl/readw mismatches
Browse files Browse the repository at this point in the history
We already have code that handles hotplug interrupt indications in ADMA
mode, this turns on the control flag that actually enables these interrupts.
Also fixes some cases in the same functions where a 16-bit register was read
using a readl instead of a readw.

Signed-off-by: Robert Hancock <[email protected]>
Signed-off-by: Jeff Garzik <[email protected]>
  • Loading branch information
Robert Hancock authored and Jeff Garzik committed Feb 21, 2007
1 parent 721449b commit 5ce0cf6
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions drivers/ata/sata_nv.c
Original file line number Diff line number Diff line change
Expand Up @@ -1034,14 +1034,15 @@ static int nv_adma_port_start(struct ata_port *ap)

/* clear GO for register mode, enable interrupt */
tmp = readw(mmio + NV_ADMA_CTL);
writew( (tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN, mmio + NV_ADMA_CTL);
writew( (tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN |
NV_ADMA_CTL_HOTPLUG_IEN, mmio + NV_ADMA_CTL);

tmp = readw(mmio + NV_ADMA_CTL);
writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
readl( mmio + NV_ADMA_CTL ); /* flush posted write */
readw( mmio + NV_ADMA_CTL ); /* flush posted write */
udelay(1);
writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
readl( mmio + NV_ADMA_CTL ); /* flush posted write */
readw( mmio + NV_ADMA_CTL ); /* flush posted write */

return 0;
}
Expand Down Expand Up @@ -1093,14 +1094,15 @@ static int nv_adma_port_resume(struct ata_port *ap)

/* clear GO for register mode, enable interrupt */
tmp = readw(mmio + NV_ADMA_CTL);
writew((tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN, mmio + NV_ADMA_CTL);
writew( (tmp & ~NV_ADMA_CTL_GO) | NV_ADMA_CTL_AIEN |
NV_ADMA_CTL_HOTPLUG_IEN, mmio + NV_ADMA_CTL);

tmp = readw(mmio + NV_ADMA_CTL);
writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
readl( mmio + NV_ADMA_CTL ); /* flush posted write */
readw( mmio + NV_ADMA_CTL ); /* flush posted write */
udelay(1);
writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
readl( mmio + NV_ADMA_CTL ); /* flush posted write */
readw( mmio + NV_ADMA_CTL ); /* flush posted write */

return 0;
}
Expand Down Expand Up @@ -1491,10 +1493,10 @@ static void nv_adma_error_handler(struct ata_port *ap)
/* Reset channel */
tmp = readw(mmio + NV_ADMA_CTL);
writew(tmp | NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
readl( mmio + NV_ADMA_CTL ); /* flush posted write */
readw( mmio + NV_ADMA_CTL ); /* flush posted write */
udelay(1);
writew(tmp & ~NV_ADMA_CTL_CHANNEL_RESET, mmio + NV_ADMA_CTL);
readl( mmio + NV_ADMA_CTL ); /* flush posted write */
readw( mmio + NV_ADMA_CTL ); /* flush posted write */
}

ata_bmdma_drive_eh(ap, ata_std_prereset, ata_std_softreset,
Expand Down

0 comments on commit 5ce0cf6

Please sign in to comment.