Deleted Added
full compact
ata-dma.c (54594) ata-dma.c (54969)
1/*-
2 * Copyright (c) 1998,1999 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 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 54594 1999-12-14 10:25:28Z sos $
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 54969 1999-12-21 20:18:56Z 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>

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

59#endif
60
61#if NPCI > 0
62
63int32_t
64ata_dmainit(struct ata_softc *scp, int32_t device,
65 int32_t apiomode, int32_t wdmamode, int32_t udmamode)
66{
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>

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

59#endif
60
61#if NPCI > 0
62
63int32_t
64ata_dmainit(struct ata_softc *scp, int32_t device,
65 int32_t apiomode, int32_t wdmamode, int32_t udmamode)
66{
67 int32_t type, devno, error;
67 int32_t type, error;
68 int32_t devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1);
68 void *dmatab;
69
70 if (!scp->bmaddr)
71 return -1;
69 void *dmatab;
70
71 if (!scp->bmaddr)
72 return -1;
72#ifdef ATA_DMADEBUG
73 printf("ata%d: dmainit: ioaddr=0x%x altioaddr=0x%x, bmaddr=0x%x\n",
74 scp->lun, scp->ioaddr, scp->altioaddr, scp->bmaddr);
75#endif
76
77 /* if simplex controller, only allow DMA on primary channel */
78 if (scp->unit == 1) {
79 outb(scp->bmaddr + ATA_BMSTAT_PORT, inb(scp->bmaddr + ATA_BMSTAT_PORT) &
80 (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE));
81 if (inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_DMA_SIMPLEX) {
82 printf("ata%d: simplex device, DMA on primary channel only\n",
83 scp->lun);
84 return -1;
85 }
86 }
87
88 if (!(dmatab = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT)))
89 return -1;
90
91 if (((uintptr_t)dmatab >> PAGE_SHIFT) ^
92 (((uintptr_t)dmatab + PAGE_SIZE - 1) >> PAGE_SHIFT)) {
73
74 /* if simplex controller, only allow DMA on primary channel */
75 if (scp->unit == 1) {
76 outb(scp->bmaddr + ATA_BMSTAT_PORT, inb(scp->bmaddr + ATA_BMSTAT_PORT) &
77 (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE));
78 if (inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_DMA_SIMPLEX) {
79 printf("ata%d: simplex device, DMA on primary channel only\n",
80 scp->lun);
81 return -1;
82 }
83 }
84
85 if (!(dmatab = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT)))
86 return -1;
87
88 if (((uintptr_t)dmatab >> PAGE_SHIFT) ^
89 (((uintptr_t)dmatab + PAGE_SIZE - 1) >> PAGE_SHIFT)) {
93 printf("ata_dmainit: dmatab crosses page boundary, no DMA\n");
90 printf("ata%d-%s: dmatab crosses page boundary, no DMA\n",
91 scp->lun, (device == ATA_MASTER) ? "master" : "slave");
94 free(dmatab, M_DEVBUF);
95 return -1;
96 }
97 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab;
98
99 switch (type = pci_get_devid(scp->dev)) {
100
101 case 0x71118086: /* Intel PIIX4 */
92 free(dmatab, M_DEVBUF);
93 return -1;
94 }
95 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab;
96
97 switch (type = pci_get_devid(scp->dev)) {
98
99 case 0x71118086: /* Intel PIIX4 */
100 case 0x71998086: /* Intel PIIX4 */
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)
101 if (udmamode >= 2) {
102 int32_t mask48, new48;
103
104 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
105 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
106 if (bootverbose)
108 printf("ata%d: %s: %s setting up UDMA2 mode on PIIX4 chip\n",
107 printf("ata%d-%s: %s setting up UDMA2 mode on PIIX4 chip\n",
109 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
110 (error) ? "failed" : "success");
111 if (!error) {
108 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
109 (error) ? "failed" : "success");
110 if (!error) {
112 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1);
113 mask48 = (1 << devno) + (3 << (16 + (devno << 2)));
114 new48 = (1 << devno) + (2 << (16 + (devno << 2)));
115 pci_write_config(scp->dev, 0x48,
116 (pci_read_config(scp->dev, 0x48, 4) &
117 ~mask48) | new48, 4);
118 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
119 return 0;
120 }

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

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

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

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

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

189 /* Check for timing config usable for DMA on controller */
190 if (!((word40 & 0x3300) == 0x2300 &&
191 ((word40 >> (device == ATA_MASTER ? 0 : 4)) & 1) == 1))
192 break;
193
194 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
195 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
196 if (bootverbose)
149 if (!error) {
150 if (device == ATA_MASTER) {
151 mask40 = 0x0000330f;
152 new40 = 0x00002307;
153 mask44 = 0;
154 new44 = 0;
155 }
156 else {

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

188 /* Check for timing config usable for DMA on controller */
189 if (!((word40 & 0x3300) == 0x2300 &&
190 ((word40 >> (device == ATA_MASTER ? 0 : 4)) & 1) == 1))
191 break;
192
193 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
194 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
195 if (bootverbose)
197 printf("ata%d: %s: %s setting up WDMA2 mode on PIIX chip\n",
196 printf("ata%d-%s: %s setting up WDMA2 mode on PIIX chip\n",
198 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
199 (error) ? "failed" : "success");
200 if (!error) {
201 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
202 return 0;
203 }
204 }
205 break;

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

212 break;
213 }
214 if (udmamode >= 2) {
215 int32_t word54 = pci_read_config(scp->dev, 0x54, 4);
216
217 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
218 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
219 if (bootverbose)
197 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
198 (error) ? "failed" : "success");
199 if (!error) {
200 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
201 return 0;
202 }
203 }
204 break;

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

211 break;
212 }
213 if (udmamode >= 2) {
214 int32_t word54 = pci_read_config(scp->dev, 0x54, 4);
215
216 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
217 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
218 if (bootverbose)
220 printf("ata%d: %s: %s setting up UDMA2 mode on Aladdin chip\n",
219 printf("ata%d-%s: %s setting up UDMA2 mode on Aladdin chip\n",
221 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
222 (error) ? "failed" : "success");
223 if (!error) {
224 word54 |= 0x5555;
225 word54 |= (0x0a << (16 + (scp->unit << 3) + (device << 2)));
226 pci_write_config(scp->dev, 0x54, word54, 4);
227 pci_write_config(scp->dev, 0x53,
228 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1);
229 scp->flags |= ATA_ATAPI_DMA_RO;
230 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
231 return 0;
232 }
233 }
234 if (wdmamode >= 2 && apiomode >= 4) {
235 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
236 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
237 if (bootverbose)
220 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
221 (error) ? "failed" : "success");
222 if (!error) {
223 word54 |= 0x5555;
224 word54 |= (0x0a << (16 + (scp->unit << 3) + (device << 2)));
225 pci_write_config(scp->dev, 0x54, word54, 4);
226 pci_write_config(scp->dev, 0x53,
227 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1);
228 scp->flags |= ATA_ATAPI_DMA_RO;
229 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
230 return 0;
231 }
232 }
233 if (wdmamode >= 2 && apiomode >= 4) {
234 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
235 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
236 if (bootverbose)
238 printf("ata%d: %s: %s setting up WDMA2 mode on Aladdin chip\n",
237 printf("ata%d-%s: %s setting up WDMA2 mode on Aladdin chip\n",
239 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
240 (error) ? "failed" : "success");
241 if (!error) {
242 pci_write_config(scp->dev, 0x53,
243 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1);
244 scp->flags |= ATA_ATAPI_DMA_RO;
245 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
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 Apollo 82C571 / 82C586 / 82C686 */
238 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
239 (error) ? "failed" : "success");
240 if (!error) {
241 pci_write_config(scp->dev, 0x53,
242 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1);
243 scp->flags |= ATA_ATAPI_DMA_RO;
244 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
245 return 0;
246 }
247 }
248 /* we could set PIO mode timings, but we assume the BIOS did that */
249 break;
250
251 case 0x05711106: /* VIA Apollo 82C571 / 82C586 / 82C686 */
253 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1);
254
255 /* UDMA4 mode only on VT82C686 hardware */
256 if (udmamode >= 4 && ata_find_dev(scp->dev, 0x06861106)) {
257 int8_t byte = pci_read_config(scp->dev, 0x53 - devno, 1);
258
259 /* enable UDMA transfer modes setting by SETFEATURES cmd */
260 pci_write_config(scp->dev, 0x53 - devno, (byte & 0x1c) | 0x40, 1);
252 case 0x74091022: /* AMD 756 */
253 /* UDMA4 mode only on 82C686 / AMD 756 hardware */
254 if ((udmamode >= 4 && ata_find_dev(scp->dev, 0x06861106)) ||
255 (udmamode >= 4 && type == 0x74091022)) {
261 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
262 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
263 if (bootverbose)
256 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
257 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
258 if (bootverbose)
264 printf("ata%d: %s: %s setting up UDMA4 mode on VIA chip\n",
259 printf("ata%d-%s: %s setting up UDMA4 mode on %s chip\n",
265 scp->lun, (device == ATA_MASTER) ? "master":"slave",
260 scp->lun, (device == ATA_MASTER) ? "master":"slave",
266 (error) ? "failed" : "success");
261 (error) ? "failed" : "success",
262 (type == 0x74091022) ? "AMD" : "VIA");
267 if (!error) {
263 if (!error) {
264 pci_write_config(scp->dev, 0x53 - devno, 0xc3, 1);
268 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
269 return 0;
270 }
265 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
266 return 0;
267 }
271 pci_write_config(scp->dev, 0x53 - devno, byte, 1);
272 }
273
268 }
269
274 /* UDMA2 mode only on rev 1 and better 82C586 & 82C586 chips */
275 if (udmamode >= 2 && pci_read_config(scp->dev, 0x08, 1) >= 0x01 &&
276 (ata_find_dev(scp->dev, 0x05861106) ||
277 ata_find_dev(scp->dev, 0x06861106))) {
278 int8_t byte = pci_read_config(scp->dev, 0x53 - devno, 1);
279
280 /* enable UDMA transfer modes setting by SETFEATURES cmd */
281 pci_write_config(scp->dev, 0x53 - devno, (byte & 0x1c) | 0x40, 1);
270 /* UDMA2 mode only on 82C686 and AMD 756 and rev 1 and better 82C586 */
271 if ((udmamode >= 2 && ata_find_dev(scp->dev, 0x06861106)) ||
272 (udmamode >= 2 && type == 0x74091022) ||
273 (udmamode >= 2 && ata_find_dev(scp->dev, 0x05861106) &&
274 pci_read_config(scp->dev, 0x08, 1) >= 0x01)) {
282 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
283 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
284 if (bootverbose)
275 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
276 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
277 if (bootverbose)
285 printf("ata%d: %s: %s setting up UDMA2 mode on VIA chip\n",
278 printf("ata%d-%s: %s setting up UDMA2 mode on %s chip\n",
286 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
279 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
287 (error) ? "failed" : "success");
280 (error) ? "failed" : "success",
281 (type == 0x74091022) ? "AMD" : "VIA");
288 if (!error) {
282 if (!error) {
289 if ((device == ATA_MASTER && scp->devices & ATA_ATA_MASTER) ||
290 (device == ATA_SLAVE && scp->devices & ATA_ATA_SLAVE)) {
291 struct ata_params *ap = ((struct ad_softc *)
292 (scp->dev_softc[(device==ATA_MASTER)?0:1]))->ata_parm;
293
294 if (ata_find_dev(scp->dev, 0x06861106) &&
295 (ap->udmamodes & 0x10) && !ap->cblid) {
296 pci_write_config(scp->dev, 0x53 - devno,
297 (byte & 0x1c) | 0x42, 1);
298 }
299 }
283 pci_write_config(scp->dev, 0x53 - devno, 0xc0, 1);
300 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
301 return 0;
302 }
284 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
285 return 0;
286 }
303 pci_write_config(scp->dev, 0x53 - devno, byte, 1);
304 }
305 if (wdmamode >= 2 && apiomode >= 4) {
306 /* set WDMA2 mode timing */
287 }
288 if (wdmamode >= 2 && apiomode >= 4) {
289 /* set WDMA2 mode timing */
307 pci_write_config(scp->dev, 0x4b - devno, 0x31 , 1);
308
309 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
310 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
311 if (bootverbose)
290
291 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
292 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
293 if (bootverbose)
312 printf("ata%d: %s: %s setting up WDMA2 mode on VIA chip\n",
294 printf("ata%d-%s: %s setting up WDMA2 mode on %s chip\n",
313 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
295 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
314 (error) ? "failed" : "success");
296 (error) ? "failed" : "success",
297 (type == 0x74091022) ? "AMD" : "VIA");
315 if (!error) {
298 if (!error) {
299 pci_write_config(scp->dev, 0x53 - devno, 0x82, 1);
300 pci_write_config(scp->dev, 0x4b - devno, 0x31, 1);
316 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
317 return 0;
318 }
319 }
320 /* we could set PIO mode timings, but we assume the BIOS did that */
321 break;
322
323 case 0x55131039: /* SiS 5591 */
301 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
302 return 0;
303 }
304 }
305 /* we could set PIO mode timings, but we assume the BIOS did that */
306 break;
307
308 case 0x55131039: /* SiS 5591 */
324 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1);
325 if (udmamode >= 2) {
326 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
327 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
328 if (bootverbose)
309 if (udmamode >= 2) {
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)
329 printf("ata%d: %s: %s setting up UDMA2 mode on SiS chip\n",
313 printf("ata%d-%s: %s setting up UDMA2 mode on SiS chip\n",
330 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
331 (error) ? "failed" : "success");
332 if (!error) {
333 pci_write_config(scp->dev, 0x40 + (devno << 1), 0xa301, 2);
334 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
335 return 0;
336 }
337 }
338 if (wdmamode >=2 && apiomode >= 4) {
339 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
340 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
341 if (bootverbose)
314 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
315 (error) ? "failed" : "success");
316 if (!error) {
317 pci_write_config(scp->dev, 0x40 + (devno << 1), 0xa301, 2);
318 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
319 return 0;
320 }
321 }
322 if (wdmamode >=2 && apiomode >= 4) {
323 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
324 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
325 if (bootverbose)
342 printf("ata%d: %s: %s setting up WDMA2 mode on SiS chip\n",
326 printf("ata%d-%s: %s setting up WDMA2 mode on SiS chip\n",
343 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
344 (error) ? "failed" : "success");
345 if (!error) {
346 pci_write_config(scp->dev, 0x40 + (devno << 1), 0x0301, 2);
347 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
348 return 0;
349 }
350 }
351 /* we could set PIO mode timings, but we assume the BIOS did that */
352 break;
353
354 case 0x4d33105a: /* Promise Ultra33 / FastTrak33 controllers */
355 case 0x4d38105a: /* Promise Ultra66 / FastTrak66 controllers */
356 /* the Promise can only do DMA on ATA disks not on ATAPI devices */
357 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
358 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
359 break;
360
327 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
328 (error) ? "failed" : "success");
329 if (!error) {
330 pci_write_config(scp->dev, 0x40 + (devno << 1), 0x0301, 2);
331 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
332 return 0;
333 }
334 }
335 /* we could set PIO mode timings, but we assume the BIOS did that */
336 break;
337
338 case 0x4d33105a: /* Promise Ultra33 / FastTrak33 controllers */
339 case 0x4d38105a: /* Promise Ultra66 / FastTrak66 controllers */
340 /* the Promise can only do DMA on ATA disks not on ATAPI devices */
341 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
342 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
343 break;
344
361 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1);
362 if (udmamode >=4 && type == 0x4d38105a &&
363 !(pci_read_config(scp->dev, 0x50, 2)&(scp->unit ? 1<<11 : 1<<10))) {
364 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
365 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
366 if (bootverbose)
345 if (udmamode >=4 && type == 0x4d38105a &&
346 !(pci_read_config(scp->dev, 0x50, 2)&(scp->unit ? 1<<11 : 1<<10))) {
347 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
348 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
349 if (bootverbose)
367 printf("ata%d: %s: %s setting up UDMA4 mode on Promise chip\n",
350 printf("ata%d-%s: %s setting up UDMA4 mode on Promise chip\n",
368 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
369 (error) ? "failed" : "success");
370 if (!error) {
371 outb(scp->bmaddr+0x11, inl(scp->bmaddr+0x11) | scp->unit ? 8:2);
372 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4);
373 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
374 return 0;
375 }
376 }
377 if (udmamode >= 2) {
378 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
379 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
380 if (bootverbose)
351 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
352 (error) ? "failed" : "success");
353 if (!error) {
354 outb(scp->bmaddr+0x11, inl(scp->bmaddr+0x11) | scp->unit ? 8:2);
355 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4);
356 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
357 return 0;
358 }
359 }
360 if (udmamode >= 2) {
361 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
362 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
363 if (bootverbose)
381 printf("ata%d: %s: %s setting up UDMA2 mode on Promise chip\n",
364 printf("ata%d-%s: %s setting up UDMA2 mode on Promise chip\n",
382 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
383 (error) ? "failed" : "success");
384 if (!error) {
385 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4);
386 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
387 return 0;
388 }
389 }
390 if (wdmamode >= 2 && apiomode >= 4) {
391 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
392 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
393 if (bootverbose)
365 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
366 (error) ? "failed" : "success");
367 if (!error) {
368 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4);
369 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
370 return 0;
371 }
372 }
373 if (wdmamode >= 2 && apiomode >= 4) {
374 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
375 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
376 if (bootverbose)
394 printf("ata%d: %s: %s setting up WDMA2 mode on Promise chip\n",
377 printf("ata%d-%s: %s setting up WDMA2 mode on Promise chip\n",
395 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
396 (error) ? "failed" : "success");
397 if (!error) {
398 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4);
399 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
400 return 0;
401 }
402 }
403 if (bootverbose)
378 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
379 (error) ? "failed" : "success");
380 if (!error) {
381 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4);
382 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
383 return 0;
384 }
385 }
386 if (bootverbose)
404 printf("ata%d: %s: setting PIO mode on Promise chip\n",
387 printf("ata%d-%s: setting PIO mode on Promise chip\n",
405 scp->lun, (device == ATA_MASTER) ? "master" : "slave");
406 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4);
407 break;
408
409 case 0x00041103: /* HighPoint HPT366 controller */
410 /* no ATAPI devices for now */
411 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
412 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
413 break;
414
388 scp->lun, (device == ATA_MASTER) ? "master" : "slave");
389 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4);
390 break;
391
392 case 0x00041103: /* HighPoint HPT366 controller */
393 /* no ATAPI devices for now */
394 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
395 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))
396 break;
397
415 devno = (device == ATA_MASTER) ? 0 : 1;
416 if (udmamode >=4 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) {
417 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
418 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
419 if (bootverbose)
398 if (udmamode >=4 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) {
399 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
400 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY);
401 if (bootverbose)
420 printf("ata%d: %s: %s setting up UDMA4 mode on HPT366 chip\n",
402 printf("ata%d-%s: %s setting up UDMA4 mode on HPT366 chip\n",
421 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
422 (error) ? "failed" : "success");
423 if (!error) {
424 hpt366_timing(scp, device, ATA_MODE_UDMA4);
425 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
426 return 0;
427 }
428 }
429 if (udmamode >=3 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) {
430 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
431 ATA_UDMA3, ATA_C_F_SETXFER, ATA_WAIT_READY);
432 if (bootverbose)
403 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
404 (error) ? "failed" : "success");
405 if (!error) {
406 hpt366_timing(scp, device, ATA_MODE_UDMA4);
407 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4;
408 return 0;
409 }
410 }
411 if (udmamode >=3 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) {
412 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
413 ATA_UDMA3, ATA_C_F_SETXFER, ATA_WAIT_READY);
414 if (bootverbose)
433 printf("ata%d: %s: %s setting up UDMA3 mode on HPT366 chip\n",
415 printf("ata%d-%s: %s setting up UDMA3 mode on HPT366 chip\n",
434 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
435 (error) ? "failed" : "success");
436 if (!error) {
437 hpt366_timing(scp, device, ATA_MODE_UDMA3);
438 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA3;
439 return 0;
440 }
441 }
442 if (udmamode >= 2) {
443 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
444 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
445 if (bootverbose)
416 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
417 (error) ? "failed" : "success");
418 if (!error) {
419 hpt366_timing(scp, device, ATA_MODE_UDMA3);
420 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA3;
421 return 0;
422 }
423 }
424 if (udmamode >= 2) {
425 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
426 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
427 if (bootverbose)
446 printf("ata%d: %s: %s setting up UDMA2 mode on HPT366 chip\n",
428 printf("ata%d-%s: %s setting up UDMA2 mode on HPT366 chip\n",
447 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
448 (error) ? "failed" : "success");
449 if (!error) {
450 hpt366_timing(scp, device, ATA_MODE_UDMA2);
451 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
452 return 0;
453 }
454 }
455 if (wdmamode >= 2 && apiomode >= 4) {
456 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
457 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
458 if (bootverbose)
429 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
430 (error) ? "failed" : "success");
431 if (!error) {
432 hpt366_timing(scp, device, ATA_MODE_UDMA2);
433 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2;
434 return 0;
435 }
436 }
437 if (wdmamode >= 2 && apiomode >= 4) {
438 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
439 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
440 if (bootverbose)
459 printf("ata%d: %s: %s setting up WDMA2 mode on HPT366 chip\n",
441 printf("ata%d-%s: %s setting up WDMA2 mode on HPT366 chip\n",
460 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
461 (error) ? "failed" : "success");
462 if (!error) {
463 hpt366_timing(scp, device, ATA_MODE_WDMA2);
464 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
465 return 0;
466 }
467 }
468 if (bootverbose)
442 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
443 (error) ? "failed" : "success");
444 if (!error) {
445 hpt366_timing(scp, device, ATA_MODE_WDMA2);
446 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
447 return 0;
448 }
449 }
450 if (bootverbose)
469 printf("ata%d: %s: setting PIO mode on HPT366 chip\n",
451 printf("ata%d-%s: setting PIO mode on HPT366 chip\n",
470 scp->lun, (device == ATA_MASTER) ? "master" : "slave");
471 hpt366_timing(scp, device, ATA_MODE_PIO);
472 break;
473
474 default: /* unknown controller chip */
475 /* better not try generic DMA on ATAPI devices it almost never works */
476 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
477 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))

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

