Deleted Added
full compact
ata-dma.c (55333) ata-dma.c (56138)
1/*-
2 * Copyright (c) 1998,1999,2000 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 1998,1999,2000 S�ren Schmidt
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 55333 2000-01-03 10:26:59Z sos $
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 56138 2000-01-17 02:04:19Z sos $
29 */
30
31#include "pci.h"
32#include "apm.h"
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/buf.h>
36#include <sys/malloc.h>

--- 56 unchanged lines hidden (view full) ---

93 free(dmatab, M_DEVBUF);
94 return -1;
95 }
96 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab;
97
98 switch (scp->chiptype) {
99
100 case 0x71118086: /* Intel PIIX4 */
29 */
30
31#include "pci.h"
32#include "apm.h"
33#include <sys/param.h>
34#include <sys/systm.h>
35#include <sys/buf.h>
36#include <sys/malloc.h>

--- 56 unchanged lines hidden (view full) ---

93 free(dmatab, M_DEVBUF);
94 return -1;
95 }
96 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab;
97
98 switch (scp->chiptype) {
99
100 case 0x71118086: /* Intel PIIX4 */
101 case 0x71998086: /* Intel PIIX4 */
101 case 0x71998086: /* Intel PIIX4e */
102 case 0x24118086: /* Intel ICH */
103 case 0x24218086: /* Intel ICH0 */
102 if (udmamode >= 2) {
103 int32_t mask48, new48;
104
105 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
106 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
107 if (bootverbose)
104 if (udmamode >= 2) {
105 int32_t mask48, new48;
106
107 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
108 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
109 if (bootverbose)
108 printf("ata%d-%s: %s setting up UDMA2 mode on PIIX4 chip\n",
110 printf("ata%d-%s: %s setting up UDMA2 mode on %s chip\n",
109 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
111 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
110 (error) ? "failed" : "success");
112 (error) ? "failed" : "success",
113 (scp->chiptype == 0x24118086) ? "ICH" :
114 (scp->chiptype == 0x24218086) ? "ICH0" :"PIIX4");
111 if (!error) {
112 mask48 = (1 << devno) + (3 << (16 + (devno << 2)));
113 new48 = (1 << devno) + (2 << (16 + (devno << 2)));
114 pci_write_config(scp->dev, 0x48,
115 (pci_read_config(scp->dev, 0x48, 4) &
116 ~mask48) | new48, 4);
117 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
118 return 0;

--- 19 unchanged lines hidden (view full) ---

138 }
139 new40 |= 0x40004000;
140 pci_write_config(scp->dev, 0x40, new40, 4);
141 pci_write_config(scp->dev, 0x44, new44, 4);
142 }
143 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
144 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
145 if (bootverbose)
115 if (!error) {
116 mask48 = (1 << devno) + (3 << (16 + (devno << 2)));
117 new48 = (1 << devno) + (2 << (16 + (devno << 2)));
118 pci_write_config(scp->dev, 0x48,
119 (pci_read_config(scp->dev, 0x48, 4) &
120 ~mask48) | new48, 4);
121 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
122 return 0;

--- 19 unchanged lines hidden (view full) ---

142 }
143 new40 |= 0x40004000;
144 pci_write_config(scp->dev, 0x40, new40, 4);
145 pci_write_config(scp->dev, 0x44, new44, 4);
146 }
147 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
148 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
149 if (bootverbose)
146 printf("ata%d-%s: %s setting up WDMA2 mode on PIIX%s chip\n",
150 printf("ata%d-%s: %s setting up WDMA2 mode on %s chip\n",
147 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
148 (error) ? "failed" : "success",
151 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
152 (error) ? "failed" : "success",
149 (scp->chiptype == 0x70108086) ? "3" : "4");
153 (scp->chiptype == 0x70108086) ? "PIIX3" :
154 (scp->chiptype == 0x24118086) ? "ICH" :
155 (scp->chiptype == 0x24218086) ? "ICH0" :"PIIX4");
150 if (!error) {
151 if (device == ATA_MASTER) {
152 mask40 = 0x0000330f;
153 new40 = 0x00002307;
154 mask44 = 0;
155 new44 = 0;
156 }
157 else {

--- 88 unchanged lines hidden (view full) ---

246 return 0;
247 }
248 }
249 /* we could set PIO mode timings, but we assume the BIOS did that */
250 break;
251
252 case 0x05711106: /* VIA 82C571, 82C586, 82C596 & 82C686 */
253 case 0x74091022: /* AMD 756 */
156 if (!error) {
157 if (device == ATA_MASTER) {
158 mask40 = 0x0000330f;
159 new40 = 0x00002307;
160 mask44 = 0;
161 new44 = 0;
162 }
163 else {

--- 88 unchanged lines hidden (view full) ---

252 return 0;
253 }
254 }
255 /* we could set PIO mode timings, but we assume the BIOS did that */
256 break;
257
258 case 0x05711106: /* VIA 82C571, 82C586, 82C596 & 82C686 */
259 case 0x74091022: /* AMD 756 */
254 /* UDMA4 mode only on 82C686 and AMD 756 */
255 if ((udmamode >= 4 && ata_find_dev(scp->dev, 0x06861106)) ||
256 (udmamode >= 4 && scp->chiptype == 0x74091022)) {
257 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
260 /* UDMA modes on 82C686 */
261 if (ata_find_dev(scp->dev, 0x06861106)) {
262 if (udmamode >= 4) {
263 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
258 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
264 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
265 if (bootverbose)
266 printf("ata%d-%s: %s setting up UDMA4 mode on VIA chip\n",
267 scp->lun, (device == ATA_MASTER) ? "master":"slave",
268 (error) ? "failed" : "success");
269 if (!error) {
270 pci_write_config(scp->dev, 0x53 - devno, 0xe8, 1);
271 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA4;
272 return 0;
273 }
274 }
275 if (udmamode >= 2) {
276 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
277 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
278 if (bootverbose)
279 printf("ata%d-%s: %s setting up UDMA2 mode on VIA chip\n",
280 scp->lun, (device == ATA_MASTER) ? "master":"slave",
281 (error) ? "failed" : "success");
282 if (!error) {
283 pci_write_config(scp->dev, 0x53 - devno, 0xea, 1);
284 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
285 return 0;
286 }
287 }
288 }
289
290 /* UDMA4 mode on AMD 756 */
291 if (udmamode >= 4 && scp->chiptype == 0x74091022) {
292 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
293 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
259 if (bootverbose)
294 if (bootverbose)
260 printf("ata%d-%s: %s setting up UDMA4 mode on %s chip\n",
295 printf("ata%d-%s: %s setting up UDMA4 mode on AMD chip\n",
261 scp->lun, (device == ATA_MASTER) ? "master":"slave",
296 scp->lun, (device == ATA_MASTER) ? "master":"slave",
262 (error) ? "failed" : "success",
263 (scp->chiptype == 0x74091022) ? "AMD" : "VIA");
297 (error) ? "failed" : "success");
264 if (!error) {
265 pci_write_config(scp->dev, 0x53 - devno, 0xc3, 1);
266 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA4;
267 return 0;
268 }
269 }
270
298 if (!error) {
299 pci_write_config(scp->dev, 0x53 - devno, 0xc3, 1);
300 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA4;
301 return 0;
302 }
303 }
304
271 /* UDMA2 mode only on 82C586 > rev1, 82C596, 82C686, AMD 756 */
305 /* UDMA2 mode only on 82C586 > rev1, 82C596, AMD 756 */
272 if ((udmamode >= 2 && ata_find_dev(scp->dev, 0x05861106) &&
273 pci_read_config(scp->dev, 0x08, 1) >= 0x01) ||
274 (udmamode >= 2 && ata_find_dev(scp->dev, 0x05961106)) ||
306 if ((udmamode >= 2 && ata_find_dev(scp->dev, 0x05861106) &&
307 pci_read_config(scp->dev, 0x08, 1) >= 0x01) ||
308 (udmamode >= 2 && ata_find_dev(scp->dev, 0x05961106)) ||
275 (udmamode >= 2 && ata_find_dev(scp->dev, 0x06861106)) ||
276 (udmamode >= 2 && scp->chiptype == 0x74091022)) {
277 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
278 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
279 if (bootverbose)
280 printf("ata%d-%s: %s setting up UDMA2 mode on %s chip\n",
281 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
282 (error) ? "failed" : "success",
283 (scp->chiptype == 0x74091022) ? "AMD" : "VIA");
284 if (!error) {
285 pci_write_config(scp->dev, 0x53 - devno, 0xc0, 1);
286 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
287 return 0;
288 }
289 }
290 if (wdmamode >= 2 && apiomode >= 4) {
309 (udmamode >= 2 && scp->chiptype == 0x74091022)) {
310 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
311 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
312 if (bootverbose)
313 printf("ata%d-%s: %s setting up UDMA2 mode on %s chip\n",
314 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
315 (error) ? "failed" : "success",
316 (scp->chiptype == 0x74091022) ? "AMD" : "VIA");
317 if (!error) {
318 pci_write_config(scp->dev, 0x53 - devno, 0xc0, 1);
319 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_UDMA2;
320 return 0;
321 }
322 }
323 if (wdmamode >= 2 && apiomode >= 4) {
291 /* set WDMA2 mode timing */
292 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
293 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
294 if (bootverbose)
295 printf("ata%d-%s: %s setting up WDMA2 mode on %s chip\n",
296 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
297 (error) ? "failed" : "success",
298 (scp->chiptype == 0x74091022) ? "AMD" : "VIA");
299 if (!error) {

--- 367 unchanged lines hidden ---
324 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
325 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
326 if (bootverbose)
327 printf("ata%d-%s: %s setting up WDMA2 mode on %s chip\n",
328 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
329 (error) ? "failed" : "success",
330 (scp->chiptype == 0x74091022) ? "AMD" : "VIA");
331 if (!error) {

--- 367 unchanged lines hidden ---