diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-01-26 14:12:59 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-01-26 14:12:59 -0500 |
commit | aea5d375600f132537adf45942c0fbdcd25eb995 (patch) | |
tree | 6226c25e9024a35755d193440e6e03ab27eef066 /drivers/ide/pci/cs5520.c | |
parent | 29ec683f019608ca0cb6cf69011426ecb5daa69e (diff) |
ide: (hopefully) fix VDMA for CS5520
* Set the correct hwif->dma_base for the second channel in
ide_get_or_set_dma_base().
* Remove DMA enable code from cs5520_set_pio_mode(), this can
be handled by the generic ->dma_host_on method now.
* Add VDMA check to ide_config_drive_speed().
* drive->using_dma was never enabled since cs5520 host driver's
->ide_dma_on method overrided the generic ->ide_dma_on (so
__ide_dma_on() was never called, drive->using_dma was never set
and VDMA was never used since it depends on drive->using_dma).
Fix it by using ->dma_host_on method instead of ->ide_dma_on
(also add matching ->dma_host_off method).
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci/cs5520.c')
-rw-r--r-- | drivers/ide/pci/cs5520.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c index d1a91bcb5b29..78058ca2ce76 100644 --- a/drivers/ide/pci/cs5520.c +++ b/drivers/ide/pci/cs5520.c | |||
@@ -71,7 +71,6 @@ static void cs5520_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
71 | ide_hwif_t *hwif = HWIF(drive); | 71 | ide_hwif_t *hwif = HWIF(drive); |
72 | struct pci_dev *pdev = hwif->pci_dev; | 72 | struct pci_dev *pdev = hwif->pci_dev; |
73 | int controller = drive->dn > 1 ? 1 : 0; | 73 | int controller = drive->dn > 1 ? 1 : 0; |
74 | u8 reg; | ||
75 | 74 | ||
76 | /* FIXME: if DMA = 1 do we need to set the DMA bit here ? */ | 75 | /* FIXME: if DMA = 1 do we need to set the DMA bit here ? */ |
77 | 76 | ||
@@ -91,11 +90,6 @@ static void cs5520_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
91 | pci_write_config_byte(pdev, 0x66 + 4*controller + (drive->dn&1), | 90 | pci_write_config_byte(pdev, 0x66 + 4*controller + (drive->dn&1), |
92 | (cs5520_pio_clocks[pio].recovery << 4) | | 91 | (cs5520_pio_clocks[pio].recovery << 4) | |
93 | (cs5520_pio_clocks[pio].assert)); | 92 | (cs5520_pio_clocks[pio].assert)); |
94 | |||
95 | /* Set the DMA enable/disable flag */ | ||
96 | reg = inb(hwif->dma_base + 0x02 + 8*controller); | ||
97 | reg |= 1<<((drive->dn&1)+5); | ||
98 | outb(reg, hwif->dma_base + 0x02 + 8*controller); | ||
99 | } | 93 | } |
100 | 94 | ||
101 | static void cs5520_set_dma_mode(ide_drive_t *drive, const u8 speed) | 95 | static void cs5520_set_dma_mode(ide_drive_t *drive, const u8 speed) |
@@ -109,13 +103,23 @@ static void cs5520_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
109 | * We wrap the DMA activate to set the vdma flag. This is needed | 103 | * We wrap the DMA activate to set the vdma flag. This is needed |
110 | * so that the IDE DMA layer issues PIO not DMA commands over the | 104 | * so that the IDE DMA layer issues PIO not DMA commands over the |
111 | * DMA channel | 105 | * DMA channel |
106 | * | ||
107 | * ATAPI is harder so disable it for now using IDE_HFLAG_NO_ATAPI_DMA | ||
112 | */ | 108 | */ |
113 | 109 | ||
114 | static int cs5520_dma_on(ide_drive_t *drive) | 110 | static void cs5520_dma_host_on(ide_drive_t *drive) |
115 | { | 111 | { |
116 | /* ATAPI is harder so leave it for now */ | 112 | if (drive->using_dma) |
117 | drive->vdma = 1; | 113 | drive->vdma = 1; |
118 | return 0; | 114 | |
115 | ide_dma_host_on(drive); | ||
116 | } | ||
117 | |||
118 | static void cs5520_dma_host_off(ide_drive_t *drive) | ||
119 | { | ||
120 | drive->vdma = 0; | ||
121 | |||
122 | ide_dma_host_off(drive); | ||
119 | } | 123 | } |
120 | 124 | ||
121 | static void __devinit init_hwif_cs5520(ide_hwif_t *hwif) | 125 | static void __devinit init_hwif_cs5520(ide_hwif_t *hwif) |
@@ -126,7 +130,8 @@ static void __devinit init_hwif_cs5520(ide_hwif_t *hwif) | |||
126 | if (hwif->dma_base == 0) | 130 | if (hwif->dma_base == 0) |
127 | return; | 131 | return; |
128 | 132 | ||
129 | hwif->ide_dma_on = &cs5520_dma_on; | 133 | hwif->dma_host_on = &cs5520_dma_host_on; |
134 | hwif->dma_host_off = &cs5520_dma_host_off; | ||
130 | } | 135 | } |
131 | 136 | ||
132 | #define DECLARE_CS_DEV(name_str) \ | 137 | #define DECLARE_CS_DEV(name_str) \ |