482#if MAYBE_NOT
483 && (inb(scp->bmaddr + ATA_BMSTAT_PORT) &
484 ((device == ATA_MASTER) ?
485 ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) {
486#endif
487 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
488 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
489 if (bootverbose)
452 scp->lun, (device == ATA_MASTER) ? "master" : "slave");
453 hpt366_timing(scp, device, ATA_MODE_PIO);
454 break;
455
456 default: /* unknown controller chip */
457 /* better not try generic DMA on ATAPI devices it almost never works */
458 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) ||
459 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE))

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

464#if MAYBE_NOT
465 && (inb(scp->bmaddr + ATA_BMSTAT_PORT) &
466 ((device == ATA_MASTER) ?
467 ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) {
468#endif
469 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0,
470 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY);
471 if (bootverbose)
490 printf("ata%d: %s: %s setting up WDMA2 mode on generic chip\n",
472 printf("ata%d-%s: %s setting up WDMA2 mode on generic chip\n",
491 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
492 (error) ? "failed" : "success");
493 if (!error) {
494 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
495 return 0;
496 }
497 }
498 }

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

503int32_t
504ata_dmasetup(struct ata_softc *scp, int32_t device,
505 int8_t *data, int32_t count, int32_t flags)
506{
507 struct ata_dmaentry *dmatab;
508 u_int32_t dma_count, dma_base;
509 int32_t i = 0;
510
473 scp->lun, (device == ATA_MASTER) ? "master" : "slave",
474 (error) ? "failed" : "success");
475 if (!error) {
476 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2;
477 return 0;
478 }
479 }
480 }

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

