diff options
Diffstat (limited to 'drivers/ide/pci/aec62xx.c')
-rw-r--r-- | drivers/ide/pci/aec62xx.c | 51 |
1 files changed, 16 insertions, 35 deletions
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index 7067df2590c3..99184be6a98c 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/ide/pci/aec62xx.c Version 0.22 Apr 23, 2007 | 2 | * linux/drivers/ide/pci/aec62xx.c Version 0.23 May 23, 2007 |
3 | * | 3 | * |
4 | * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> | 4 | * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> |
5 | * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com> | 5 | * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com> |
@@ -220,21 +220,18 @@ static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const ch | |||
220 | 220 | ||
221 | static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) | 221 | static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) |
222 | { | 222 | { |
223 | struct pci_dev *dev = hwif->pci_dev; | 223 | struct pci_dev *dev = hwif->pci_dev; |
224 | u8 reg54 = 0, mask = hwif->channel ? 0xf0 : 0x0f; | ||
225 | unsigned long flags; | ||
224 | 226 | ||
225 | hwif->autodma = 0; | ||
226 | hwif->tuneproc = &aec62xx_tune_drive; | 227 | hwif->tuneproc = &aec62xx_tune_drive; |
227 | hwif->speedproc = &aec62xx_tune_chipset; | 228 | hwif->speedproc = &aec62xx_tune_chipset; |
228 | 229 | ||
229 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF) | 230 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF && hwif->mate) |
230 | hwif->serialized = hwif->channel; | 231 | hwif->mate->serialized = hwif->serialized = 1; |
231 | |||
232 | if (hwif->mate) | ||
233 | hwif->mate->serialized = hwif->serialized; | ||
234 | 232 | ||
235 | if (!hwif->dma_base) { | 233 | if (!hwif->dma_base) { |
236 | hwif->drives[0].autotune = 1; | 234 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; |
237 | hwif->drives[1].autotune = 1; | ||
238 | return; | 235 | return; |
239 | } | 236 | } |
240 | 237 | ||
@@ -244,32 +241,21 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) | |||
244 | hwif->ide_dma_check = &aec62xx_config_drive_xfer_rate; | 241 | hwif->ide_dma_check = &aec62xx_config_drive_xfer_rate; |
245 | hwif->dma_lost_irq = &aec62xx_dma_lost_irq; | 242 | hwif->dma_lost_irq = &aec62xx_dma_lost_irq; |
246 | 243 | ||
247 | if (!noautodma) | ||
248 | hwif->autodma = 1; | ||
249 | hwif->drives[0].autodma = hwif->autodma; | ||
250 | hwif->drives[1].autodma = hwif->autodma; | ||
251 | } | ||
252 | |||
253 | static void __devinit init_dma_aec62xx(ide_hwif_t *hwif, unsigned long dmabase) | ||
254 | { | ||
255 | struct pci_dev *dev = hwif->pci_dev; | ||
256 | |||
257 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF) { | 244 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP850UF) { |
258 | u8 reg54h = 0; | ||
259 | unsigned long flags; | ||
260 | |||
261 | spin_lock_irqsave(&ide_lock, flags); | 245 | spin_lock_irqsave(&ide_lock, flags); |
262 | pci_read_config_byte(dev, 0x54, ®54h); | 246 | pci_read_config_byte (dev, 0x54, ®54); |
263 | pci_write_config_byte(dev, 0x54, reg54h & ~(hwif->channel ? 0xF0 : 0x0F)); | 247 | pci_write_config_byte(dev, 0x54, (reg54 & ~mask)); |
264 | spin_unlock_irqrestore(&ide_lock, flags); | 248 | spin_unlock_irqrestore(&ide_lock, flags); |
265 | } else { | 249 | } else if (!hwif->udma_four) { |
266 | u8 ata66 = 0; | 250 | u8 ata66 = 0, mask = hwif->channel ? 0x02 : 0x01; |
251 | |||
267 | pci_read_config_byte(hwif->pci_dev, 0x49, &ata66); | 252 | pci_read_config_byte(hwif->pci_dev, 0x49, &ata66); |
268 | if (!(hwif->udma_four)) | 253 | hwif->udma_four = (ata66 & mask) ? 0 : 1; |
269 | hwif->udma_four = (ata66&(hwif->channel?0x02:0x01))?0:1; | ||
270 | } | 254 | } |
271 | 255 | ||
272 | ide_setup_dma(hwif, dmabase, 8); | 256 | if (!noautodma) |
257 | hwif->autodma = 1; | ||
258 | hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma; | ||
273 | } | 259 | } |
274 | 260 | ||
275 | static int __devinit init_setup_aec62xx(struct pci_dev *dev, ide_pci_device_t *d) | 261 | static int __devinit init_setup_aec62xx(struct pci_dev *dev, ide_pci_device_t *d) |
@@ -296,7 +282,6 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
296 | .init_setup = init_setup_aec62xx, | 282 | .init_setup = init_setup_aec62xx, |
297 | .init_chipset = init_chipset_aec62xx, | 283 | .init_chipset = init_chipset_aec62xx, |
298 | .init_hwif = init_hwif_aec62xx, | 284 | .init_hwif = init_hwif_aec62xx, |
299 | .init_dma = init_dma_aec62xx, | ||
300 | .channels = 2, | 285 | .channels = 2, |
301 | .autodma = AUTODMA, | 286 | .autodma = AUTODMA, |
302 | .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, | 287 | .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, |
@@ -307,7 +292,6 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
307 | .init_setup = init_setup_aec62xx, | 292 | .init_setup = init_setup_aec62xx, |
308 | .init_chipset = init_chipset_aec62xx, | 293 | .init_chipset = init_chipset_aec62xx, |
309 | .init_hwif = init_hwif_aec62xx, | 294 | .init_hwif = init_hwif_aec62xx, |
310 | .init_dma = init_dma_aec62xx, | ||
311 | .channels = 2, | 295 | .channels = 2, |
312 | .autodma = NOAUTODMA, | 296 | .autodma = NOAUTODMA, |
313 | .bootable = OFF_BOARD, | 297 | .bootable = OFF_BOARD, |
@@ -317,7 +301,6 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
317 | .init_setup = init_setup_aec62xx, | 301 | .init_setup = init_setup_aec62xx, |
318 | .init_chipset = init_chipset_aec62xx, | 302 | .init_chipset = init_chipset_aec62xx, |
319 | .init_hwif = init_hwif_aec62xx, | 303 | .init_hwif = init_hwif_aec62xx, |
320 | .init_dma = init_dma_aec62xx, | ||
321 | .channels = 2, | 304 | .channels = 2, |
322 | .autodma = AUTODMA, | 305 | .autodma = AUTODMA, |
323 | .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, | 306 | .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, |
@@ -328,7 +311,6 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
328 | .init_setup = init_setup_aec6x80, | 311 | .init_setup = init_setup_aec6x80, |
329 | .init_chipset = init_chipset_aec62xx, | 312 | .init_chipset = init_chipset_aec62xx, |
330 | .init_hwif = init_hwif_aec62xx, | 313 | .init_hwif = init_hwif_aec62xx, |
331 | .init_dma = init_dma_aec62xx, | ||
332 | .channels = 2, | 314 | .channels = 2, |
333 | .autodma = AUTODMA, | 315 | .autodma = AUTODMA, |
334 | .bootable = OFF_BOARD, | 316 | .bootable = OFF_BOARD, |
@@ -338,7 +320,6 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
338 | .init_setup = init_setup_aec6x80, | 320 | .init_setup = init_setup_aec6x80, |
339 | .init_chipset = init_chipset_aec62xx, | 321 | .init_chipset = init_chipset_aec62xx, |
340 | .init_hwif = init_hwif_aec62xx, | 322 | .init_hwif = init_hwif_aec62xx, |
341 | .init_dma = init_dma_aec62xx, | ||
342 | .channels = 2, | 323 | .channels = 2, |
343 | .autodma = AUTODMA, | 324 | .autodma = AUTODMA, |
344 | .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, | 325 | .enablebits = {{0x4a,0x02,0x02}, {0x4a,0x04,0x04}}, |