aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-26 16:25:22 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-04-26 16:25:22 -0400
commitf629b38beddf2ff8bc3fda1754bbd6cc7d3acc03 (patch)
tree0e5c4b222c2df6aa4fab5dd1bf5bc2e936a47979
parent63158d5c217e2e62665ae9b10d203bd7da817108 (diff)
au1xxx-ide: fix MWDMA support
Always use "fast" MWDMA support and remove dma_{black,white}_list (they were based on completely bogus ->ide_dma_check implementation which didn't set neither the host controller timings nor the device for the desired transfer mode). Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
-rw-r--r--Documentation/mips/AU1xxx_IDE.README46
-rw-r--r--drivers/ide/mips/au1xxx-ide.c49
-rw-r--r--include/asm-mips/mach-au1x00/au1xxx_ide.h42
3 files changed, 2 insertions, 135 deletions
diff --git a/Documentation/mips/AU1xxx_IDE.README b/Documentation/mips/AU1xxx_IDE.README
index 5c8334123f4f..25a6ed1aaa5b 100644
--- a/Documentation/mips/AU1xxx_IDE.README
+++ b/Documentation/mips/AU1xxx_IDE.README
@@ -46,8 +46,6 @@ Two files are introduced:
46 46
47 a) 'include/asm-mips/mach-au1x00/au1xxx_ide.h' 47 a) 'include/asm-mips/mach-au1x00/au1xxx_ide.h'
48 containes : struct _auide_hwif 48 containes : struct _auide_hwif
49 struct drive_list_entry dma_white_list
50 struct drive_list_entry dma_black_list
51 timing parameters for PIO mode 0/1/2/3/4 49 timing parameters for PIO mode 0/1/2/3/4
52 timing parameters for MWDMA 0/1/2 50 timing parameters for MWDMA 0/1/2
53 51
@@ -63,12 +61,6 @@ Four configs variables are introduced:
63 CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ - maximum transfer size 61 CONFIG_BLK_DEV_IDE_AU1XXX_SEQTS_PER_RQ - maximum transfer size
64 per descriptor 62 per descriptor
65 63
66If MWDMA is enabled and the connected hard disc is not on the white list, the
67kernel switches to a "safe mwdma mode" at boot time. In this mode the IDE
68performance is substantial slower then in full speed mwdma. In this case
69please add your hard disc to the white list (follow instruction from 'ADD NEW
70HARD DISC TO WHITE OR BLACK LIST' section).
71
72 64
73SUPPORTED IDE MODES 65SUPPORTED IDE MODES
74------------------- 66-------------------
@@ -120,44 +112,6 @@ CONFIG_IDEDMA_AUTO=y
120Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to 112Also undefine 'IDE_AU1XXX_BURSTMODE' in 'drivers/ide/mips/au1xxx-ide.c' to
121disable the burst support on DBDMA controller. 113disable the burst support on DBDMA controller.
122 114
123ADD NEW HARD DISC TO WHITE OR BLACK LIST
124----------------------------------------
125
126Step 1 : detect the model name of your hard disc
127
128 a) connect your hard disc to the AU1XXX
129
130 b) boot your kernel and get the hard disc model.
131
132 Example boot log:
133
134 --snipped--
135 Uniform Multi-Platform E-IDE driver Revision: 7.00alpha2
136 ide: Assuming 50MHz system bus speed for PIO modes; override with idebus=xx
137 Au1xxx IDE(builtin) configured for MWDMA2
138 Probing IDE interface ide0...
139 hda: Maxtor 6E040L0, ATA DISK drive
140 ide0 at 0xac800000-0xac800007,0xac8001c0 on irq 64
141 hda: max request size: 64KiB
142 hda: 80293248 sectors (41110 MB) w/2048KiB Cache, CHS=65535/16/63, (U)DMA
143 --snipped--
144
145 In this example 'Maxtor 6E040L0'.
146
147Step 2 : edit 'include/asm-mips/mach-au1x00/au1xxx_ide.h'
148
149 Add your hard disc to the dma_white_list or dma_black_list structur.
150
151Step 3 : Recompile the kernel
152
153 Enable MWDMA support in the kernel configuration. Recompile the kernel and
154 reboot.
155
156Step 4 : Tests
157
158 If you have add a hard disc to the white list, please run some stress tests
159 for verification.
160
161 115
162ACKNOWLEDGMENTS 116ACKNOWLEDGMENTS
163--------------- 117---------------
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c
index 7179d4953211..d2e926efd3cc 100644
--- a/drivers/ide/mips/au1xxx-ide.c
+++ b/drivers/ide/mips/au1xxx-ide.c
@@ -47,7 +47,6 @@
47#define IDE_AU1XXX_BURSTMODE 1 47#define IDE_AU1XXX_BURSTMODE 1
48 48
49static _auide_hwif auide_hwif; 49static _auide_hwif auide_hwif;
50static int dbdma_init_done;
51 50
52static int auide_ddma_init(_auide_hwif *auide); 51static int auide_ddma_init(_auide_hwif *auide);
53 52
@@ -315,35 +314,6 @@ static int auide_dma_setup(ide_drive_t *drive)
315 return 0; 314 return 0;
316} 315}
317 316
318static u8 auide_mdma_filter(ide_drive_t *drive)
319{
320 /*
321 * FIXME: ->white_list and ->black_list are based on completely bogus
322 * ->ide_dma_check implementation which didn't set neither the host
323 * controller timings nor the device for the desired transfer mode.
324 *
325 * They should be either removed or 0x00 MWDMA mask should be
326 * returned for devices on the ->black_list.
327 */
328
329 if (dbdma_init_done == 0) {
330 auide_hwif.white_list = ide_in_drive_list(drive->id,
331 dma_white_list);
332 auide_hwif.black_list = ide_in_drive_list(drive->id,
333 dma_black_list);
334 auide_hwif.drive = drive;
335 auide_ddma_init(&auide_hwif);
336 dbdma_init_done = 1;
337 }
338
339 /* Is the drive in our DMA black list? */
340 if (auide_hwif.black_list)
341 printk(KERN_WARNING "%s: Disabling DMA for %s (blacklisted)\n",
342 drive->name, drive->id->model);
343
344 return drive->hwif->mwdma_mask;
345}
346
347static int auide_dma_test_irq(ide_drive_t *drive) 317static int auide_dma_test_irq(ide_drive_t *drive)
348{ 318{
349 if (drive->waiting_for_dma == 0) 319 if (drive->waiting_for_dma == 0)
@@ -420,17 +390,8 @@ static int auide_ddma_init(_auide_hwif *auide) {
420 390
421 dev_id = AU1XXX_ATA_DDMA_REQ; 391 dev_id = AU1XXX_ATA_DDMA_REQ;
422 392
423 if (auide->white_list || auide->black_list) { 393 tsize = 8; /* 1 */
424 tsize = 8; 394 devwidth = 32; /* 16 */
425 devwidth = 32;
426 }
427 else {
428 tsize = 1;
429 devwidth = 16;
430
431 printk(KERN_ERR "au1xxx-ide: %s is not on ide driver whitelist.\n",auide_hwif.drive->id->model);
432 printk(KERN_ERR " please read 'Documentation/mips/AU1xxx_IDE.README'");
433 }
434 395
435#ifdef IDE_AU1XXX_BURSTMODE 396#ifdef IDE_AU1XXX_BURSTMODE
436 flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE; 397 flags = DEV_FLAGS_SYNC | DEV_FLAGS_BURSTABLE;
@@ -546,9 +507,6 @@ static void auide_setup_ports(hw_regs_t *hw, _auide_hwif *ahwif)
546static const struct ide_port_ops au1xxx_port_ops = { 507static const struct ide_port_ops au1xxx_port_ops = {
547 .set_pio_mode = au1xxx_set_pio_mode, 508 .set_pio_mode = au1xxx_set_pio_mode,
548 .set_dma_mode = auide_set_dma_mode, 509 .set_dma_mode = auide_set_dma_mode,
549#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
550 .mdma_filter = auide_mdma_filter,
551#endif
552}; 510};
553 511
554static const struct ide_port_info au1xxx_port_info = { 512static const struct ide_port_info au1xxx_port_info = {
@@ -648,10 +606,7 @@ static int au_ide_probe(struct device *dev)
648 auide_hwif.hwif = hwif; 606 auide_hwif.hwif = hwif;
649 hwif->hwif_data = &auide_hwif; 607 hwif->hwif_data = &auide_hwif;
650 608
651#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_PIO_DBDMA
652 auide_ddma_init(&auide_hwif); 609 auide_ddma_init(&auide_hwif);
653 dbdma_init_done = 1;
654#endif
655 610
656 idx[0] = hwif->index; 611 idx[0] = hwif->index;
657 612
diff --git a/include/asm-mips/mach-au1x00/au1xxx_ide.h b/include/asm-mips/mach-au1x00/au1xxx_ide.h
index 89655c0cdcd6..b493a5e46c63 100644
--- a/include/asm-mips/mach-au1x00/au1xxx_ide.h
+++ b/include/asm-mips/mach-au1x00/au1xxx_ide.h
@@ -70,7 +70,6 @@ typedef struct
70 ide_hwif_t *hwif; 70 ide_hwif_t *hwif;
71#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA 71#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
72 ide_drive_t *drive; 72 ide_drive_t *drive;
73 u8 white_list, black_list;
74 struct dbdma_cmd *dma_table_cpu; 73 struct dbdma_cmd *dma_table_cpu;
75 dma_addr_t dma_table_dma; 74 dma_addr_t dma_table_dma;
76#endif 75#endif
@@ -81,47 +80,6 @@ typedef struct
81#endif 80#endif
82} _auide_hwif; 81} _auide_hwif;
83 82
84#ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA
85/* HD white list */
86static const struct drive_list_entry dma_white_list [] = {
87/*
88 * Hitachi
89 */
90 { "HITACHI_DK14FA-20" , NULL },
91 { "HTS726060M9AT00" , NULL },
92/*
93 * Maxtor
94 */
95 { "Maxtor 6E040L0" , NULL },
96 { "Maxtor 6Y080P0" , NULL },
97 { "Maxtor 6Y160P0" , NULL },
98/*
99 * Seagate
100 */
101 { "ST3120026A" , NULL },
102 { "ST320014A" , NULL },
103 { "ST94011A" , NULL },
104 { "ST340016A" , NULL },
105/*
106 * Western Digital
107 */
108 { "WDC WD400UE-00HCT0" , NULL },
109 { "WDC WD400JB-00JJC0" , NULL },
110 { NULL , NULL }
111};
112
113/* HD black list */
114static const struct drive_list_entry dma_black_list [] = {
115/*
116 * Western Digital
117 */
118 { "WDC WD100EB-00CGH0" , NULL },
119 { "WDC WD200BB-00AUA1" , NULL },
120 { "WDC AC24300L" , NULL },
121 { NULL , NULL }
122};
123#endif
124
125/******************************************************************************* 83/*******************************************************************************
126* PIO Mode timing calculation : * 84* PIO Mode timing calculation : *
127* * 85* *