485int32_t
486ata_dmasetup(struct ata_softc *scp, int32_t device,
487 int8_t *data, int32_t count, int32_t flags)
488{
489 struct ata_dmaentry *dmatab;
490 u_int32_t dma_count, dma_base;
491 int32_t i = 0;
492
511#ifdef ATA_DMADEBUG
512 printf("ata%d: dmasetup\n", scp->lun);
513#endif
514 if (((uintptr_t)data & 1) || (count & 1))
515 return -1;
516
517 if (!count) {
493 if (((uintptr_t)data & 1) || (count & 1))
494 return -1;
495
496 if (!count) {
518#ifdef ATA_DMADEBUG
519 printf("ata%d: zero length DMA transfer attempt on %s\n",
497 printf("ata%d-%s: zero length DMA transfer attempted\n",
520 scp->lun, ((device == ATA_MASTER) ? "master" : "slave"));
498 scp->lun, ((device == ATA_MASTER) ? "master" : "slave"));
521#endif
522 return -1;
523 }
524
525 dmatab = scp->dmatab[(device == ATA_MASTER) ? 0 : 1];
526 dma_base = vtophys(data);
527 dma_count = MIN(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK)));
528 data += dma_count;
529 count -= dma_count;
530
531 while (count) {
532 dmatab[i].base = dma_base;
533 dmatab[i].count = (dma_count & 0xffff);
534 i++;
535 if (i >= ATA_DMA_ENTRIES) {
499 return -1;
500 }
501
502 dmatab = scp->dmatab[(device == ATA_MASTER) ? 0 : 1];
503 dma_base = vtophys(data);
504 dma_count = MIN(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK)));
505 data += dma_count;
506 count -= dma_count;
507
508 while (count) {
509 dmatab[i].base = dma_base;
510 dmatab[i].count = (dma_count & 0xffff);
511 i++;
512 if (i >= ATA_DMA_ENTRIES) {
536 printf("ata%d: too many segments in DMA table for %s\n",
513 printf("ata%d-%s: too many segments in DMA table\n",
537 scp->lun, (device ? "slave" : "master"));
538 return -1;
539 }
540 dma_base = vtophys(data);
541 dma_count = MIN(count, PAGE_SIZE);
542 data += MIN(count, PAGE_SIZE);
543 count -= MIN(count, PAGE_SIZE);
544 }
514 scp->lun, (device ? "slave" : "master"));
515 return -1;
516 }
517 dma_base = vtophys(data);
518 dma_count = MIN(count, PAGE_SIZE);
519 data += MIN(count, PAGE_SIZE);
520 count -= MIN(count, PAGE_SIZE);
521 }
545#ifdef ATA_DMADEBUG
546 printf("ata_dmasetup: base=%08x count%08x\n", dma_base, dma_count);
547#endif
548 dmatab[i].base = dma_base;
549 dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT;
522 dmatab[i].base = dma_base;
523 dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT;
550
551 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab));
524 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab));
552#ifdef ATA_DMADEBUG
553 printf("dmatab=%08x %08x\n",
554 vtophys(dmatab), inl(scp->bmaddr+ATA_BMDTP_PORT));
555#endif
556 outb(scp->bmaddr + ATA_BMCMD_PORT, flags ? ATA_BMCMD_WRITE_READ:0);
557 outb(scp->bmaddr + ATA_BMSTAT_PORT, (inb(scp->bmaddr + ATA_BMSTAT_PORT) |
558 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
559 return 0;
560}
561
562void
563ata_dmastart(struct ata_softc *scp)
564{
525 outb(scp->bmaddr + ATA_BMCMD_PORT, flags ? ATA_BMCMD_WRITE_READ:0);
526 outb(scp->bmaddr + ATA_BMSTAT_PORT, (inb(scp->bmaddr + ATA_BMSTAT_PORT) |
527 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
528 return 0;
529}
530
531void
532ata_dmastart(struct ata_softc *scp)
533{
565#ifdef ATA_DMADEBUG
566 printf("ata%d: dmastart\n", scp->lun);
567#endif
568 scp->flags |= ATA_DMA_ACTIVE;
569 outb(scp->bmaddr + ATA_BMCMD_PORT,
570 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
571}
572
573int32_t
574ata_dmadone(struct ata_softc *scp)
575{
534 scp->flags |= ATA_DMA_ACTIVE;
535 outb(scp->bmaddr + ATA_BMCMD_PORT,
536 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
537}
538
539int32_t
540ata_dmadone(struct ata_softc *scp)
541{
576#ifdef ATA_DMADEBUG
577 printf("ata%d: dmadone\n", scp->lun);
578#endif
579 outb(scp->bmaddr + ATA_BMCMD_PORT,
580 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
581 scp->flags &= ~ATA_DMA_ACTIVE;
582 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
583}
584
585int32_t
586ata_dmastatus(struct ata_softc *scp)
587{
542 outb(scp->bmaddr + ATA_BMCMD_PORT,
543 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
544 scp->flags &= ~ATA_DMA_ACTIVE;
545 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
546}
547
548int32_t
549ata_dmastatus(struct ata_softc *scp)
550{
588#ifdef ATA_DMADEBUG
589 printf("ata%d: dmastatus\n", scp->lun);
590#endif
591 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
592}
593
594static void
595hpt366_timing(struct ata_softc *scp, int32_t device, int32_t mode)
596{
597 u_int32_t timing;
598

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

623 case ATA_MODE_PIO: timing = 0xc008d963; break;
624 case ATA_MODE_WDMA2: timing = 0xa008d943; break;
625 case ATA_MODE_UDMA2: timing = 0x900bd943; break;
626 case ATA_MODE_UDMA3: timing = 0x900ad943; break;
627 case ATA_MODE_UDMA4: timing = 0x900fd943; break;
628 default: timing = 0x0120d9d9;
629 }
630 }
551 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
552}
553
554static void
555hpt366_timing(struct ata_softc *scp, int32_t device, int32_t mode)
556{
557 u_int32_t timing;
558

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

583 case ATA_MODE_PIO: timing = 0xc008d963; break;
584 case ATA_MODE_WDMA2: timing = 0xa008d943; break;
585 case ATA_MODE_UDMA2: timing = 0x900bd943; break;
586 case ATA_MODE_UDMA3: timing = 0x900ad943; break;
587 case ATA_MODE_UDMA4: timing = 0x900fd943; break;
588 default: timing = 0x0120d9d9;
589 }
590 }
631 pci_write_config(scp->dev, 0x40 + (device==ATA_MASTER ? 0 : 4), timing, 4);
591 pci_write_config(scp->dev, (device==ATA_MASTER ? 0x40 : 0x44), timing, 4);
632}
633
634#else /* NPCI > 0 */
635
636int32_t
637ata_dmainit(struct ata_softc *scp, int32_t device,
638 int32_t piomode, int32_t wdmamode, int32_t udmamode)
639{

--- 28 unchanged lines hidden ---
592}
593
594#else /* NPCI > 0 */
595
596int32_t
597ata_dmainit(struct ata_softc *scp, int32_t device,
598 int32_t piomode, int32_t wdmamode, int32_t udmamode)
599{

--- 28 unchanged lines hidden ---