diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-05-15 18:51:44 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-05-15 18:51:44 -0400 |
commit | a01ba4011aa745be44d0290c5da5cb2dfb4e37ce (patch) | |
tree | 63f95042ce5efcfa430cf61c3bcb77f98e7df017 /drivers/ide/pci/sc1200.c | |
parent | bd203b57c7edd6bc457b769cd15fa7239cd2241e (diff) |
cs5530/sc1200: DMA support cleanup
sc1200.c:
* remove open-coded variant of ide_dma_host_off() (== ->dma_host_off),
it is not needed because ->dma_off_quietly calls ->dma_host_off
* use ->dma_host_on (== ide_dma_host_on() for this driver) instead of
open-coded variant, call it from the users of sc1200_config_dma2()
[ there is no need to call ->dma_host_on in sc1200_config_dma() because
core code takes care of calling ->ide_dma_on on successful execution
of ->ide_dma_check ]
* add comment about ->tuneproc interface abuse
cs5530.c/sc1200.c:
* core code takes care of calling ->dma_off_quietly before calling
->ide_dma_check so there is no need to call it in ->ide_dma_check methods
* bump driver version
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci/sc1200.c')
-rw-r--r-- | drivers/ide/pci/sc1200.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c index c0254b5e7d92..65dcabe48205 100644 --- a/drivers/ide/pci/sc1200.c +++ b/drivers/ide/pci/sc1200.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/ide/pci/sc1200.c Version 0.92 Mar 10 2007 | 2 | * linux/drivers/ide/pci/sc1200.c Version 0.93 Mar 10 2007 |
3 | * | 3 | * |
4 | * Copyright (C) 2000-2002 Mark Lord <mlord@pobox.com> | 4 | * Copyright (C) 2000-2002 Mark Lord <mlord@pobox.com> |
5 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz | 5 | * Copyright (C) 2007 Bartlomiej Zolnierkiewicz |
@@ -137,12 +137,6 @@ static int sc1200_config_dma2 (ide_drive_t *drive, int mode) | |||
137 | unsigned int basereg = hwif->channel ? 0x50 : 0x40; | 137 | unsigned int basereg = hwif->channel ? 0x50 : 0x40; |
138 | 138 | ||
139 | /* | 139 | /* |
140 | * Default to DMA-off in case we run into trouble here. | ||
141 | */ | ||
142 | hwif->dma_off_quietly(drive); /* turn off DMA while we fiddle */ | ||
143 | outb(inb(hwif->dma_base+2)&~(unit?0x40:0x20), hwif->dma_base+2); /* clear DMA_capable bit */ | ||
144 | |||
145 | /* | ||
146 | * Tell the drive to switch to the new mode; abort on failure. | 140 | * Tell the drive to switch to the new mode; abort on failure. |
147 | */ | 141 | */ |
148 | if (!mode || sc1200_set_xfer_mode(drive, mode)) { | 142 | if (!mode || sc1200_set_xfer_mode(drive, mode)) { |
@@ -217,8 +211,6 @@ static int sc1200_config_dma2 (ide_drive_t *drive, int mode) | |||
217 | pci_write_config_dword(hwif->pci_dev, basereg+12, timings); | 211 | pci_write_config_dword(hwif->pci_dev, basereg+12, timings); |
218 | } | 212 | } |
219 | 213 | ||
220 | outb(inb(hwif->dma_base+2)|(unit?0x40:0x20), hwif->dma_base+2); /* set DMA_capable bit */ | ||
221 | |||
222 | return 0; /* success */ | 214 | return 0; /* success */ |
223 | } | 215 | } |
224 | 216 | ||
@@ -277,6 +269,9 @@ static void sc1200_tuneproc (ide_drive_t *drive, byte pio) /* mode=255 means "au | |||
277 | static byte modes[5] = {XFER_PIO_0, XFER_PIO_1, XFER_PIO_2, XFER_PIO_3, XFER_PIO_4}; | 269 | static byte modes[5] = {XFER_PIO_0, XFER_PIO_1, XFER_PIO_2, XFER_PIO_3, XFER_PIO_4}; |
278 | int mode = -1; | 270 | int mode = -1; |
279 | 271 | ||
272 | /* | ||
273 | * bad abuse of ->tuneproc interface | ||
274 | */ | ||
280 | switch (pio) { | 275 | switch (pio) { |
281 | case 200: mode = XFER_UDMA_0; break; | 276 | case 200: mode = XFER_UDMA_0; break; |
282 | case 201: mode = XFER_UDMA_1; break; | 277 | case 201: mode = XFER_UDMA_1; break; |
@@ -287,7 +282,9 @@ static void sc1200_tuneproc (ide_drive_t *drive, byte pio) /* mode=255 means "au | |||
287 | } | 282 | } |
288 | if (mode != -1) { | 283 | if (mode != -1) { |
289 | printk("SC1200: %s: changing (U)DMA mode\n", drive->name); | 284 | printk("SC1200: %s: changing (U)DMA mode\n", drive->name); |
290 | (void)sc1200_config_dma2(drive, mode); | 285 | hwif->dma_off_quietly(drive); |
286 | if (sc1200_config_dma2(drive, mode) == 0) | ||
287 | hwif->dma_host_on(drive); | ||
291 | return; | 288 | return; |
292 | } | 289 | } |
293 | 290 | ||
@@ -421,12 +418,12 @@ static int sc1200_resume (struct pci_dev *dev) | |||
421 | for (d = 0; d < MAX_DRIVES; ++d) { | 418 | for (d = 0; d < MAX_DRIVES; ++d) { |
422 | ide_drive_t *drive = &(hwif->drives[d]); | 419 | ide_drive_t *drive = &(hwif->drives[d]); |
423 | if (drive->present && !__ide_dma_bad_drive(drive)) { | 420 | if (drive->present && !__ide_dma_bad_drive(drive)) { |
424 | int was_using_dma = drive->using_dma; | 421 | int enable_dma = drive->using_dma; |
425 | hwif->dma_off_quietly(drive); | 422 | hwif->dma_off_quietly(drive); |
426 | sc1200_config_dma(drive); | 423 | if (sc1200_config_dma(drive)) |
427 | if (!was_using_dma && drive->using_dma) { | 424 | enable_dma = 0; |
428 | hwif->dma_off_quietly(drive); | 425 | if (enable_dma) |
429 | } | 426 | hwif->dma_host_on(drive); |
430 | } | 427 | } |
431 | } | 428 | } |
432 | } | 429 | } |