]> git.pld-linux.org Git - packages/kernel.git/blame - ide.2.2.21_2.4.19pre7-VIA.patch
- ported from linux-2.4.25-atmdd.patch
[packages/kernel.git] / ide.2.2.21_2.4.19pre7-VIA.patch
CommitLineData
b55d2948
KT
1diff -urN linux.orig/drivers/ide/ide-timing.h linux/drivers/ide/ide-timing.h
2--- linux.orig/drivers/ide/ide-timing.h Sat Apr 20 18:05:49 2002
3+++ linux/drivers/ide/ide-timing.h Sat Apr 20 18:34:58 2002
4@@ -2,11 +2,9 @@
5 #define _IDE_TIMING_H
6
7 /*
8- * $Id$
9+ * $Id$
10 *
11- * Copyright (c) 1999-2000 Vojtech Pavlik
12- *
13- * Sponsored by SuSE
14+ * Copyright (c) 1999-2001 Vojtech Pavlik
15 */
16
17 /*
18@@ -25,16 +23,14 @@
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 *
21 * Should you need to contact me, the author, you can do so either by
22- * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
23- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
24+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
25+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
26 */
27
28 #include <linux/hdreg.h>
29
30-#ifndef XFER_PIO_5
31 #define XFER_PIO_5 0x0d
32 #define XFER_UDMA_SLOW 0x4f
33-#endif
34
35 struct ide_timing {
36 short mode;
37@@ -49,13 +45,15 @@
38 };
39
40 /*
41- * PIO 0-5, MWDMA 0-2 and UDMA 0-5 timings (in nanoseconds).
42+ * PIO 0-5, MWDMA 0-2 and UDMA 0-6 timings (in nanoseconds).
43 * These were taken from ATA/ATAPI-6 standard, rev 0a, except
44- * for PIO 5, which is a nonstandard extension.
45+ * for PIO 5, which is a nonstandard extension and UDMA6, which
46+ * is currently supported only by Maxtor drives.
47 */
48
49 static struct ide_timing ide_timing[] = {
50
51+ { XFER_UDMA_6, 0, 0, 0, 0, 0, 0, 0, 15 },
52 { XFER_UDMA_5, 0, 0, 0, 0, 0, 0, 0, 20 },
53 { XFER_UDMA_4, 0, 0, 0, 0, 0, 0, 0, 30 },
54 { XFER_UDMA_3, 0, 0, 0, 0, 0, 0, 0, 45 },
55@@ -105,6 +103,7 @@
56 #define EZ(v,unit) ((v)?ENOUGH(v,unit):0)
57
58 #define XFER_MODE 0xf0
59+#define XFER_UDMA_133 0x48
60 #define XFER_UDMA_100 0x44
61 #define XFER_UDMA_66 0x42
62 #define XFER_UDMA 0x40
63@@ -123,6 +122,9 @@
64
65 if ((map & XFER_UDMA) && (id->field_valid & 4)) { /* Want UDMA and UDMA bitmap valid */
66
67+ if ((map & XFER_UDMA_133) == XFER_UDMA_133)
68+ if ((best = (id->dma_ultra & 0x0040) ? XFER_UDMA_6 : 0)) return best;
69+
70 if ((map & XFER_UDMA_100) == XFER_UDMA_100)
71 if ((best = (id->dma_ultra & 0x0020) ? XFER_UDMA_5 : 0)) return best;
72
73@@ -174,14 +176,14 @@
74
75 static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int T, int UT)
76 {
77- q->setup = EZ(t->setup, T);
78- q->act8b = EZ(t->act8b, T);
79- q->rec8b = EZ(t->rec8b, T);
80- q->cyc8b = EZ(t->cyc8b, T);
81- q->active = EZ(t->active, T);
82- q->recover = EZ(t->recover, T);
83- q->cycle = EZ(t->cycle, T);
84- q->udma = EZ(t->udma, UT);
85+ q->setup = EZ(t->setup * 1000, T);
86+ q->act8b = EZ(t->act8b * 1000, T);
87+ q->rec8b = EZ(t->rec8b * 1000, T);
88+ q->cyc8b = EZ(t->cyc8b * 1000, T);
89+ q->active = EZ(t->active * 1000, T);
90+ q->recover = EZ(t->recover * 1000, T);
91+ q->cycle = EZ(t->cycle * 1000, T);
92+ q->udma = EZ(t->udma * 1000, UT);
93 }
94
95 static void ide_timing_merge(struct ide_timing *a, struct ide_timing *b, struct ide_timing *m, unsigned int what)
96diff -urN linux.orig/drivers/ide/via82cxxx.c linux/drivers/ide/via82cxxx.c
97--- linux.orig/drivers/ide/via82cxxx.c Sat Apr 20 18:05:49 2002
98+++ linux/drivers/ide/via82cxxx.c Sat Apr 20 18:25:33 2002
99@@ -1,5 +1,5 @@
100 /*
101- * $Id$
102+ * $Id$
103 * Backported to 2.2.21preX 2002/01/17 by Krzysztof Oledzki
104 *
105 * Copyright (c) 2000-2001 Vojtech Pavlik
106@@ -8,23 +8,21 @@
107 * Michel Aubry
108 * Jeff Garzik
109 * Andre Hedrick
110- *
111- * Sponsored by SuSE
112 */
113
114 /*
115 * VIA IDE driver for Linux. Supports
116 *
117 * vt82c576, vt82c586, vt82c586a, vt82c586b, vt82c596a, vt82c596b,
118- * vt82c686, vt82c686a, vt82c686b, vt8231, vt8233
119+ * vt82c686, vt82c686a, vt82c686b, vt8231, vt8233, vt8233c, vt8233a
120 *
121 * southbridges, which can be found in
122 *
123 * VIA Apollo Master, VP, VP2, VP2/97, VP3, VPX, VPX/97, MVP3, MVP4, P6, Pro,
124 * ProII, ProPlus, Pro133, Pro133+, Pro133A, Pro133A Dual, Pro133T, Pro133Z,
125 * PLE133, PLE133T, Pro266, Pro266T, ProP4X266, PM601, PM133, PN133, PL133T,
126- * PX266, PM266, KX133, KT133, KT133A, KLE133, KT266, KX266, KM133, KM133A,
127- * KL133, KN133, KM266
128+ * PX266, PM266, KX133, KT133, KT133A, KT133E, KLE133, KT266, KX266, KM133,
129+ * KM133A, KL133, KN133, KM266
130 * PC-Chips VXPro, VXPro+, VXTwo, TXPro-III, TXPro-AGP, AGPPro, ViaGra, BXToo,
131 * BXTel, BXpert
132 * AMD 640, 640 AGP, 750 IronGate, 760, 760MP
133@@ -33,9 +31,9 @@
134 *
135 * chipsets. Supports
136 *
137- * PIO 0-5, MWDMA 0-2, SWDMA 0-2 and UDMA 0-5
138+ * PIO 0-5, MWDMA 0-2, SWDMA 0-2 and UDMA 0-6
139 *
140- * (this includes UDMA33, 66 and 100) modes. UDMA66 and higher modes are
141+ * (this includes UDMA33, 66, 100 and 133) modes. UDMA66 and higher modes are
142 * autoenabled only in case the BIOS has detected a 80 wire cable. To ignore
143 * the BIOS data and assume the cable is present, use 'ide0=ata66' or
144 * 'ide1=ata66' on the kernel command line.
145@@ -57,8 +55,8 @@
146 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
147 *
148 * Should you need to contact me, the author, you can do so either by
149- * e-mail - mail your message to <vojtech@suse.cz>, or by paper mail:
150- * Vojtech Pavlik, Ucitelska 1576, Prague 8, 182 00 Czech Republic
151+ * e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
152+ * Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
153 */
154
155 #include <linux/config.h>
156@@ -90,10 +88,12 @@
157 #define VIA_UDMA_33 0x001
158 #define VIA_UDMA_66 0x002
159 #define VIA_UDMA_100 0x003
160+#define VIA_UDMA_133 0x004
161 #define VIA_BAD_PREQ 0x010 /* Crashes if PREQ# till DDACK# set */
162 #define VIA_BAD_CLK66 0x020 /* 66 MHz clock doesn't work correctly */
163 #define VIA_SET_FIFO 0x040 /* Needs to have FIFO split set */
164 #define VIA_NO_UNMASK 0x080 /* Doesn't work with IRQ unmasking on */
165+#define VIA_BAD_ID 0x100 /* Has wrong vendor ID (0x1107) */
166
167 /*
168 * VIA SouthBridge chips.
169@@ -107,10 +107,11 @@
170 unsigned short flags;
171 } via_isa_bridges[] = {
172 #ifdef FUTURE_BRIDGES
173- { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_100 },
174- { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_100 },
175- { "vt8233c", PCI_DEVICE_ID_VIA_8233C, 0x00, 0x2f, VIA_UDMA_100 },
176+ { "vt8237", PCI_DEVICE_ID_VIA_8237, 0x00, 0x2f, VIA_UDMA_133 },
177+ { "vt8235", PCI_DEVICE_ID_VIA_8235, 0x00, 0x2f, VIA_UDMA_133 },
178 #endif
179+ { "vt8233a", PCI_DEVICE_ID_VIA_8233A, 0x00, 0x2f, VIA_UDMA_133 },
180+ { "vt8233c", PCI_DEVICE_ID_VIA_8233C_0, 0x00, 0x2f, VIA_UDMA_100 },
181 { "vt8233", PCI_DEVICE_ID_VIA_8233_0, 0x00, 0x2f, VIA_UDMA_100 },
182 { "vt8231", PCI_DEVICE_ID_VIA_8231, 0x00, 0x2f, VIA_UDMA_100 },
183 { "vt82c686b", PCI_DEVICE_ID_VIA_82C686, 0x40, 0x4f, VIA_UDMA_100 },
184@@ -124,6 +125,7 @@
185 { "vt82c586a", PCI_DEVICE_ID_VIA_82C586_0, 0x20, 0x2f, VIA_UDMA_33 | VIA_SET_FIFO },
186 { "vt82c586", PCI_DEVICE_ID_VIA_82C586_0, 0x00, 0x0f, VIA_UDMA_NONE | VIA_SET_FIFO },
187 { "vt82c576", PCI_DEVICE_ID_VIA_82C576, 0x00, 0x2f, VIA_UDMA_NONE | VIA_SET_FIFO | VIA_NO_UNMASK },
188+ { "vt82c576", PCI_DEVICE_ID_VIA_82C576, 0x00, 0x2f, VIA_UDMA_NONE | VIA_SET_FIFO | VIA_NO_UNMASK | VIA_BAD_ID },
189 { NULL }
190 };
191
192@@ -131,7 +133,7 @@
193 static unsigned char via_enabled;
194 static unsigned int via_80w;
195 static unsigned int via_clock;
196-static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100" };
197+static char *via_dma[] = { "MWDMA16", "UDMA33", "UDMA66", "UDMA100", "UDMA133" };
198
199 /*
200 * VIA /proc entry.
201@@ -154,7 +156,7 @@
202
203 static int via_get_info(char *buffer, char **addr, off_t offset, int count, int dummy)
204 {
205- short speed[4], cycle[4], setup[4], active[4], recover[4], den[4],
206+ int speed[4], cycle[4], setup[4], active[4], recover[4], den[4],
207 uen[4], udma[4], umul[4], active8b[4], recover8b[4];
208 struct pci_dev *dev = bmide_dev;
209 unsigned int v, u, i;
210@@ -164,7 +166,7 @@
211
212 via_print("----------VIA BusMastering IDE Configuration----------------");
213
214- via_print("Driver Version: 3.29");
215+ via_print("Driver Version: 3.34");
216 via_print("South Bridge: VIA %s", via_config->name);
217
218 pci_read_config_byte(isa_dev, PCI_REVISION_ID, &t);
219@@ -173,7 +175,7 @@
220 via_print("Highest DMA rate: %s", via_dma[via_config->flags & VIA_UDMA]);
221
222 via_print("BM-DMA base: %#x", via_base);
223- via_print("PCI clock: %dMHz", via_clock);
224+ via_print("PCI clock: %d.%dMHz", via_clock / 1000, via_clock / 100 % 10);
225
226 pci_read_config_byte(dev, VIA_MISC_1, &t);
227 via_print("Master Read Cycle IRDY: %dws", (t & 64) >> 6);
228@@ -221,40 +223,46 @@
229 uen[i] = ((u >> ((3 - i) << 3)) & 0x20);
230 den[i] = (c & ((i & 1) ? 0x40 : 0x20) << ((i & 2) << 2));
231
232- speed[i] = 20 * via_clock / (active[i] + recover[i]);
233- cycle[i] = 1000 / via_clock * (active[i] + recover[i]);
234+ speed[i] = 2 * via_clock / (active[i] + recover[i]);
235+ cycle[i] = 1000000 * (active[i] + recover[i]) / via_clock;
236
237 if (!uen[i] || !den[i])
238 continue;
239
240 switch (via_config->flags & VIA_UDMA) {
241
242- case VIA_UDMA_100:
243- speed[i] = 60 * via_clock / udma[i];
244- cycle[i] = 333 / via_clock * udma[i];
245+
246+ case VIA_UDMA_33:
247+ speed[i] = 2 * via_clock / udma[i];
248+ cycle[i] = 1000000 * udma[i] / via_clock;
249 break;
250
251 case VIA_UDMA_66:
252- speed[i] = 40 * via_clock / (udma[i] * umul[i]);
253- cycle[i] = 500 / via_clock * (udma[i] * umul[i]);
254 break;
255+ speed[i] = 4 * via_clock / (udma[i] * umul[i]);
256+ cycle[i] = 500000 * (udma[i] * umul[i]) / via_clock;
257
258- case VIA_UDMA_33:
259- speed[i] = 20 * via_clock / udma[i];
260- cycle[i] = 1000 / via_clock * udma[i];
261+ case VIA_UDMA_100:
262+ speed[i] = 6 * via_clock / udma[i];
263+ cycle[i] = 333333 * udma[i] / via_clock;
264+ break;
265+
266+ case VIA_UDMA_133:
267+ speed[i] = 8 * via_clock / udma[i];
268+ cycle[i] = 250000 * udma[i] / via_clock;
269 break;
270 }
271 }
272
273 via_print_drive("Transfer Mode: ", "%10s", den[i] ? (uen[i] ? "UDMA" : "DMA") : "PIO");
274
275- via_print_drive("Address Setup: ", "%8dns", (1000 / via_clock) * setup[i]);
276- via_print_drive("Cmd Active: ", "%8dns", (1000 / via_clock) * active8b[i]);
277- via_print_drive("Cmd Recovery: ", "%8dns", (1000 / via_clock) * recover8b[i]);
278- via_print_drive("Data Active: ", "%8dns", (1000 / via_clock) * active[i]);
279- via_print_drive("Data Recovery: ", "%8dns", (1000 / via_clock) * recover[i]);
280+ via_print_drive("Address Setup: ", "%8dns", 1000000 * setup[i] / via_clock);
281+ via_print_drive("Cmd Active: ", "%8dns", 1000000 * active8b[i] / via_clock);
282+ via_print_drive("Cmd Recovery: ", "%8dns", 1000000 * recover8b[i] / via_clock);
283+ via_print_drive("Data Active: ", "%8dns", 1000000 * active[i] / via_clock);
284+ via_print_drive("Data Recovery: ", "%8dns", 1000000 * recover[i] / via_clock);
285 via_print_drive("Cycle Time: ", "%8dns", cycle[i]);
286- via_print_drive("Transfer Rate: ", "%4d.%dMB/s", speed[i] / 10, speed[i] % 10);
287+ via_print_drive("Transfer Rate: ", "%4d.%dMB/s", speed[i] / 1000, speed[i] / 100 % 10);
288
289 return p - buffer; /* hoping it is less than 4K... */
290 }
291@@ -283,6 +291,7 @@
292 case VIA_UDMA_33: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 5) - 2)) : 0x03; break;
293 case VIA_UDMA_66: t = timing->udma ? (0xe8 | (FIT(timing->udma, 2, 9) - 2)) : 0x0f; break;
294 case VIA_UDMA_100: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break;
295+ case VIA_UDMA_133: t = timing->udma ? (0xe0 | (FIT(timing->udma, 2, 9) - 2)) : 0x07; break;
296 default: return;
297 }
298
299@@ -299,20 +308,21 @@
300 {
301 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1);
302 struct ide_timing t, p;
303- int T, UT;
304+ unsigned int T, UT;
305
306 if (speed != XFER_PIO_SLOW && speed != drive->current_speed)
307 if (ide_config_drive_speed(drive, speed))
308 printk(KERN_WARNING "ide%d: Drive %d didn't accept speed setting. Oh, well.\n",
309 drive->dn >> 1, drive->dn & 1);
310
311- T = 1000 / via_clock;
312+ T = 1000000000 / via_clock;
313
314 switch (via_config->flags & VIA_UDMA) {
315 case VIA_UDMA_33: UT = T; break;
316 case VIA_UDMA_66: UT = T/2; break;
317 case VIA_UDMA_100: UT = T/3; break;
318- default: UT = T; break;
319+ case VIA_UDMA_133: UT = T/4; break;
320+ default: UT = T;
321 }
322
323 ide_timing_compute(drive, speed, &t, T, UT);
324@@ -368,7 +378,8 @@
325 XFER_PIO | XFER_EPIO | XFER_SWDMA | XFER_MWDMA |
326 (via_config->flags & VIA_UDMA ? XFER_UDMA : 0) |
327 (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_66 ? XFER_UDMA_66 : 0) |
328- (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0));
329+ (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_100 ? XFER_UDMA_100 : 0) |
330+ (w80 && (via_config->flags & VIA_UDMA) >= VIA_UDMA_133 ? XFER_UDMA_133 : 0));
331
332 via_set_drive(drive, speed);
333
334@@ -398,14 +409,16 @@
335 */
336
337 for (via_config = via_isa_bridges; via_config->id; via_config++)
338- if ((isa = pci_find_device(PCI_VENDOR_ID_VIA, via_config->id, NULL))) {
339+ if ((isa = pci_find_device(PCI_VENDOR_ID_VIA +
340+ !!(via_config->flags & VIA_BAD_ID), via_config->id, NULL))) {
341+
342 pci_read_config_byte(isa, PCI_REVISION_ID, &t);
343 if (t >= via_config->rev_min && t <= via_config->rev_max)
344 break;
345 }
346
347 if (!via_config->id) {
348- printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, contact Vojtech Pavlik <vojtech@suse.cz>\n");
349+ printk(KERN_WARNING "VP_IDE: Unknown VIA SouthBridge, contact Vojtech Pavlik <vojtech@ucw.cz>\n");
350 return -ENODEV;
351 }
352
353@@ -415,22 +428,28 @@
354
355 switch (via_config->flags & VIA_UDMA) {
356
357- case VIA_UDMA_100:
358-
359- pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);
360- for (i = 24; i >= 0; i -= 8)
361- if (((u >> i) & 0x10) || (((u >> i) & 0x20) && (((u >> i) & 7) < 3)))
362- via_80w |= (1 << (1 - (i >> 4))); /* BIOS 80-wire bit or UDMA w/ < 50ns/cycle */
363- break;
364-
365 case VIA_UDMA_66:
366-
367 pci_read_config_dword(dev, VIA_UDMA_TIMING, &u); /* Enable Clk66 */
368 pci_write_config_dword(dev, VIA_UDMA_TIMING, u | 0x80008);
369 for (i = 24; i >= 0; i -= 8)
370 if (((u >> (i & 16)) & 8) && ((u >> i) & 0x20) && (((u >> i) & 7) < 2))
371 via_80w |= (1 << (1 - (i >> 4))); /* 2x PCI clock and UDMA w/ < 3T/cycle */
372 break;
373+
374+ case VIA_UDMA_100:
375+ pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);
376+ for (i = 24; i >= 0; i -= 8)
377+ if (((u >> i) & 0x10) || (((u >> i) & 0x20) && (((u >> i) & 7) < 4)))
378+ via_80w |= (1 << (1 - (i >> 4))); /* BIOS 80-wire bit or UDMA w/ < 60ns/cycle */
379+ break;
380+
381+ case VIA_UDMA_133:
382+ pci_read_config_dword(dev, VIA_UDMA_TIMING, &u);
383+ for (i = 24; i >= 0; i -= 8)
384+ if (((u >> i) & 0x10) || (((u >> i) & 0x20) && (((u >> i) & 7) < 8)))
385+ via_80w |= (1 << (1 - (i >> 4))); /* BIOS 80-wire bit or UDMA w/ < 60ns/cycle */
386+ break;
387+
388 }
389
390 if (via_config->flags & VIA_BAD_CLK66) { /* Disable Clk66 */
391@@ -469,11 +488,18 @@
392 * Determine system bus clock.
393 */
394
395- via_clock = system_bus_clock();
396- if (via_clock < 20 || via_clock > 50) {
397+ via_clock = system_bus_clock() * 1000;
398+
399+ switch (via_clock) {
400+ case 33000: via_clock = 33333; break;
401+ case 37000: via_clock = 37500; break;
402+ case 41000: via_clock = 41666; break;
403+ }
404+
405+ if (via_clock < 20000 || via_clock > 50000) {
406 printk(KERN_WARNING "VP_IDE: User given PCI clock speed impossible (%d), using 33 MHz instead.\n", via_clock);
407- printk(KERN_WARNING "VP_IDE: Use ide0=ata66 if you want to force UDMA66/UDMA100.\n");
408- via_clock = 33;
409+ printk(KERN_WARNING "VP_IDE: Use ide0=ata66 if you want to assume 80-wire cable.\n");
410+ via_clock = 33333;
411 }
412
413 /*
414diff -urN linux.orig/include/linux/pci.h linux/include/linux/pci.h
415--- linux.orig/include/linux/pci.h Sat Apr 20 18:05:50 2002
416+++ linux/include/linux/pci.h Sat Apr 20 18:28:52 2002
417@@ -935,10 +935,9 @@
418 #define PCI_DEVICE_ID_VIA_82C686_6 0x3068
419 #define PCI_DEVICE_ID_VIA_8233_0 0x3074
420 #define PCI_DEVICE_ID_VIA_8233C_0 0x3109
421-#define PCI_DEVICE_ID_VIA_8633_0 0x3091
422-#define PCI_DEVICE_ID_VIA_8367_0 0x3099
423 #define PCI_DEVICE_ID_VIA_8622 0x3102
424 #define PCI_DEVICE_ID_VIA_8361 0x3112
425+#define PCI_DEVICE_ID_VIA_8233A 0x3147
426 #define PCI_DEVICE_ID_VIA_86C100A 0x6100
427 #define PCI_DEVICE_ID_VIA_8231 0x8231
428 #define PCI_DEVICE_ID_VIA_8231_4 0x8235
This page took 0.17909 seconds and 4 git commands to generate.