]>
Commit | Line | Data |
---|---|---|
b55d2948 KT |
1 | diff -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) | |
96 | diff -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 | /* | |
414 | diff -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 |