Deleted Added
full compact
if_ed.c (141548) if_ed.c (141586)
1/*-
2 * Copyright (c) 1995, David Greenman
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
9 * notice unmodified, this list of conditions, and the following
10 * disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1995, David Greenman
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
9 * notice unmodified, this list of conditions, and the following
10 * disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/dev/ed/if_ed.c 141548 2005-02-08 23:57:43Z imp $");
29__FBSDID("$FreeBSD: head/sys/dev/ed/if_ed.c 141586 2005-02-09 20:03:40Z imp $");
30
31/*
32 * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
33 * adapters. By David Greenman, 29-April-1993
34 *
35 * Currently supports the Western Digital/SMC 8003 and 8013 series,
36 * the SMC Elite Ultra (8216), the 3Com 3c503, the NE1000 and NE2000,
37 * and a variety of similar clones.
38 *
39 */
40
41#include "opt_ed.h"
42
43#include <sys/param.h>
44#include <sys/systm.h>
45#include <sys/sockio.h>
46#include <sys/mbuf.h>
47#include <sys/kernel.h>
48#include <sys/socket.h>
49#include <sys/syslog.h>
50
51#include <sys/bus.h>
52
53#include <machine/bus.h>
54#include <sys/rman.h>
55#include <machine/resource.h>
56
57#include <net/ethernet.h>
58#include <net/if.h>
59#include <net/if_arp.h>
60#include <net/if_dl.h>
61#include <net/if_mib.h>
62#include <net/if_media.h>
63
64#ifndef ED_NO_MIIBUS
65#include <dev/mii/mii.h>
66#include <dev/mii/miivar.h>
67#endif
68
69#include <net/bpf.h>
70
30
31/*
32 * Device driver for National Semiconductor DS8390/WD83C690 based ethernet
33 * adapters. By David Greenman, 29-April-1993
34 *
35 * Currently supports the Western Digital/SMC 8003 and 8013 series,
36 * the SMC Elite Ultra (8216), the 3Com 3c503, the NE1000 and NE2000,
37 * and a variety of similar clones.
38 *
39 */
40
41#include "opt_ed.h"
42
43#include <sys/param.h>
44#include <sys/systm.h>
45#include <sys/sockio.h>
46#include <sys/mbuf.h>
47#include <sys/kernel.h>
48#include <sys/socket.h>
49#include <sys/syslog.h>
50
51#include <sys/bus.h>
52
53#include <machine/bus.h>
54#include <sys/rman.h>
55#include <machine/resource.h>
56
57#include <net/ethernet.h>
58#include <net/if.h>
59#include <net/if_arp.h>
60#include <net/if_dl.h>
61#include <net/if_mib.h>
62#include <net/if_media.h>
63
64#ifndef ED_NO_MIIBUS
65#include <dev/mii/mii.h>
66#include <dev/mii/miivar.h>
67#endif
68
69#include <net/bpf.h>
70
71#include <machine/md_var.h>
72
73#include <dev/ed/if_edreg.h>
74#include <dev/ed/if_edvar.h>
75
76devclass_t ed_devclass;
77
78static void ed_init(void *);
79static int ed_ioctl(struct ifnet *, u_long, caddr_t);
80static void ed_start(struct ifnet *);
81static void ed_reset(struct ifnet *);
82static void ed_watchdog(struct ifnet *);
83#ifndef ED_NO_MIIBUS
84static void ed_tick(void *);
85#endif
86
87static void ed_ds_getmcaf(struct ed_softc *, uint32_t *);
88
89static void ed_get_packet(struct ed_softc *, char *, u_short);
90
91static __inline void ed_rint(struct ed_softc *);
92static __inline void ed_xmit(struct ed_softc *);
93static __inline char *ed_ring_copy(struct ed_softc *, char *, char *, u_short);
71#include <dev/ed/if_edreg.h>
72#include <dev/ed/if_edvar.h>
73
74devclass_t ed_devclass;
75
76static void ed_init(void *);
77static int ed_ioctl(struct ifnet *, u_long, caddr_t);
78static void ed_start(struct ifnet *);
79static void ed_reset(struct ifnet *);
80static void ed_watchdog(struct ifnet *);
81#ifndef ED_NO_MIIBUS
82static void ed_tick(void *);
83#endif
84
85static void ed_ds_getmcaf(struct ed_softc *, uint32_t *);
86
87static void ed_get_packet(struct ed_softc *, char *, u_short);
88
89static __inline void ed_rint(struct ed_softc *);
90static __inline void ed_xmit(struct ed_softc *);
91static __inline char *ed_ring_copy(struct ed_softc *, char *, char *, u_short);
94static void ed_hpp_set_physical_link(struct ed_softc *);
95static void ed_hpp_readmem(struct ed_softc *, long, uint8_t *, uint16_t);
96static void ed_hpp_writemem(struct ed_softc *, uint8_t *, uint16_t,
97 uint16_t);
98static u_short ed_hpp_write_mbufs(struct ed_softc *, struct mbuf *, int);
99
100static u_short ed_pio_write_mbufs(struct ed_softc *, struct mbuf *, long);
101
102static void ed_setrcr(struct ed_softc *);
103
104/*
92static u_short ed_pio_write_mbufs(struct ed_softc *, struct mbuf *, long);
93
94static void ed_setrcr(struct ed_softc *);
95
96/*
105 * Interrupt conversion table for WD/SMC ASIC/83C584
106 */
107static uint16_t ed_intr_val[] = {
108 9,
109 3,
110 5,
111 7,
112 10,
113 11,
114 15,
115 4
116};
117
118/*
119 * Interrupt conversion table for 83C790
120 */
121static uint16_t ed_790_intr_val[] = {
122 0,
123 9,
124 3,
125 5,
126 7,
127 10,
128 11,
129 15
130};
131
132/*
133 * Interrupt conversion table for the HP PC LAN+
134 */
135
136static uint16_t ed_hpp_intr_val[] = {
137 0, /* 0 */
138 0, /* 1 */
139 0, /* 2 */
140 3, /* 3 */
141 4, /* 4 */
142 5, /* 5 */
143 6, /* 6 */
144 7, /* 7 */
145 0, /* 8 */
146 9, /* 9 */
147 10, /* 10 */
148 11, /* 11 */
149 12, /* 12 */
150 0, /* 13 */
151 0, /* 14 */
152 15 /* 15 */
153};
154
155/*
156 * Generic probe routine for testing for the existance of a DS8390.
157 * Must be called after the NIC has just been reset. This routine
158 * works by looking at certain register values that are guaranteed
159 * to be initialized a certain way after power-up or reset. Seems
160 * not to currently work on the 83C690.
161 *
162 * Specifically:
163 *
164 * Register reset bits set bits
165 * Command Register (CR) TXP, STA RD2, STP
166 * Interrupt Status (ISR) RST
167 * Interrupt Mask (IMR) All bits
168 * Data Control (DCR) LAS
169 * Transmit Config. (TCR) LB1, LB0
170 *
171 * We only look at the CR and ISR registers, however, because looking at
172 * the others would require changing register pages (which would be
173 * intrusive if this isn't an 8390).
174 *
175 * Return 1 if 8390 was found, 0 if not.
176 */
177
178int
179ed_probe_generic8390(struct ed_softc *sc)
180{
181 if ((ed_nic_inb(sc, ED_P0_CR) &
182 (ED_CR_RD2 | ED_CR_TXP | ED_CR_STA | ED_CR_STP)) !=
183 (ED_CR_RD2 | ED_CR_STP))
184 return (0);
185 if ((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST) != ED_ISR_RST)
186 return (0);
187
188 return (1);
189}
190
191/*
97 * Generic probe routine for testing for the existance of a DS8390.
98 * Must be called after the NIC has just been reset. This routine
99 * works by looking at certain register values that are guaranteed
100 * to be initialized a certain way after power-up or reset. Seems
101 * not to currently work on the 83C690.
102 *
103 * Specifically:
104 *
105 * Register reset bits set bits
106 * Command Register (CR) TXP, STA RD2, STP
107 * Interrupt Status (ISR) RST
108 * Interrupt Mask (IMR) All bits
109 * Data Control (DCR) LAS
110 * Transmit Config. (TCR) LB1, LB0
111 *
112 * We only look at the CR and ISR registers, however, because looking at
113 * the others would require changing register pages (which would be
114 * intrusive if this isn't an 8390).
115 *
116 * Return 1 if 8390 was found, 0 if not.
117 */
118
119int
120ed_probe_generic8390(struct ed_softc *sc)
121{
122 if ((ed_nic_inb(sc, ED_P0_CR) &
123 (ED_CR_RD2 | ED_CR_TXP | ED_CR_STA | ED_CR_STP)) !=
124 (ED_CR_RD2 | ED_CR_STP))
125 return (0);
126 if ((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST) != ED_ISR_RST)
127 return (0);
128
129 return (1);
130}
131
132/*
192 * Probe and vendor-specific initialization routine for SMC/WD80x3 boards
193 */
194int
195ed_probe_WD80x3_generic(device_t dev, int flags, uint16_t *intr_vals[])
196{
197 struct ed_softc *sc = device_get_softc(dev);
198 int error;
199 int i;
200 u_int memsize, maddr;
201 u_char iptr, isa16bit, sum, totalsum;
202 u_long conf_maddr, conf_msize, irq, junk;
203
204 sc->chip_type = ED_CHIP_TYPE_DP8390;
205
206 if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_TOSH_ETHER) {
207 totalsum = ED_WD_ROM_CHECKSUM_TOTAL_TOSH_ETHER;
208 ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_POW);
209 DELAY(10000);
210 }
211 else
212 totalsum = ED_WD_ROM_CHECKSUM_TOTAL;
213
214 /*
215 * Attempt to do a checksum over the station address PROM. If it
216 * fails, it's probably not a SMC/WD board. There is a problem with
217 * this, though: some clone WD boards don't pass the checksum test.
218 * Danpex boards for one.
219 */
220 for (sum = 0, i = 0; i < 8; ++i)
221 sum += ed_asic_inb(sc, ED_WD_PROM + i);
222
223 if (sum != totalsum) {
224
225 /*
226 * Checksum is invalid. This often happens with cheap WD8003E
227 * clones. In this case, the checksum byte (the eighth byte)
228 * seems to always be zero.
229 */
230 if (ed_asic_inb(sc, ED_WD_CARD_ID) != ED_TYPE_WD8003E ||
231 ed_asic_inb(sc, ED_WD_PROM + 7) != 0)
232 return (ENXIO);
233 }
234 /* reset card to force it into a known state. */
235 if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_TOSH_ETHER)
236 ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_RST | ED_WD_MSR_POW);
237 else
238 ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_RST);
239
240 DELAY(100);
241 ed_asic_outb(sc, ED_WD_MSR, ed_asic_inb(sc, ED_WD_MSR) & ~ED_WD_MSR_RST);
242 /* wait in the case this card is reading its EEROM */
243 DELAY(5000);
244
245 sc->vendor = ED_VENDOR_WD_SMC;
246 sc->type = ed_asic_inb(sc, ED_WD_CARD_ID);
247
248 /*
249 * Set initial values for width/size.
250 */
251 memsize = 8192;
252 isa16bit = 0;
253 switch (sc->type) {
254 case ED_TYPE_WD8003S:
255 sc->type_str = "WD8003S";
256 break;
257 case ED_TYPE_WD8003E:
258 sc->type_str = "WD8003E";
259 break;
260 case ED_TYPE_WD8003EB:
261 sc->type_str = "WD8003EB";
262 break;
263 case ED_TYPE_WD8003W:
264 sc->type_str = "WD8003W";
265 break;
266 case ED_TYPE_WD8013EBT:
267 sc->type_str = "WD8013EBT";
268 memsize = 16384;
269 isa16bit = 1;
270 break;
271 case ED_TYPE_WD8013W:
272 sc->type_str = "WD8013W";
273 memsize = 16384;
274 isa16bit = 1;
275 break;
276 case ED_TYPE_WD8013EP: /* also WD8003EP */
277 if (ed_asic_inb(sc, ED_WD_ICR) & ED_WD_ICR_16BIT) {
278 isa16bit = 1;
279 memsize = 16384;
280 sc->type_str = "WD8013EP";
281 } else {
282 sc->type_str = "WD8003EP";
283 }
284 break;
285 case ED_TYPE_WD8013WC:
286 sc->type_str = "WD8013WC";
287 memsize = 16384;
288 isa16bit = 1;
289 break;
290 case ED_TYPE_WD8013EBP:
291 sc->type_str = "WD8013EBP";
292 memsize = 16384;
293 isa16bit = 1;
294 break;
295 case ED_TYPE_WD8013EPC:
296 sc->type_str = "WD8013EPC";
297 memsize = 16384;
298 isa16bit = 1;
299 break;
300 case ED_TYPE_SMC8216C: /* 8216 has 16K shared mem -- 8416 has 8K */
301 case ED_TYPE_SMC8216T:
302 if (sc->type == ED_TYPE_SMC8216C) {
303 sc->type_str = "SMC8216/SMC8216C";
304 } else {
305 sc->type_str = "SMC8216T";
306 }
307
308 ed_asic_outb(sc, ED_WD790_HWR,
309 ed_asic_inb(sc, ED_WD790_HWR) | ED_WD790_HWR_SWH);
310 switch (ed_asic_inb(sc, ED_WD790_RAR) & ED_WD790_RAR_SZ64) {
311 case ED_WD790_RAR_SZ64:
312 memsize = 65536;
313 break;
314 case ED_WD790_RAR_SZ32:
315 memsize = 32768;
316 break;
317 case ED_WD790_RAR_SZ16:
318 memsize = 16384;
319 break;
320 case ED_WD790_RAR_SZ8:
321 /* 8216 has 16K shared mem -- 8416 has 8K */
322 if (sc->type == ED_TYPE_SMC8216C) {
323 sc->type_str = "SMC8416C/SMC8416BT";
324 } else {
325 sc->type_str = "SMC8416T";
326 }
327 memsize = 8192;
328 break;
329 }
330 ed_asic_outb(sc, ED_WD790_HWR,
331 ed_asic_inb(sc, ED_WD790_HWR) & ~ED_WD790_HWR_SWH);
332
333 isa16bit = 1;
334 sc->chip_type = ED_CHIP_TYPE_WD790;
335 break;
336 case ED_TYPE_TOSHIBA1:
337 sc->type_str = "Toshiba1";
338 memsize = 32768;
339 isa16bit = 1;
340 break;
341 case ED_TYPE_TOSHIBA4:
342 sc->type_str = "Toshiba4";
343 memsize = 32768;
344 isa16bit = 1;
345 break;
346 default:
347 sc->type_str = "";
348 break;
349 }
350
351 /*
352 * Make some adjustments to initial values depending on what is found
353 * in the ICR.
354 */
355 if (isa16bit && (sc->type != ED_TYPE_WD8013EBT)
356 && (sc->type != ED_TYPE_TOSHIBA1) && (sc->type != ED_TYPE_TOSHIBA4)
357 && ((ed_asic_inb(sc, ED_WD_ICR) & ED_WD_ICR_16BIT) == 0)) {
358 isa16bit = 0;
359 memsize = 8192;
360 }
361
362 error = bus_get_resource(dev, SYS_RES_MEMORY, 0,
363 &conf_maddr, &conf_msize);
364 if (error)
365 return (error);
366
367#ifdef ED_DEBUG
368 printf("type = %x type_str=%s isa16bit=%d memsize=%d id_msize=%lu\n",
369 sc->type, sc->type_str, isa16bit, memsize, conf_msize);
370 for (i = 0; i < 8; i++)
371 printf("%x -> %x\n", i, ed_asic_inb(sc, i));
372#endif
373
374 /*
375 * Allow the user to override the autoconfiguration
376 */
377 if (conf_msize > 1)
378 memsize = conf_msize;
379
380 maddr = conf_maddr;
381 if (maddr < 0xa0000 || maddr + memsize > 0x1000000) {
382 device_printf(dev, "Invalid ISA memory address range configured: 0x%x - 0x%x\n",
383 maddr, maddr + memsize);
384 return (ENXIO);
385 }
386
387 /*
388 * (note that if the user specifies both of the following flags that
389 * '8bit' mode intentionally has precedence)
390 */
391 if (flags & ED_FLAGS_FORCE_16BIT_MODE)
392 isa16bit = 1;
393 if (flags & ED_FLAGS_FORCE_8BIT_MODE)
394 isa16bit = 0;
395
396 /*
397 * If possible, get the assigned interrupt number from the card and
398 * use it.
399 */
400 if ((sc->type & ED_WD_SOFTCONFIG) &&
401 (sc->chip_type != ED_CHIP_TYPE_WD790)) {
402
403 /*
404 * Assemble together the encoded interrupt number.
405 */
406 iptr = (ed_asic_inb(sc, ED_WD_ICR) & ED_WD_ICR_IR2) |
407 ((ed_asic_inb(sc, ED_WD_IRR) &
408 (ED_WD_IRR_IR0 | ED_WD_IRR_IR1)) >> 5);
409
410 /*
411 * If no interrupt specified (or "?"), use what the board tells us.
412 */
413 error = bus_get_resource(dev, SYS_RES_IRQ, 0,
414 &irq, &junk);
415 if (error && intr_vals[0] != NULL) {
416 error = bus_set_resource(dev, SYS_RES_IRQ, 0,
417 intr_vals[0][iptr], 1);
418 }
419 if (error)
420 return (error);
421
422 /*
423 * Enable the interrupt.
424 */
425 ed_asic_outb(sc, ED_WD_IRR,
426 ed_asic_inb(sc, ED_WD_IRR) | ED_WD_IRR_IEN);
427 }
428 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
429 ed_asic_outb(sc, ED_WD790_HWR,
430 ed_asic_inb(sc, ED_WD790_HWR) | ED_WD790_HWR_SWH);
431 iptr = (((ed_asic_inb(sc, ED_WD790_GCR) & ED_WD790_GCR_IR2) >> 4) |
432 (ed_asic_inb(sc, ED_WD790_GCR) &
433 (ED_WD790_GCR_IR1 | ED_WD790_GCR_IR0)) >> 2);
434 ed_asic_outb(sc, ED_WD790_HWR,
435 ed_asic_inb(sc, ED_WD790_HWR) & ~ED_WD790_HWR_SWH);
436
437 /*
438 * If no interrupt specified (or "?"), use what the board tells us.
439 */
440 error = bus_get_resource(dev, SYS_RES_IRQ, 0,
441 &irq, &junk);
442 if (error && intr_vals[1] != NULL) {
443 error = bus_set_resource(dev, SYS_RES_IRQ, 0,
444 intr_vals[1][iptr], 1);
445 }
446 if (error)
447 return (error);
448
449 /*
450 * Enable interrupts.
451 */
452 ed_asic_outb(sc, ED_WD790_ICR,
453 ed_asic_inb(sc, ED_WD790_ICR) | ED_WD790_ICR_EIL);
454 }
455 error = bus_get_resource(dev, SYS_RES_IRQ, 0,
456 &irq, &junk);
457 if (error) {
458 device_printf(dev, "%s cards don't support auto-detected/assigned interrupts.\n",
459 sc->type_str);
460 return (ENXIO);
461 }
462 sc->isa16bit = isa16bit;
463 sc->mem_shared = 1;
464
465 error = ed_alloc_memory(dev, 0, memsize);
466 if (error) {
467 printf("*** ed_alloc_memory() failed! (%d)\n", error);
468 return (error);
469 }
470 sc->mem_start = (caddr_t) rman_get_virtual(sc->mem_res);
471
472 /*
473 * allocate one xmit buffer if < 16k, two buffers otherwise
474 */
475 if ((memsize < 16384) ||
476 (flags & ED_FLAGS_NO_MULTI_BUFFERING)) {
477 sc->txb_cnt = 1;
478 } else {
479 sc->txb_cnt = 2;
480 }
481 sc->tx_page_start = ED_WD_PAGE_OFFSET;
482 sc->rec_page_start = ED_WD_PAGE_OFFSET + ED_TXBUF_SIZE * sc->txb_cnt;
483 sc->rec_page_stop = ED_WD_PAGE_OFFSET + memsize / ED_PAGE_SIZE;
484 sc->mem_ring = sc->mem_start + (ED_PAGE_SIZE * sc->rec_page_start);
485 sc->mem_size = memsize;
486 sc->mem_end = sc->mem_start + memsize;
487
488 /*
489 * Get station address from on-board ROM
490 */
491 for (i = 0; i < ETHER_ADDR_LEN; ++i)
492 sc->arpcom.ac_enaddr[i] = ed_asic_inb(sc, ED_WD_PROM + i);
493
494 /*
495 * Set upper address bits and 8/16 bit access to shared memory.
496 */
497 if (isa16bit) {
498 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
499 sc->wd_laar_proto = ed_asic_inb(sc, ED_WD_LAAR);
500 } else {
501 sc->wd_laar_proto = ED_WD_LAAR_L16EN |
502 ((kvtop(sc->mem_start) >> 19) & ED_WD_LAAR_ADDRHI);
503 }
504 /*
505 * Enable 16bit access
506 */
507 ed_asic_outb(sc, ED_WD_LAAR, sc->wd_laar_proto |
508 ED_WD_LAAR_M16EN);
509 } else {
510 if (((sc->type & ED_WD_SOFTCONFIG) ||
511 (sc->type == ED_TYPE_TOSHIBA1) ||
512 (sc->type == ED_TYPE_TOSHIBA4) ||
513 (sc->type == ED_TYPE_WD8013EBT)) &&
514 (sc->chip_type != ED_CHIP_TYPE_WD790)) {
515 sc->wd_laar_proto = (kvtop(sc->mem_start) >> 19) &
516 ED_WD_LAAR_ADDRHI;
517 ed_asic_outb(sc, ED_WD_LAAR, sc->wd_laar_proto);
518 }
519 }
520
521 /*
522 * Set address and enable interface shared memory.
523 */
524 if (sc->chip_type != ED_CHIP_TYPE_WD790) {
525 if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_TOSH_ETHER) {
526 ed_asic_outb(sc, ED_WD_MSR + 1,
527 ((kvtop(sc->mem_start) >> 8) & 0xe0) | 4);
528 ed_asic_outb(sc, ED_WD_MSR + 2,
529 ((kvtop(sc->mem_start) >> 16) & 0x0f));
530 ed_asic_outb(sc, ED_WD_MSR,
531 ED_WD_MSR_MENB | ED_WD_MSR_POW);
532 } else {
533 ed_asic_outb(sc, ED_WD_MSR,
534 ((kvtop(sc->mem_start) >> 13) &
535 ED_WD_MSR_ADDR) | ED_WD_MSR_MENB);
536 }
537 sc->cr_proto = ED_CR_RD2;
538 } else {
539 ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_MENB);
540 ed_asic_outb(sc, ED_WD790_HWR, (ed_asic_inb(sc, ED_WD790_HWR) | ED_WD790_HWR_SWH));
541 ed_asic_outb(sc, ED_WD790_RAR, ((kvtop(sc->mem_start) >> 13) & 0x0f) |
542 ((kvtop(sc->mem_start) >> 11) & 0x40) |
543 (ed_asic_inb(sc, ED_WD790_RAR) & 0xb0));
544 ed_asic_outb(sc, ED_WD790_HWR, (ed_asic_inb(sc, ED_WD790_HWR) & ~ED_WD790_HWR_SWH));
545 sc->cr_proto = 0;
546 }
547
548#if 0
549 printf("starting memory performance test at 0x%x, size %d...\n",
550 sc->mem_start, memsize*16384);
551 for (i = 0; i < 16384; i++)
552 bzero(sc->mem_start, memsize);
553 printf("***DONE***\n");
554#endif
555
556 /*
557 * Now zero memory and verify that it is clear
558 */
559 bzero(sc->mem_start, memsize);
560
561 for (i = 0; i < memsize; ++i) {
562 if (sc->mem_start[i]) {
563 device_printf(dev, "failed to clear shared memory at %jx - check configuration\n",
564 (uintmax_t)kvtop(sc->mem_start + i));
565
566 /*
567 * Disable 16 bit access to shared memory
568 */
569 if (isa16bit) {
570 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
571 ed_asic_outb(sc, ED_WD_MSR, 0x00);
572 }
573 ed_asic_outb(sc, ED_WD_LAAR, sc->wd_laar_proto &
574 ~ED_WD_LAAR_M16EN);
575 }
576 return (ENXIO);
577 }
578 }
579
580 /*
581 * Disable 16bit access to shared memory - we leave it
582 * disabled so that 1) machines reboot properly when the board
583 * is set 16 bit mode and there are conflicting 8bit
584 * devices/ROMS in the same 128k address space as this boards
585 * shared memory. and 2) so that other 8 bit devices with
586 * shared memory can be used in this 128k region, too.
587 */
588 if (isa16bit) {
589 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
590 ed_asic_outb(sc, ED_WD_MSR, 0x00);
591 }
592 ed_asic_outb(sc, ED_WD_LAAR, sc->wd_laar_proto &
593 ~ED_WD_LAAR_M16EN);
594 }
595 return (0);
596}
597
598int
599ed_probe_WD80x3(device_t dev, int port_rid, int flags)
600{
601 struct ed_softc *sc = device_get_softc(dev);
602 int error;
603 static uint16_t *intr_vals[] = {ed_intr_val, ed_790_intr_val};
604
605 error = ed_alloc_port(dev, port_rid, ED_WD_IO_PORTS);
606 if (error)
607 return (error);
608
609 sc->asic_offset = ED_WD_ASIC_OFFSET;
610 sc->nic_offset = ED_WD_NIC_OFFSET;
611
612 return ed_probe_WD80x3_generic(dev, flags, intr_vals);
613}
614
615/*
616 * Probe and vendor-specific initialization routine for 3Com 3c503 boards
617 */
618int
619ed_probe_3Com(device_t dev, int port_rid, int flags)
620{
621 struct ed_softc *sc = device_get_softc(dev);
622 int error;
623 int i;
624 u_int memsize;
625 u_char isa16bit;
626 u_long conf_maddr, conf_msize, irq, junk;
627
628 error = ed_alloc_port(dev, 0, ED_3COM_IO_PORTS);
629 if (error)
630 return (error);
631
632 sc->asic_offset = ED_3COM_ASIC_OFFSET;
633 sc->nic_offset = ED_3COM_NIC_OFFSET;
634
635 /*
636 * Verify that the kernel configured I/O address matches the board
637 * configured address
638 */
639 switch (ed_asic_inb(sc, ED_3COM_BCFR)) {
640 case ED_3COM_BCFR_300:
641 if (rman_get_start(sc->port_res) != 0x300)
642 return (ENXIO);
643 break;
644 case ED_3COM_BCFR_310:
645 if (rman_get_start(sc->port_res) != 0x310)
646 return (ENXIO);
647 break;
648 case ED_3COM_BCFR_330:
649 if (rman_get_start(sc->port_res) != 0x330)
650 return (ENXIO);
651 break;
652 case ED_3COM_BCFR_350:
653 if (rman_get_start(sc->port_res) != 0x350)
654 return (ENXIO);
655 break;
656 case ED_3COM_BCFR_250:
657 if (rman_get_start(sc->port_res) != 0x250)
658 return (ENXIO);
659 break;
660 case ED_3COM_BCFR_280:
661 if (rman_get_start(sc->port_res) != 0x280)
662 return (ENXIO);
663 break;
664 case ED_3COM_BCFR_2A0:
665 if (rman_get_start(sc->port_res) != 0x2a0)
666 return (ENXIO);
667 break;
668 case ED_3COM_BCFR_2E0:
669 if (rman_get_start(sc->port_res) != 0x2e0)
670 return (ENXIO);
671 break;
672 default:
673 return (ENXIO);
674 }
675
676 error = bus_get_resource(dev, SYS_RES_MEMORY, 0,
677 &conf_maddr, &conf_msize);
678 if (error)
679 return (error);
680
681 /*
682 * Verify that the kernel shared memory address matches the board
683 * configured address.
684 */
685 switch (ed_asic_inb(sc, ED_3COM_PCFR)) {
686 case ED_3COM_PCFR_DC000:
687 if (conf_maddr != 0xdc000)
688 return (ENXIO);
689 break;
690 case ED_3COM_PCFR_D8000:
691 if (conf_maddr != 0xd8000)
692 return (ENXIO);
693 break;
694 case ED_3COM_PCFR_CC000:
695 if (conf_maddr != 0xcc000)
696 return (ENXIO);
697 break;
698 case ED_3COM_PCFR_C8000:
699 if (conf_maddr != 0xc8000)
700 return (ENXIO);
701 break;
702 default:
703 return (ENXIO);
704 }
705
706
707 /*
708 * Reset NIC and ASIC. Enable on-board transceiver throughout reset
709 * sequence because it'll lock up if the cable isn't connected if we
710 * don't.
711 */
712 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_RST | ED_3COM_CR_XSEL);
713
714 /*
715 * Wait for a while, then un-reset it
716 */
717 DELAY(50);
718
719 /*
720 * The 3Com ASIC defaults to rather strange settings for the CR after
721 * a reset - it's important to set it again after the following outb
722 * (this is done when we map the PROM below).
723 */
724 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_XSEL);
725
726 /*
727 * Wait a bit for the NIC to recover from the reset
728 */
729 DELAY(5000);
730
731 sc->vendor = ED_VENDOR_3COM;
732 sc->type_str = "3c503";
733 sc->mem_shared = 1;
734 sc->cr_proto = ED_CR_RD2;
735
736 /*
737 * Hmmm...a 16bit 3Com board has 16k of memory, but only an 8k window
738 * to it.
739 */
740 memsize = 8192;
741
742 /*
743 * Get station address from on-board ROM
744 */
745
746 /*
747 * First, map ethernet address PROM over the top of where the NIC
748 * registers normally appear.
749 */
750 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_EALO | ED_3COM_CR_XSEL);
751
752 for (i = 0; i < ETHER_ADDR_LEN; ++i)
753 sc->arpcom.ac_enaddr[i] = ed_nic_inb(sc, i);
754
755 /*
756 * Unmap PROM - select NIC registers. The proper setting of the
757 * tranceiver is set in ed_init so that the attach code is given a
758 * chance to set the default based on a compile-time config option
759 */
760 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_XSEL);
761
762 /*
763 * Determine if this is an 8bit or 16bit board
764 */
765
766 /*
767 * select page 0 registers
768 */
769 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
770
771 /*
772 * Attempt to clear WTS bit. If it doesn't clear, then this is a 16bit
773 * board.
774 */
775 ed_nic_outb(sc, ED_P0_DCR, 0);
776
777 /*
778 * select page 2 registers
779 */
780 ed_nic_outb(sc, ED_P0_CR, ED_CR_PAGE_2 | ED_CR_RD2 | ED_CR_STP);
781
782 /*
783 * The 3c503 forces the WTS bit to a one if this is a 16bit board
784 */
785 if (ed_nic_inb(sc, ED_P2_DCR) & ED_DCR_WTS)
786 isa16bit = 1;
787 else
788 isa16bit = 0;
789
790 /*
791 * select page 0 registers
792 */
793 ed_nic_outb(sc, ED_P2_CR, ED_CR_RD2 | ED_CR_STP);
794
795 error = ed_alloc_memory(dev, 0, memsize);
796 if (error)
797 return (error);
798
799 sc->mem_start = (caddr_t) rman_get_virtual(sc->mem_res);
800 sc->mem_size = memsize;
801 sc->mem_end = sc->mem_start + memsize;
802
803 /*
804 * We have an entire 8k window to put the transmit buffers on the
805 * 16bit boards. But since the 16bit 3c503's shared memory is only
806 * fast enough to overlap the loading of one full-size packet, trying
807 * to load more than 2 buffers can actually leave the transmitter idle
808 * during the load. So 2 seems the best value. (Although a mix of
809 * variable-sized packets might change this assumption. Nonetheless,
810 * we optimize for linear transfers of same-size packets.)
811 */
812 if (isa16bit) {
813 if (flags & ED_FLAGS_NO_MULTI_BUFFERING)
814 sc->txb_cnt = 1;
815 else
816 sc->txb_cnt = 2;
817
818 sc->tx_page_start = ED_3COM_TX_PAGE_OFFSET_16BIT;
819 sc->rec_page_start = ED_3COM_RX_PAGE_OFFSET_16BIT;
820 sc->rec_page_stop = memsize / ED_PAGE_SIZE +
821 ED_3COM_RX_PAGE_OFFSET_16BIT;
822 sc->mem_ring = sc->mem_start;
823 } else {
824 sc->txb_cnt = 1;
825 sc->tx_page_start = ED_3COM_TX_PAGE_OFFSET_8BIT;
826 sc->rec_page_start = ED_TXBUF_SIZE + ED_3COM_TX_PAGE_OFFSET_8BIT;
827 sc->rec_page_stop = memsize / ED_PAGE_SIZE +
828 ED_3COM_TX_PAGE_OFFSET_8BIT;
829 sc->mem_ring = sc->mem_start + (ED_PAGE_SIZE * ED_TXBUF_SIZE);
830 }
831
832 sc->isa16bit = isa16bit;
833
834 /*
835 * Initialize GA page start/stop registers. Probably only needed if
836 * doing DMA, but what the hell.
837 */
838 ed_asic_outb(sc, ED_3COM_PSTR, sc->rec_page_start);
839 ed_asic_outb(sc, ED_3COM_PSPR, sc->rec_page_stop);
840
841 /*
842 * Set IRQ. 3c503 only allows a choice of irq 2-5.
843 */
844 error = bus_get_resource(dev, SYS_RES_IRQ, 0, &irq, &junk);
845 if (error)
846 return (error);
847
848 switch (irq) {
849 case 2:
850 case 9:
851 ed_asic_outb(sc, ED_3COM_IDCFR, ED_3COM_IDCFR_IRQ2);
852 break;
853 case 3:
854 ed_asic_outb(sc, ED_3COM_IDCFR, ED_3COM_IDCFR_IRQ3);
855 break;
856 case 4:
857 ed_asic_outb(sc, ED_3COM_IDCFR, ED_3COM_IDCFR_IRQ4);
858 break;
859 case 5:
860 ed_asic_outb(sc, ED_3COM_IDCFR, ED_3COM_IDCFR_IRQ5);
861 break;
862 default:
863 device_printf(dev, "Invalid irq configuration (%ld) must be 3-5,9 for 3c503\n",
864 irq);
865 return (ENXIO);
866 }
867
868 /*
869 * Initialize GA configuration register. Set bank and enable shared
870 * mem.
871 */
872 ed_asic_outb(sc, ED_3COM_GACFR, ED_3COM_GACFR_RSEL |
873 ED_3COM_GACFR_MBS0);
874
875 /*
876 * Initialize "Vector Pointer" registers. These gawd-awful things are
877 * compared to 20 bits of the address on ISA, and if they match, the
878 * shared memory is disabled. We set them to 0xffff0...allegedly the
879 * reset vector.
880 */
881 ed_asic_outb(sc, ED_3COM_VPTR2, 0xff);
882 ed_asic_outb(sc, ED_3COM_VPTR1, 0xff);
883 ed_asic_outb(sc, ED_3COM_VPTR0, 0x00);
884
885 /*
886 * Zero memory and verify that it is clear
887 */
888 bzero(sc->mem_start, memsize);
889
890 for (i = 0; i < memsize; ++i)
891 if (sc->mem_start[i]) {
892 device_printf(dev, "failed to clear shared memory at %jx - check configuration\n",
893 (uintmax_t)kvtop(sc->mem_start + i));
894 return (ENXIO);
895 }
896 return (0);
897}
898
899/*
900 * Probe and vendor-specific initialization routine for SIC boards
901 */
902int
903ed_probe_SIC(device_t dev, int port_rid, int flags)
904{
905 struct ed_softc *sc = device_get_softc(dev);
906 int error;
907 int i;
908 u_int memsize;
909 u_long conf_maddr, conf_msize;
910 u_char sum;
911
912 error = ed_alloc_port(dev, 0, ED_SIC_IO_PORTS);
913 if (error)
914 return (error);
915
916 sc->asic_offset = ED_SIC_ASIC_OFFSET;
917 sc->nic_offset = ED_SIC_NIC_OFFSET;
918
919 error = bus_get_resource(dev, SYS_RES_MEMORY, 0,
920 &conf_maddr, &conf_msize);
921 if (error)
922 return (error);
923
924 memsize = 16384;
925 if (conf_msize > 1)
926 memsize = conf_msize;
927
928 error = ed_alloc_memory(dev, 0, memsize);
929 if (error)
930 return (error);
931
932 sc->mem_start = (caddr_t) rman_get_virtual(sc->mem_res);
933 sc->mem_size = memsize;
934
935 /* Reset card to force it into a known state. */
936 ed_asic_outb(sc, 0, 0x00);
937 DELAY(100);
938
939 /*
940 * Here we check the card ROM, if the checksum passes, and the
941 * type code and ethernet address check out, then we know we have
942 * an SIC card.
943 */
944 ed_asic_outb(sc, 0, 0x81);
945 DELAY(100);
946
947 sum = sc->mem_start[6];
948 for (i = 0; i < ETHER_ADDR_LEN; i++) {
949 sum ^= (sc->arpcom.ac_enaddr[i] = sc->mem_start[i]);
950 }
951#ifdef ED_DEBUG
952 device_printf(dev, "ed_probe_sic: got address %6D\n",
953 sc->arpcom.ac_enaddr, ":");
954#endif
955 if (sum != 0) {
956 return (ENXIO);
957 }
958 if ((sc->arpcom.ac_enaddr[0] | sc->arpcom.ac_enaddr[1] |
959 sc->arpcom.ac_enaddr[2]) == 0) {
960 return (ENXIO);
961 }
962
963 sc->vendor = ED_VENDOR_SIC;
964 sc->type_str = "SIC";
965 sc->isa16bit = 0;
966 sc->cr_proto = 0;
967
968 /*
969 * SIC RAM page 0x0000-0x3fff(or 0x7fff)
970 */
971 ed_asic_outb(sc, 0, 0x80);
972 DELAY(100);
973
974 /*
975 * Now zero memory and verify that it is clear
976 */
977 bzero(sc->mem_start, sc->mem_size);
978
979 for (i = 0; i < sc->mem_size; i++) {
980 if (sc->mem_start[i]) {
981 device_printf(dev, "failed to clear shared memory "
982 "at %jx - check configuration\n",
983 (uintmax_t)kvtop(sc->mem_start + i));
984
985 return (ENXIO);
986 }
987 }
988
989 sc->mem_shared = 1;
990 sc->mem_end = sc->mem_start + sc->mem_size;
991
992 /*
993 * allocate one xmit buffer if < 16k, two buffers otherwise
994 */
995 if ((sc->mem_size < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING)) {
996 sc->txb_cnt = 1;
997 } else {
998 sc->txb_cnt = 2;
999 }
1000 sc->tx_page_start = 0;
1001
1002 sc->rec_page_start = sc->tx_page_start + ED_TXBUF_SIZE * sc->txb_cnt;
1003 sc->rec_page_stop = sc->tx_page_start + sc->mem_size / ED_PAGE_SIZE;
1004
1005 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
1006
1007 return (0);
1008}
1009
1010/*
1011 * Probe and vendor-specific initialization routine for NE1000/2000 boards
1012 */
1013int
1014ed_probe_Novell_generic(device_t dev, int flags)
1015{
1016 struct ed_softc *sc = device_get_softc(dev);
1017 u_int memsize, n;
1018 u_char romdata[16], tmp;
1019 static char test_pattern[32] = "THIS is A memory TEST pattern";
1020 char test_buffer[32];
1021
1022 /* XXX - do Novell-specific probe here */
1023
1024 /* Reset the board */
1025 if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_GWETHER) {
1026 ed_asic_outb(sc, ED_NOVELL_RESET, 0);
1027 DELAY(200);
1028 }
1029 tmp = ed_asic_inb(sc, ED_NOVELL_RESET);
1030
1031 /*
1032 * I don't know if this is necessary; probably cruft leftover from
1033 * Clarkson packet driver code. Doesn't do a thing on the boards I've
1034 * tested. -DG [note that an outb(0x84, 0) seems to work here, and is
1035 * non-invasive...but some boards don't seem to reset and I don't have
1036 * complete documentation on what the 'right' thing to do is...so we
1037 * do the invasive thing for now. Yuck.]
1038 */
1039 ed_asic_outb(sc, ED_NOVELL_RESET, tmp);
1040 DELAY(5000);
1041
1042 /*
1043 * This is needed because some NE clones apparently don't reset the
1044 * NIC properly (or the NIC chip doesn't reset fully on power-up) XXX
1045 * - this makes the probe invasive! ...Done against my better
1046 * judgement. -DLG
1047 */
1048 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STP);
1049
1050 DELAY(5000);
1051
1052 /* Make sure that we really have an 8390 based board */
1053 if (!ed_probe_generic8390(sc))
1054 return (ENXIO);
1055
1056 sc->vendor = ED_VENDOR_NOVELL;
1057 sc->mem_shared = 0;
1058 sc->cr_proto = ED_CR_RD2;
1059
1060 /*
1061 * Test the ability to read and write to the NIC memory. This has the
1062 * side affect of determining if this is an NE1000 or an NE2000.
1063 */
1064
1065 /*
1066 * This prevents packets from being stored in the NIC memory when the
1067 * readmem routine turns on the start bit in the CR.
1068 */
1069 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON);
1070
1071 /* Temporarily initialize DCR for byte operations */
1072 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS);
1073
1074 ed_nic_outb(sc, ED_P0_PSTART, 8192 / ED_PAGE_SIZE);
1075 ed_nic_outb(sc, ED_P0_PSTOP, 16384 / ED_PAGE_SIZE);
1076
1077 sc->isa16bit = 0;
1078
1079 /*
1080 * Write a test pattern in byte mode. If this fails, then there
1081 * probably isn't any memory at 8k - which likely means that the board
1082 * is an NE2000.
1083 */
1084 ed_pio_writemem(sc, test_pattern, 8192, sizeof(test_pattern));
1085 ed_pio_readmem(sc, 8192, test_buffer, sizeof(test_pattern));
1086
1087 if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) {
1088 sc->type = ED_TYPE_NE1000;
1089 sc->type_str = "NE1000";
1090 } else {
1091
1092 /* neither an NE1000 nor a Linksys - try NE2000 */
1093 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_WTS | ED_DCR_FT1 | ED_DCR_LS);
1094 ed_nic_outb(sc, ED_P0_PSTART, 16384 / ED_PAGE_SIZE);
1095 ed_nic_outb(sc, ED_P0_PSTOP, 32768 / ED_PAGE_SIZE);
1096
1097 sc->isa16bit = 1;
1098
1099 /*
1100 * Write a test pattern in word mode. If this also fails, then
1101 * we don't know what this board is.
1102 */
1103 ed_pio_writemem(sc, test_pattern, 16384, sizeof(test_pattern));
1104 ed_pio_readmem(sc, 16384, test_buffer, sizeof(test_pattern));
1105 if (bcmp(test_pattern, test_buffer, sizeof(test_pattern)) == 0) {
1106 sc->type = ED_TYPE_NE2000;
1107 sc->type_str = "NE2000";
1108 } else {
1109 return (ENXIO);
1110 }
1111 }
1112
1113
1114 /* 8k of memory plus an additional 8k if 16bit */
1115 memsize = 8192 + sc->isa16bit * 8192;
1116
1117#if 0 /* probably not useful - NE boards only come two ways */
1118 /* allow kernel config file overrides */
1119 if (isa_dev->id_msize)
1120 memsize = isa_dev->id_msize;
1121#endif
1122
1123 sc->mem_size = memsize;
1124
1125 /* NIC memory doesn't start at zero on an NE board */
1126 /* The start address is tied to the bus width */
1127 sc->mem_start = (char *) 8192 + sc->isa16bit * 8192;
1128 sc->mem_end = sc->mem_start + memsize;
1129 sc->tx_page_start = memsize / ED_PAGE_SIZE;
1130
1131 if (ED_FLAGS_GETTYPE(flags) == ED_FLAGS_GWETHER) {
1132 int x, i, msize = 0;
1133 long mstart = 0;
1134 char pbuf0[ED_PAGE_SIZE], pbuf[ED_PAGE_SIZE], tbuf[ED_PAGE_SIZE];
1135
1136 for (i = 0; i < ED_PAGE_SIZE; i++)
1137 pbuf0[i] = 0;
1138
1139 /* Clear all the memory. */
1140 for (x = 1; x < 256; x++)
1141 ed_pio_writemem(sc, pbuf0, x * 256, ED_PAGE_SIZE);
1142
1143 /* Search for the start of RAM. */
1144 for (x = 1; x < 256; x++) {
1145 ed_pio_readmem(sc, x * 256, tbuf, ED_PAGE_SIZE);
1146 if (bcmp(pbuf0, tbuf, ED_PAGE_SIZE) == 0) {
1147 for (i = 0; i < ED_PAGE_SIZE; i++)
1148 pbuf[i] = 255 - x;
1149 ed_pio_writemem(sc, pbuf, x * 256, ED_PAGE_SIZE);
1150 ed_pio_readmem(sc, x * 256, tbuf, ED_PAGE_SIZE);
1151 if (bcmp(pbuf, tbuf, ED_PAGE_SIZE) == 0) {
1152 mstart = x * ED_PAGE_SIZE;
1153 msize = ED_PAGE_SIZE;
1154 break;
1155 }
1156 }
1157 }
1158
1159 if (mstart == 0) {
1160 device_printf(dev, "Cannot find start of RAM.\n");
1161 return (ENXIO);
1162 }
1163 /* Search for the start of RAM. */
1164 for (x = (mstart / ED_PAGE_SIZE) + 1; x < 256; x++) {
1165 ed_pio_readmem(sc, x * 256, tbuf, ED_PAGE_SIZE);
1166 if (bcmp(pbuf0, tbuf, ED_PAGE_SIZE) == 0) {
1167 for (i = 0; i < ED_PAGE_SIZE; i++)
1168 pbuf[i] = 255 - x;
1169 ed_pio_writemem(sc, pbuf, x * 256, ED_PAGE_SIZE);
1170 ed_pio_readmem(sc, x * 256, tbuf, ED_PAGE_SIZE);
1171 if (bcmp(pbuf, tbuf, ED_PAGE_SIZE) == 0)
1172 msize += ED_PAGE_SIZE;
1173 else {
1174 break;
1175 }
1176 } else {
1177 break;
1178 }
1179 }
1180
1181 if (msize == 0) {
1182 device_printf(dev, "Cannot find any RAM, start : %ld, x = %d.\n", mstart, x);
1183 return (ENXIO);
1184 }
1185 device_printf(dev, "RAM start at %ld, size : %d.\n", mstart, msize);
1186
1187 sc->mem_size = msize;
1188 sc->mem_start = (caddr_t)(uintptr_t) mstart;
1189 sc->mem_end = (caddr_t)(uintptr_t) (msize + mstart);
1190 sc->tx_page_start = mstart / ED_PAGE_SIZE;
1191 }
1192
1193 /*
1194 * Use one xmit buffer if < 16k, two buffers otherwise (if not told
1195 * otherwise).
1196 */
1197 if ((memsize < 16384) || (flags & ED_FLAGS_NO_MULTI_BUFFERING))
1198 sc->txb_cnt = 1;
1199 else
1200 sc->txb_cnt = 2;
1201
1202 sc->rec_page_start = sc->tx_page_start + sc->txb_cnt * ED_TXBUF_SIZE;
1203 sc->rec_page_stop = sc->tx_page_start + memsize / ED_PAGE_SIZE;
1204
1205 sc->mem_ring = sc->mem_start + sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE;
1206
1207 ed_pio_readmem(sc, 0, romdata, 16);
1208 for (n = 0; n < ETHER_ADDR_LEN; n++)
1209 sc->arpcom.ac_enaddr[n] = romdata[n * (sc->isa16bit + 1)];
1210
1211 if ((ED_FLAGS_GETTYPE(flags) == ED_FLAGS_GWETHER) &&
1212 (sc->arpcom.ac_enaddr[2] == 0x86)) {
1213 sc->type_str = "Gateway AT";
1214 }
1215
1216 /* clear any pending interrupts that might have occurred above */
1217 ed_nic_outb(sc, ED_P0_ISR, 0xff);
1218
1219 return (0);
1220}
1221
1222int
1223ed_probe_Novell(device_t dev, int port_rid, int flags)
1224{
1225 struct ed_softc *sc = device_get_softc(dev);
1226 int error;
1227
1228 error = ed_alloc_port(dev, port_rid, ED_NOVELL_IO_PORTS);
1229 if (error)
1230 return (error);
1231
1232 sc->asic_offset = ED_NOVELL_ASIC_OFFSET;
1233 sc->nic_offset = ED_NOVELL_NIC_OFFSET;
1234
1235 return ed_probe_Novell_generic(dev, flags);
1236}
1237
1238#define ED_HPP_TEST_SIZE 16
1239
1240/*
1241 * Probe and vendor specific initialization for the HP PC Lan+ Cards.
1242 * (HP Part nos: 27247B and 27252A).
1243 *
1244 * The card has an asic wrapper around a DS8390 core. The asic handles
1245 * host accesses and offers both standard register IO and memory mapped
1246 * IO. Memory mapped I/O allows better performance at the expense of greater
1247 * chance of an incompatibility with existing ISA cards.
1248 *
1249 * The card has a few caveats: it isn't tolerant of byte wide accesses, only
1250 * short (16 bit) or word (32 bit) accesses are allowed. Some card revisions
1251 * don't allow 32 bit accesses; these are indicated by a bit in the software
1252 * ID register (see if_edreg.h).
1253 *
1254 * Other caveats are: we should read the MAC address only when the card
1255 * is inactive.
1256 *
1257 * For more information; please consult the CRYNWR packet driver.
1258 *
1259 * The AUI port is turned on using the "link2" option on the ifconfig
1260 * command line.
1261 */
1262int
1263ed_probe_HP_pclanp(device_t dev, int port_rid, int flags)
1264{
1265 struct ed_softc *sc = device_get_softc(dev);
1266 int error;
1267 int n; /* temp var */
1268 int memsize; /* mem on board */
1269 u_char checksum; /* checksum of board address */
1270 u_char irq; /* board configured IRQ */
1271 uint8_t test_pattern[ED_HPP_TEST_SIZE]; /* read/write areas for */
1272 uint8_t test_buffer[ED_HPP_TEST_SIZE]; /* probing card */
1273 u_long conf_maddr, conf_msize, conf_irq, junk;
1274
1275 error = ed_alloc_port(dev, 0, ED_HPP_IO_PORTS);
1276 if (error)
1277 return (error);
1278
1279 /* Fill in basic information */
1280 sc->asic_offset = ED_HPP_ASIC_OFFSET;
1281 sc->nic_offset = ED_HPP_NIC_OFFSET;
1282
1283 sc->chip_type = ED_CHIP_TYPE_DP8390;
1284 sc->isa16bit = 0; /* the 8390 core needs to be in byte mode */
1285
1286 /*
1287 * Look for the HP PCLAN+ signature: "0x50,0x48,0x00,0x53"
1288 */
1289
1290 if ((ed_asic_inb(sc, ED_HPP_ID) != 0x50) ||
1291 (ed_asic_inb(sc, ED_HPP_ID + 1) != 0x48) ||
1292 ((ed_asic_inb(sc, ED_HPP_ID + 2) & 0xF0) != 0) ||
1293 (ed_asic_inb(sc, ED_HPP_ID + 3) != 0x53))
1294 return ENXIO;
1295
1296 /*
1297 * Read the MAC address and verify checksum on the address.
1298 */
1299
1300 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_MAC);
1301 for (n = 0, checksum = 0; n < ETHER_ADDR_LEN; n++)
1302 checksum += (sc->arpcom.ac_enaddr[n] =
1303 ed_asic_inb(sc, ED_HPP_MAC_ADDR + n));
1304
1305 checksum += ed_asic_inb(sc, ED_HPP_MAC_ADDR + ETHER_ADDR_LEN);
1306
1307 if (checksum != 0xFF)
1308 return ENXIO;
1309
1310 /*
1311 * Verify that the software model number is 0.
1312 */
1313
1314 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_ID);
1315 if (((sc->hpp_id = ed_asic_inw(sc, ED_HPP_PAGE_4)) &
1316 ED_HPP_ID_SOFT_MODEL_MASK) != 0x0000)
1317 return ENXIO;
1318
1319 /*
1320 * Read in and save the current options configured on card.
1321 */
1322
1323 sc->hpp_options = ed_asic_inw(sc, ED_HPP_OPTION);
1324
1325 sc->hpp_options |= (ED_HPP_OPTION_NIC_RESET |
1326 ED_HPP_OPTION_CHIP_RESET |
1327 ED_HPP_OPTION_ENABLE_IRQ);
1328
1329 /*
1330 * Reset the chip. This requires writing to the option register
1331 * so take care to preserve the other bits.
1332 */
1333
1334 ed_asic_outw(sc, ED_HPP_OPTION,
1335 (sc->hpp_options & ~(ED_HPP_OPTION_NIC_RESET |
1336 ED_HPP_OPTION_CHIP_RESET)));
1337
1338 DELAY(5000); /* wait for chip reset to complete */
1339
1340 ed_asic_outw(sc, ED_HPP_OPTION,
1341 (sc->hpp_options | (ED_HPP_OPTION_NIC_RESET |
1342 ED_HPP_OPTION_CHIP_RESET |
1343 ED_HPP_OPTION_ENABLE_IRQ)));
1344
1345 DELAY(5000);
1346
1347 if (!(ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST))
1348 return ENXIO; /* reset did not complete */
1349
1350 /*
1351 * Read out configuration information.
1352 */
1353
1354 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_HW);
1355
1356 irq = ed_asic_inb(sc, ED_HPP_HW_IRQ);
1357
1358 /*
1359 * Check for impossible IRQ.
1360 */
1361
1362 if (irq >= (sizeof(ed_hpp_intr_val) / sizeof(ed_hpp_intr_val[0])))
1363 return ENXIO;
1364
1365 /*
1366 * If the kernel IRQ was specified with a '?' use the cards idea
1367 * of the IRQ. If the kernel IRQ was explicitly specified, it
1368 * should match that of the hardware.
1369 */
1370 error = bus_get_resource(dev, SYS_RES_IRQ, 0,
1371 &conf_irq, &junk);
1372 if (error) {
1373 bus_set_resource(dev, SYS_RES_IRQ, 0,
1374 ed_hpp_intr_val[irq], 1);
1375 } else {
1376 if (conf_irq != ed_hpp_intr_val[irq])
1377 return (ENXIO);
1378 }
1379
1380 /*
1381 * Fill in softconfig info.
1382 */
1383
1384 sc->vendor = ED_VENDOR_HP;
1385 sc->type = ED_TYPE_HP_PCLANPLUS;
1386 sc->type_str = "HP-PCLAN+";
1387
1388 sc->mem_shared = 0; /* we DON'T have dual ported RAM */
1389 sc->mem_start = 0; /* we use offsets inside the card RAM */
1390
1391 sc->hpp_mem_start = NULL;/* no memory mapped I/O by default */
1392
1393 /*
1394 * The board has 32KB of memory. Is there a way to determine
1395 * this programmatically?
1396 */
1397
1398 memsize = 32768;
1399
1400 /*
1401 * Check if memory mapping of the I/O registers possible.
1402 */
1403
1404 if (sc->hpp_options & ED_HPP_OPTION_MEM_ENABLE)
1405 {
1406 u_long mem_addr;
1407
1408 /*
1409 * determine the memory address from the board.
1410 */
1411
1412 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_HW);
1413 mem_addr = (ed_asic_inw(sc, ED_HPP_HW_MEM_MAP) << 8);
1414
1415 /*
1416 * Check that the kernel specified start of memory and
1417 * hardware's idea of it match.
1418 */
1419 error = bus_get_resource(dev, SYS_RES_MEMORY, 0,
1420 &conf_maddr, &conf_msize);
1421 if (error)
1422 return (error);
1423
1424 if (mem_addr != conf_maddr)
1425 return ENXIO;
1426
1427 error = ed_alloc_memory(dev, 0, memsize);
1428 if (error)
1429 return (error);
1430
1431 sc->hpp_mem_start = rman_get_virtual(sc->mem_res);
1432 }
1433
1434 /*
1435 * Fill in the rest of the soft config structure.
1436 */
1437
1438 /*
1439 * The transmit page index.
1440 */
1441
1442 sc->tx_page_start = ED_HPP_TX_PAGE_OFFSET;
1443
1444 if (device_get_flags(dev) & ED_FLAGS_NO_MULTI_BUFFERING)
1445 sc->txb_cnt = 1;
1446 else
1447 sc->txb_cnt = 2;
1448
1449 /*
1450 * Memory description
1451 */
1452
1453 sc->mem_size = memsize;
1454 sc->mem_ring = sc->mem_start +
1455 (sc->txb_cnt * ED_PAGE_SIZE * ED_TXBUF_SIZE);
1456 sc->mem_end = sc->mem_start + sc->mem_size;
1457
1458 /*
1459 * Receive area starts after the transmit area and
1460 * continues till the end of memory.
1461 */
1462
1463 sc->rec_page_start = sc->tx_page_start +
1464 (sc->txb_cnt * ED_TXBUF_SIZE);
1465 sc->rec_page_stop = (sc->mem_size / ED_PAGE_SIZE);
1466
1467
1468 sc->cr_proto = 0; /* value works */
1469
1470 /*
1471 * Set the wrap registers for string I/O reads.
1472 */
1473
1474 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_HW);
1475 ed_asic_outw(sc, ED_HPP_HW_WRAP,
1476 ((sc->rec_page_start / ED_PAGE_SIZE) |
1477 (((sc->rec_page_stop / ED_PAGE_SIZE) - 1) << 8)));
1478
1479 /*
1480 * Reset the register page to normal operation.
1481 */
1482
1483 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_PERF);
1484
1485 /*
1486 * Verify that we can read/write from adapter memory.
1487 * Create test pattern.
1488 */
1489
1490 for (n = 0; n < ED_HPP_TEST_SIZE; n++)
1491 {
1492 test_pattern[n] = (n*n) ^ ~n;
1493 }
1494
1495#undef ED_HPP_TEST_SIZE
1496
1497 /*
1498 * Check that the memory is accessible thru the I/O ports.
1499 * Write out the contents of "test_pattern", read back
1500 * into "test_buffer" and compare the two for any
1501 * mismatch.
1502 */
1503
1504 for (n = 0; n < (32768 / ED_PAGE_SIZE); n ++) {
1505
1506 ed_hpp_writemem(sc, test_pattern, (n * ED_PAGE_SIZE),
1507 sizeof(test_pattern));
1508 ed_hpp_readmem(sc, (n * ED_PAGE_SIZE),
1509 test_buffer, sizeof(test_pattern));
1510
1511 if (bcmp(test_pattern, test_buffer,
1512 sizeof(test_pattern)))
1513 return ENXIO;
1514 }
1515
1516 return (0);
1517
1518}
1519
1520/*
1521 * HP PC Lan+ : Set the physical link to use AUI or TP/TL.
1522 */
1523
1524static void
1525ed_hpp_set_physical_link(struct ed_softc *sc)
1526{
1527 struct ifnet *ifp = &sc->arpcom.ac_if;
1528 int lan_page;
1529
1530 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_LAN);
1531 lan_page = ed_asic_inw(sc, ED_HPP_PAGE_0);
1532
1533 if (ifp->if_flags & IFF_ALTPHYS) {
1534
1535 /*
1536 * Use the AUI port.
1537 */
1538
1539 lan_page |= ED_HPP_LAN_AUI;
1540
1541 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_LAN);
1542 ed_asic_outw(sc, ED_HPP_PAGE_0, lan_page);
1543
1544
1545 } else {
1546
1547 /*
1548 * Use the ThinLan interface
1549 */
1550
1551 lan_page &= ~ED_HPP_LAN_AUI;
1552
1553 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_LAN);
1554 ed_asic_outw(sc, ED_HPP_PAGE_0, lan_page);
1555
1556 }
1557
1558 /*
1559 * Wait for the lan card to re-initialize itself
1560 */
1561
1562 DELAY(150000); /* wait 150 ms */
1563
1564 /*
1565 * Restore normal pages.
1566 */
1567
1568 ed_asic_outw(sc, ED_HPP_PAGING, ED_HPP_PAGE_PERF);
1569
1570}
1571
1572/*
1573 * Allocate a port resource with the given resource id.
1574 */
1575int
1576ed_alloc_port(device_t dev, int rid, int size)
1577{
1578 struct ed_softc *sc = device_get_softc(dev);
1579 struct resource *res;
1580
1581 res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
133 * Allocate a port resource with the given resource id.
134 */
135int
136ed_alloc_port(device_t dev, int rid, int size)
137{
138 struct ed_softc *sc = device_get_softc(dev);
139 struct resource *res;
140
141 res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
1582 0ul, ~0ul, size, RF_ACTIVE);
142 0ul, ~0ul, size, RF_ACTIVE);
1583 if (res) {
1584 sc->port_rid = rid;
1585 sc->port_res = res;
1586 sc->port_used = size;
1587 return (0);
1588 } else {
1589 return (ENOENT);
1590 }
1591}
1592
1593/*
1594 * Allocate a memory resource with the given resource id.
1595 */
1596int
1597ed_alloc_memory(device_t dev, int rid, int size)
1598{
1599 struct ed_softc *sc = device_get_softc(dev);
1600 struct resource *res;
1601
1602 res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
143 if (res) {
144 sc->port_rid = rid;
145 sc->port_res = res;
146 sc->port_used = size;
147 return (0);
148 } else {
149 return (ENOENT);
150 }
151}
152
153/*
154 * Allocate a memory resource with the given resource id.
155 */
156int
157ed_alloc_memory(device_t dev, int rid, int size)
158{
159 struct ed_softc *sc = device_get_softc(dev);
160 struct resource *res;
161
162 res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
1603 0ul, ~0ul, size, RF_ACTIVE);
163 0ul, ~0ul, size, RF_ACTIVE);
1604 if (res) {
1605 sc->mem_rid = rid;
1606 sc->mem_res = res;
1607 sc->mem_used = size;
1608 return (0);
1609 } else {
1610 return (ENOENT);
1611 }
1612}
1613
1614/*
1615 * Allocate an irq resource with the given resource id.
1616 */
1617int
1618ed_alloc_irq(device_t dev, int rid, int flags)
1619{
1620 struct ed_softc *sc = device_get_softc(dev);
1621 struct resource *res;
1622
164 if (res) {
165 sc->mem_rid = rid;
166 sc->mem_res = res;
167 sc->mem_used = size;
168 return (0);
169 } else {
170 return (ENOENT);
171 }
172}
173
174/*
175 * Allocate an irq resource with the given resource id.
176 */
177int
178ed_alloc_irq(device_t dev, int rid, int flags)
179{
180 struct ed_softc *sc = device_get_softc(dev);
181 struct resource *res;
182
1623 res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
1624 (RF_ACTIVE | flags));
183 res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | flags);
1625 if (res) {
1626 sc->irq_rid = rid;
1627 sc->irq_res = res;
1628 return (0);
1629 } else {
1630 return (ENOENT);
1631 }
1632}
1633
1634/*
1635 * Release all resources
1636 */
1637void
1638ed_release_resources(device_t dev)
1639{
1640 struct ed_softc *sc = device_get_softc(dev);
1641
1642 if (sc->port_res) {
1643 bus_deactivate_resource(dev, SYS_RES_IOPORT,
1644 sc->port_rid, sc->port_res);
1645 bus_release_resource(dev, SYS_RES_IOPORT,
1646 sc->port_rid, sc->port_res);
1647 sc->port_res = 0;
1648 }
1649 if (sc->mem_res) {
1650 bus_deactivate_resource(dev, SYS_RES_MEMORY,
1651 sc->mem_rid, sc->mem_res);
1652 bus_release_resource(dev, SYS_RES_MEMORY,
1653 sc->mem_rid, sc->mem_res);
1654 sc->mem_res = 0;
1655 }
1656 if (sc->irq_res) {
1657 bus_deactivate_resource(dev, SYS_RES_IRQ,
1658 sc->irq_rid, sc->irq_res);
1659 bus_release_resource(dev, SYS_RES_IRQ,
1660 sc->irq_rid, sc->irq_res);
1661 sc->irq_res = 0;
1662 }
1663}
1664
1665/*
1666 * Install interface into kernel networking data structures
1667 */
1668int
1669ed_attach(device_t dev)
1670{
1671 struct ed_softc *sc = device_get_softc(dev);
1672 struct ifnet *ifp = &sc->arpcom.ac_if;
1673
1674 callout_handle_init(&sc->tick_ch);
1675 /*
1676 * Set interface to stopped condition (reset)
1677 */
1678 ed_stop(sc);
1679
1680 /*
1681 * Initialize ifnet structure
1682 */
1683 ifp->if_softc = sc;
1684 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1685 ifp->if_start = ed_start;
1686 ifp->if_ioctl = ed_ioctl;
1687 ifp->if_watchdog = ed_watchdog;
1688 ifp->if_init = ed_init;
1689 IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
1690 ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
1691 IFQ_SET_READY(&ifp->if_snd);
1692 ifp->if_linkmib = &sc->mibdata;
1693 ifp->if_linkmiblen = sizeof sc->mibdata;
1694 /*
1695 * XXX - should do a better job.
1696 */
1697 if (sc->chip_type == ED_CHIP_TYPE_WD790)
1698 sc->mibdata.dot3StatsEtherChipSet =
1699 DOT3CHIPSET(dot3VendorWesternDigital,
1700 dot3ChipSetWesternDigital83C790);
1701 else
1702 sc->mibdata.dot3StatsEtherChipSet =
1703 DOT3CHIPSET(dot3VendorNational,
1704 dot3ChipSetNational8390);
1705 sc->mibdata.dot3Compliance = DOT3COMPLIANCE_COLLS;
1706
1707 /*
1708 * Set default state for ALTPHYS flag (used to disable the
1709 * tranceiver for AUI operation), based on compile-time
1710 * config option.
1711 */
1712 if (device_get_flags(dev) & ED_FLAGS_DISABLE_TRANCEIVER)
1713 ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
1714 IFF_MULTICAST | IFF_ALTPHYS | IFF_NEEDSGIANT);
1715 else
1716 ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
1717 IFF_MULTICAST | IFF_NEEDSGIANT);
1718
1719 /*
1720 * Attach the interface
1721 */
1722 ether_ifattach(ifp, sc->arpcom.ac_enaddr);
1723 /* device attach does transition from UNCONFIGURED to IDLE state */
1724
1725 if (bootverbose || 1) {
1726 if (sc->type_str && (*sc->type_str != 0))
1727 device_printf(dev, "type %s ", sc->type_str);
1728 else
1729 device_printf(dev, "type unknown (0x%x) ", sc->type);
1730
184 if (res) {
185 sc->irq_rid = rid;
186 sc->irq_res = res;
187 return (0);
188 } else {
189 return (ENOENT);
190 }
191}
192
193/*
194 * Release all resources
195 */
196void
197ed_release_resources(device_t dev)
198{
199 struct ed_softc *sc = device_get_softc(dev);
200
201 if (sc->port_res) {
202 bus_deactivate_resource(dev, SYS_RES_IOPORT,
203 sc->port_rid, sc->port_res);
204 bus_release_resource(dev, SYS_RES_IOPORT,
205 sc->port_rid, sc->port_res);
206 sc->port_res = 0;
207 }
208 if (sc->mem_res) {
209 bus_deactivate_resource(dev, SYS_RES_MEMORY,
210 sc->mem_rid, sc->mem_res);
211 bus_release_resource(dev, SYS_RES_MEMORY,
212 sc->mem_rid, sc->mem_res);
213 sc->mem_res = 0;
214 }
215 if (sc->irq_res) {
216 bus_deactivate_resource(dev, SYS_RES_IRQ,
217 sc->irq_rid, sc->irq_res);
218 bus_release_resource(dev, SYS_RES_IRQ,
219 sc->irq_rid, sc->irq_res);
220 sc->irq_res = 0;
221 }
222}
223
224/*
225 * Install interface into kernel networking data structures
226 */
227int
228ed_attach(device_t dev)
229{
230 struct ed_softc *sc = device_get_softc(dev);
231 struct ifnet *ifp = &sc->arpcom.ac_if;
232
233 callout_handle_init(&sc->tick_ch);
234 /*
235 * Set interface to stopped condition (reset)
236 */
237 ed_stop(sc);
238
239 /*
240 * Initialize ifnet structure
241 */
242 ifp->if_softc = sc;
243 if_initname(ifp, device_get_name(dev), device_get_unit(dev));
244 ifp->if_start = ed_start;
245 ifp->if_ioctl = ed_ioctl;
246 ifp->if_watchdog = ed_watchdog;
247 ifp->if_init = ed_init;
248 IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
249 ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
250 IFQ_SET_READY(&ifp->if_snd);
251 ifp->if_linkmib = &sc->mibdata;
252 ifp->if_linkmiblen = sizeof sc->mibdata;
253 /*
254 * XXX - should do a better job.
255 */
256 if (sc->chip_type == ED_CHIP_TYPE_WD790)
257 sc->mibdata.dot3StatsEtherChipSet =
258 DOT3CHIPSET(dot3VendorWesternDigital,
259 dot3ChipSetWesternDigital83C790);
260 else
261 sc->mibdata.dot3StatsEtherChipSet =
262 DOT3CHIPSET(dot3VendorNational,
263 dot3ChipSetNational8390);
264 sc->mibdata.dot3Compliance = DOT3COMPLIANCE_COLLS;
265
266 /*
267 * Set default state for ALTPHYS flag (used to disable the
268 * tranceiver for AUI operation), based on compile-time
269 * config option.
270 */
271 if (device_get_flags(dev) & ED_FLAGS_DISABLE_TRANCEIVER)
272 ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
273 IFF_MULTICAST | IFF_ALTPHYS | IFF_NEEDSGIANT);
274 else
275 ifp->if_flags = (IFF_BROADCAST | IFF_SIMPLEX |
276 IFF_MULTICAST | IFF_NEEDSGIANT);
277
278 /*
279 * Attach the interface
280 */
281 ether_ifattach(ifp, sc->arpcom.ac_enaddr);
282 /* device attach does transition from UNCONFIGURED to IDLE state */
283
284 if (bootverbose || 1) {
285 if (sc->type_str && (*sc->type_str != 0))
286 device_printf(dev, "type %s ", sc->type_str);
287 else
288 device_printf(dev, "type unknown (0x%x) ", sc->type);
289
290#ifdef ED_HPP
1731 if (sc->vendor == ED_VENDOR_HP)
1732 printf("(%s %s IO)",
1733 (sc->hpp_id & ED_HPP_ID_16_BIT_ACCESS) ?
1734 "16-bit" : "32-bit",
1735 sc->hpp_mem_start ? "memory mapped" : "regular");
1736 else
291 if (sc->vendor == ED_VENDOR_HP)
292 printf("(%s %s IO)",
293 (sc->hpp_id & ED_HPP_ID_16_BIT_ACCESS) ?
294 "16-bit" : "32-bit",
295 sc->hpp_mem_start ? "memory mapped" : "regular");
296 else
297#endif
1737 printf("%s ", sc->isa16bit ? "(16 bit)" : "(8 bit)");
1738
1739 printf("%s\n", (((sc->vendor == ED_VENDOR_3COM) ||
1740 (sc->vendor == ED_VENDOR_HP)) &&
1741 (ifp->if_flags & IFF_ALTPHYS)) ?
1742 " tranceiver disabled" : "");
1743 }
1744 return (0);
1745}
1746
1747/*
1748 * Detach the driver from the hardware and other systems in the kernel.
1749 */
1750int
1751ed_detach(device_t dev)
1752{
1753 struct ed_softc *sc = device_get_softc(dev);
1754 struct ifnet *ifp = &sc->arpcom.ac_if;
1755
1756 if (sc->gone)
1757 return (0);
1758 ed_stop(sc);
1759 ifp->if_flags &= ~IFF_RUNNING;
1760 ether_ifdetach(ifp);
1761 sc->gone = 1;
1762 bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
1763 ed_release_resources(dev);
1764 return (0);
1765}
1766
1767/*
1768 * Reset interface.
1769 */
1770static void
1771ed_reset(struct ifnet *ifp)
1772{
1773 struct ed_softc *sc = ifp->if_softc;
1774 int s;
1775
1776 if (sc->gone)
1777 return;
1778 s = splimp();
1779
1780 /*
1781 * Stop interface and re-initialize.
1782 */
1783 ed_stop(sc);
1784 ed_init(sc);
1785
1786 (void) splx(s);
1787}
1788
1789/*
1790 * Take interface offline.
1791 */
1792void
1793ed_stop(struct ed_softc *sc)
1794{
1795 int n = 5000;
1796
1797#ifndef ED_NO_MIIBUS
1798 untimeout(ed_tick, sc, sc->tick_ch);
1799 callout_handle_init(&sc->tick_ch);
1800#endif
1801 if (sc->gone)
1802 return;
1803 /*
1804 * Stop everything on the interface, and select page 0 registers.
1805 */
1806 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
1807
1808 /*
1809 * Wait for interface to enter stopped state, but limit # of checks to
1810 * 'n' (about 5ms). It shouldn't even take 5us on modern DS8390's, but
1811 * just in case it's an old one.
1812 */
1813 if (sc->chip_type != ED_CHIP_TYPE_AX88190)
1814 while (((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST) == 0) && --n);
1815}
1816
1817/*
1818 * Device timeout/watchdog routine. Entered if the device neglects to
1819 * generate an interrupt after a transmit has been started on it.
1820 */
1821static void
1822ed_watchdog(struct ifnet *ifp)
1823{
1824 struct ed_softc *sc = ifp->if_softc;
1825
1826 if (sc->gone)
1827 return;
1828 log(LOG_ERR, "%s: device timeout\n", ifp->if_xname);
1829 ifp->if_oerrors++;
1830
1831 ed_reset(ifp);
1832}
1833
1834#ifndef ED_NO_MIIBUS
1835static void
1836ed_tick(void *arg)
1837{
1838 struct ed_softc *sc = arg;
1839 struct mii_data *mii;
1840 int s;
1841
1842 if (sc->gone) {
1843 callout_handle_init(&sc->tick_ch);
1844 return;
1845 }
1846 s = splimp();
1847 if (sc->miibus != NULL) {
1848 mii = device_get_softc(sc->miibus);
1849 mii_tick(mii);
1850 }
1851 sc->tick_ch = timeout(ed_tick, sc, hz);
1852 splx(s);
1853}
1854#endif
1855
1856/*
1857 * Initialize device.
1858 */
1859static void
1860ed_init(void *xsc)
1861{
1862 struct ed_softc *sc = xsc;
1863 struct ifnet *ifp = &sc->arpcom.ac_if;
1864 int i, s;
1865
1866 if (sc->gone)
1867 return;
1868
1869 /*
1870 * Initialize the NIC in the exact order outlined in the NS manual.
1871 * This init procedure is "mandatory"...don't change what or when
1872 * things happen.
1873 */
1874 s = splimp();
1875
1876 /* reset transmitter flags */
1877 sc->xmit_busy = 0;
1878 ifp->if_timer = 0;
1879
1880 sc->txb_inuse = 0;
1881 sc->txb_new = 0;
1882 sc->txb_next_tx = 0;
1883
1884 /* This variable is used below - don't move this assignment */
1885 sc->next_packet = sc->rec_page_start + 1;
1886
1887 /*
1888 * Set interface for page 0, Remote DMA complete, Stopped
1889 */
1890 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
1891
1892 if (sc->isa16bit) {
1893
1894 /*
1895 * Set FIFO threshold to 8, No auto-init Remote DMA, byte
1896 * order=80x86, word-wide DMA xfers,
1897 */
1898 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS);
1899 } else {
1900
1901 /*
1902 * Same as above, but byte-wide DMA xfers
1903 */
1904 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS);
1905 }
1906
1907 /*
1908 * Clear Remote Byte Count Registers
1909 */
1910 ed_nic_outb(sc, ED_P0_RBCR0, 0);
1911 ed_nic_outb(sc, ED_P0_RBCR1, 0);
1912
1913 /*
1914 * For the moment, don't store incoming packets in memory.
1915 */
1916 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON);
1917
1918 /*
1919 * Place NIC in internal loopback mode
1920 */
1921 ed_nic_outb(sc, ED_P0_TCR, ED_TCR_LB0);
1922
1923 /*
1924 * Initialize transmit/receive (ring-buffer) Page Start
1925 */
1926 ed_nic_outb(sc, ED_P0_TPSR, sc->tx_page_start);
1927 ed_nic_outb(sc, ED_P0_PSTART, sc->rec_page_start);
1928 /* Set lower bits of byte addressable framing to 0 */
1929 if (sc->chip_type == ED_CHIP_TYPE_WD790)
1930 ed_nic_outb(sc, 0x09, 0);
1931
1932 /*
1933 * Initialize Receiver (ring-buffer) Page Stop and Boundry
1934 */
1935 ed_nic_outb(sc, ED_P0_PSTOP, sc->rec_page_stop);
1936 ed_nic_outb(sc, ED_P0_BNRY, sc->rec_page_start);
1937
1938 /*
1939 * Clear all interrupts. A '1' in each bit position clears the
1940 * corresponding flag.
1941 */
1942 ed_nic_outb(sc, ED_P0_ISR, 0xff);
1943
1944 /*
1945 * Enable the following interrupts: receive/transmit complete,
1946 * receive/transmit error, and Receiver OverWrite.
1947 *
1948 * Counter overflow and Remote DMA complete are *not* enabled.
1949 */
1950 ed_nic_outb(sc, ED_P0_IMR,
1951 ED_IMR_PRXE | ED_IMR_PTXE | ED_IMR_RXEE | ED_IMR_TXEE | ED_IMR_OVWE);
1952
1953 /*
1954 * Program Command Register for page 1
1955 */
1956 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STP);
1957
1958 /*
1959 * Copy out our station address
1960 */
1961 for (i = 0; i < ETHER_ADDR_LEN; ++i)
1962 ed_nic_outb(sc, ED_P1_PAR(i), sc->arpcom.ac_enaddr[i]);
1963
1964 /*
1965 * Set Current Page pointer to next_packet (initialized above)
1966 */
1967 ed_nic_outb(sc, ED_P1_CURR, sc->next_packet);
1968
1969 /*
1970 * Program Receiver Configuration Register and multicast filter. CR is
1971 * set to page 0 on return.
1972 */
1973 ed_setrcr(sc);
1974
1975 /*
1976 * Take interface out of loopback
1977 */
1978 ed_nic_outb(sc, ED_P0_TCR, 0);
1979
1980 /*
1981 * If this is a 3Com board, the tranceiver must be software enabled
1982 * (there is no settable hardware default).
1983 */
1984 if (sc->vendor == ED_VENDOR_3COM) {
1985 if (ifp->if_flags & IFF_ALTPHYS) {
1986 ed_asic_outb(sc, ED_3COM_CR, 0);
1987 } else {
1988 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_XSEL);
1989 }
1990 }
1991
1992#ifndef ED_NO_MIIBUS
1993 if (sc->miibus != NULL) {
1994 struct mii_data *mii;
1995 mii = device_get_softc(sc->miibus);
1996 mii_mediachg(mii);
1997 }
1998#endif
1999 /*
2000 * Set 'running' flag, and clear output active flag.
2001 */
2002 ifp->if_flags |= IFF_RUNNING;
2003 ifp->if_flags &= ~IFF_OACTIVE;
2004
2005 /*
2006 * ...and attempt to start output
2007 */
2008 ed_start(ifp);
2009
2010#ifndef ED_NO_MIIBUS
2011 untimeout(ed_tick, sc, sc->tick_ch);
2012 sc->tick_ch = timeout(ed_tick, sc, hz);
2013#endif
2014 (void) splx(s);
2015}
2016
2017/*
2018 * This routine actually starts the transmission on the interface
2019 */
2020static __inline void
2021ed_xmit(struct ed_softc *sc)
2022{
2023 struct ifnet *ifp = (struct ifnet *)sc;
2024 unsigned short len;
2025
2026 if (sc->gone)
2027 return;
2028 len = sc->txb_len[sc->txb_next_tx];
2029
2030 /*
2031 * Set NIC for page 0 register access
2032 */
2033 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
2034
2035 /*
2036 * Set TX buffer start page
2037 */
2038 ed_nic_outb(sc, ED_P0_TPSR, sc->tx_page_start +
2039 sc->txb_next_tx * ED_TXBUF_SIZE);
2040
2041 /*
2042 * Set TX length
2043 */
2044 ed_nic_outb(sc, ED_P0_TBCR0, len);
2045 ed_nic_outb(sc, ED_P0_TBCR1, len >> 8);
2046
2047 /*
2048 * Set page 0, Remote DMA complete, Transmit Packet, and *Start*
2049 */
2050 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_TXP | ED_CR_STA);
2051 sc->xmit_busy = 1;
2052
2053 /*
2054 * Point to next transmit buffer slot and wrap if necessary.
2055 */
2056 sc->txb_next_tx++;
2057 if (sc->txb_next_tx == sc->txb_cnt)
2058 sc->txb_next_tx = 0;
2059
2060 /*
2061 * Set a timer just in case we never hear from the board again
2062 */
2063 ifp->if_timer = 2;
2064}
2065
2066/*
2067 * Start output on interface.
2068 * We make two assumptions here:
2069 * 1) that the current priority is set to splimp _before_ this code
2070 * is called *and* is returned to the appropriate priority after
2071 * return
2072 * 2) that the IFF_OACTIVE flag is checked before this code is called
2073 * (i.e. that the output part of the interface is idle)
2074 */
2075static void
2076ed_start(struct ifnet *ifp)
2077{
2078 struct ed_softc *sc = ifp->if_softc;
2079 struct mbuf *m0, *m;
2080 caddr_t buffer;
2081 int len;
2082
2083 if (sc->gone) {
2084 printf("ed_start(%p) GONE\n",ifp);
2085 return;
2086 }
2087outloop:
2088
2089 /*
2090 * First, see if there are buffered packets and an idle transmitter -
2091 * should never happen at this point.
2092 */
2093 if (sc->txb_inuse && (sc->xmit_busy == 0)) {
2094 printf("ed: packets buffered, but transmitter idle\n");
2095 ed_xmit(sc);
2096 }
2097
2098 /*
2099 * See if there is room to put another packet in the buffer.
2100 */
2101 if (sc->txb_inuse == sc->txb_cnt) {
2102
2103 /*
2104 * No room. Indicate this to the outside world and exit.
2105 */
2106 ifp->if_flags |= IFF_OACTIVE;
2107 return;
2108 }
2109 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
2110 if (m == 0) {
2111
2112 /*
2113 * We are using the !OACTIVE flag to indicate to the outside
2114 * world that we can accept an additional packet rather than
2115 * that the transmitter is _actually_ active. Indeed, the
2116 * transmitter may be active, but if we haven't filled all the
2117 * buffers with data then we still want to accept more.
2118 */
2119 ifp->if_flags &= ~IFF_OACTIVE;
2120 return;
2121 }
2122
2123 /*
2124 * Copy the mbuf chain into the transmit buffer
2125 */
2126
2127 m0 = m;
2128
2129 /* txb_new points to next open buffer slot */
2130 buffer = sc->mem_start + (sc->txb_new * ED_TXBUF_SIZE * ED_PAGE_SIZE);
2131
2132 if (sc->mem_shared) {
2133
2134 /*
2135 * Special case setup for 16 bit boards...
2136 */
2137 if (sc->isa16bit) {
2138 switch (sc->vendor) {
2139
2140 /*
2141 * For 16bit 3Com boards (which have 16k of
2142 * memory), we have the xmit buffers in a
2143 * different page of memory ('page 0') - so
2144 * change pages.
2145 */
2146 case ED_VENDOR_3COM:
2147 ed_asic_outb(sc, ED_3COM_GACFR,
2148 ED_3COM_GACFR_RSEL);
2149 break;
2150
2151 /*
2152 * Enable 16bit access to shared memory on
2153 * WD/SMC boards.
2154 */
2155 case ED_VENDOR_WD_SMC:
2156 ed_asic_outb(sc, ED_WD_LAAR,
2157 sc->wd_laar_proto | ED_WD_LAAR_M16EN);
2158 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
2159 ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_MENB);
2160 }
2161 break;
2162 }
2163 }
2164 for (len = 0; m != 0; m = m->m_next) {
2165 bcopy(mtod(m, caddr_t), buffer, m->m_len);
2166 buffer += m->m_len;
2167 len += m->m_len;
2168 }
2169
2170 /*
2171 * Restore previous shared memory access
2172 */
2173 if (sc->isa16bit) {
2174 switch (sc->vendor) {
2175 case ED_VENDOR_3COM:
2176 ed_asic_outb(sc, ED_3COM_GACFR,
2177 ED_3COM_GACFR_RSEL | ED_3COM_GACFR_MBS0);
2178 break;
2179 case ED_VENDOR_WD_SMC:
2180 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
2181 ed_asic_outb(sc, ED_WD_MSR, 0x00);
2182 }
2183 ed_asic_outb(sc, ED_WD_LAAR,
2184 sc->wd_laar_proto & ~ED_WD_LAAR_M16EN);
2185 break;
2186 }
2187 }
2188 } else {
2189 len = ed_pio_write_mbufs(sc, m, (uintptr_t)buffer);
2190 if (len == 0) {
2191 m_freem(m0);
2192 goto outloop;
2193 }
2194 }
2195
2196 sc->txb_len[sc->txb_new] = max(len, (ETHER_MIN_LEN-ETHER_CRC_LEN));
2197
2198 sc->txb_inuse++;
2199
2200 /*
2201 * Point to next buffer slot and wrap if necessary.
2202 */
2203 sc->txb_new++;
2204 if (sc->txb_new == sc->txb_cnt)
2205 sc->txb_new = 0;
2206
2207 if (sc->xmit_busy == 0)
2208 ed_xmit(sc);
2209
2210 /*
2211 * Tap off here if there is a bpf listener.
2212 */
2213 BPF_MTAP(ifp, m0);
2214
2215 m_freem(m0);
2216
2217 /*
2218 * Loop back to the top to possibly buffer more packets
2219 */
2220 goto outloop;
2221}
2222
2223/*
2224 * Ethernet interface receiver interrupt.
2225 */
2226static __inline void
2227ed_rint(struct ed_softc *sc)
2228{
2229 struct ifnet *ifp = &sc->arpcom.ac_if;
2230 u_char boundry;
2231 u_short len;
2232 struct ed_ring packet_hdr;
2233 char *packet_ptr;
2234
2235 if (sc->gone)
2236 return;
2237
2238 /*
2239 * Set NIC to page 1 registers to get 'current' pointer
2240 */
2241 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STA);
2242
2243 /*
2244 * 'sc->next_packet' is the logical beginning of the ring-buffer -
2245 * i.e. it points to where new data has been buffered. The 'CURR'
2246 * (current) register points to the logical end of the ring-buffer -
2247 * i.e. it points to where additional new data will be added. We loop
2248 * here until the logical beginning equals the logical end (or in
2249 * other words, until the ring-buffer is empty).
2250 */
2251 while (sc->next_packet != ed_nic_inb(sc, ED_P1_CURR)) {
2252
2253 /* get pointer to this buffer's header structure */
2254 packet_ptr = sc->mem_ring +
2255 (sc->next_packet - sc->rec_page_start) * ED_PAGE_SIZE;
2256
2257 /*
2258 * The byte count includes a 4 byte header that was added by
2259 * the NIC.
2260 */
2261 if (sc->mem_shared)
2262 packet_hdr = *(struct ed_ring *) packet_ptr;
2263 else
2264 ed_pio_readmem(sc, (uintptr_t)packet_ptr,
2265 (char *) &packet_hdr, sizeof(packet_hdr));
2266 len = packet_hdr.count;
2267 if (len > (ETHER_MAX_LEN - ETHER_CRC_LEN + sizeof(struct ed_ring)) ||
2268 len < (ETHER_MIN_LEN - ETHER_CRC_LEN + sizeof(struct ed_ring))) {
2269 /*
2270 * Length is a wild value. There's a good chance that
2271 * this was caused by the NIC being old and buggy.
2272 * The bug is that the length low byte is duplicated in
2273 * the high byte. Try to recalculate the length based on
2274 * the pointer to the next packet.
2275 */
2276 /*
2277 * NOTE: sc->next_packet is pointing at the current packet.
2278 */
2279 len &= ED_PAGE_SIZE - 1; /* preserve offset into page */
2280 if (packet_hdr.next_packet >= sc->next_packet) {
2281 len += (packet_hdr.next_packet - sc->next_packet) * ED_PAGE_SIZE;
2282 } else {
2283 len += ((packet_hdr.next_packet - sc->rec_page_start) +
2284 (sc->rec_page_stop - sc->next_packet)) * ED_PAGE_SIZE;
2285 }
2286 /*
2287 * because buffers are aligned on 256-byte boundary,
2288 * the length computed above is off by 256 in almost
2289 * all cases. Fix it...
2290 */
2291 if (len & 0xff)
2292 len -= 256 ;
2293 if (len > (ETHER_MAX_LEN - ETHER_CRC_LEN
2294 + sizeof(struct ed_ring)))
2295 sc->mibdata.dot3StatsFrameTooLongs++;
2296 }
2297 /*
2298 * Be fairly liberal about what we allow as a "reasonable" length
2299 * so that a [crufty] packet will make it to BPF (and can thus
2300 * be analyzed). Note that all that is really important is that
2301 * we have a length that will fit into one mbuf cluster or less;
2302 * the upper layer protocols can then figure out the length from
2303 * their own length field(s).
2304 * But make sure that we have at least a full ethernet header
2305 * or we would be unable to call ether_input() later.
2306 */
2307 if ((len >= sizeof(struct ed_ring) + ETHER_HDR_LEN) &&
2308 (len <= MCLBYTES) &&
2309 (packet_hdr.next_packet >= sc->rec_page_start) &&
2310 (packet_hdr.next_packet < sc->rec_page_stop)) {
2311 /*
2312 * Go get packet.
2313 */
2314 ed_get_packet(sc, packet_ptr + sizeof(struct ed_ring),
2315 len - sizeof(struct ed_ring));
2316 ifp->if_ipackets++;
2317 } else {
2318 /*
2319 * Really BAD. The ring pointers are corrupted.
2320 */
2321 log(LOG_ERR,
2322 "%s: NIC memory corrupt - invalid packet length %d\n",
2323 ifp->if_xname, len);
2324 ifp->if_ierrors++;
2325 ed_reset(ifp);
2326 return;
2327 }
2328
2329 /*
2330 * Update next packet pointer
2331 */
2332 sc->next_packet = packet_hdr.next_packet;
2333
2334 /*
2335 * Update NIC boundry pointer - being careful to keep it one
2336 * buffer behind. (as recommended by NS databook)
2337 */
2338 boundry = sc->next_packet - 1;
2339 if (boundry < sc->rec_page_start)
2340 boundry = sc->rec_page_stop - 1;
2341
2342 /*
2343 * Set NIC to page 0 registers to update boundry register
2344 */
2345 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
2346
2347 ed_nic_outb(sc, ED_P0_BNRY, boundry);
2348
2349 /*
2350 * Set NIC to page 1 registers before looping to top (prepare
2351 * to get 'CURR' current pointer)
2352 */
2353 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STA);
2354 }
2355}
2356
2357/*
2358 * Ethernet interface interrupt processor
2359 */
2360void
2361edintr(void *arg)
2362{
2363 struct ed_softc *sc = (struct ed_softc*) arg;
2364 struct ifnet *ifp = (struct ifnet *)sc;
2365 u_char isr;
2366 int count;
2367
2368 if (sc->gone)
2369 return;
2370 /*
2371 * Set NIC to page 0 registers
2372 */
2373 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
2374
2375 /*
2376 * loop until there are no more new interrupts. When the card
2377 * goes away, the hardware will read back 0xff. Looking at
2378 * the interrupts, it would appear that 0xff is impossible,
2379 * or at least extremely unlikely.
2380 */
2381 while ((isr = ed_nic_inb(sc, ED_P0_ISR)) != 0 && isr != 0xff) {
2382
2383 /*
2384 * reset all the bits that we are 'acknowledging' by writing a
2385 * '1' to each bit position that was set (writing a '1'
2386 * *clears* the bit)
2387 */
2388 ed_nic_outb(sc, ED_P0_ISR, isr);
2389
2390 /*
2391 * XXX workaround for AX88190
2392 * We limit this to 5000 iterations. At 1us per inb/outb,
2393 * this translates to about 15ms, which should be plenty
2394 * of time, and also gives protection in the card eject
2395 * case.
2396 */
2397 if (sc->chip_type == ED_CHIP_TYPE_AX88190) {
2398 count = 5000; /* 15ms */
2399 while (count-- && (ed_nic_inb(sc, ED_P0_ISR) & isr)) {
2400 ed_nic_outb(sc, ED_P0_ISR,0);
2401 ed_nic_outb(sc, ED_P0_ISR,isr);
2402 }
2403 if (count == 0)
2404 break;
2405 }
2406
2407 /*
2408 * Handle transmitter interrupts. Handle these first because
2409 * the receiver will reset the board under some conditions.
2410 */
2411 if (isr & (ED_ISR_PTX | ED_ISR_TXE)) {
2412 u_char collisions = ed_nic_inb(sc, ED_P0_NCR) & 0x0f;
2413
2414 /*
2415 * Check for transmit error. If a TX completed with an
2416 * error, we end up throwing the packet away. Really
2417 * the only error that is possible is excessive
2418 * collisions, and in this case it is best to allow
2419 * the automatic mechanisms of TCP to backoff the
2420 * flow. Of course, with UDP we're screwed, but this
2421 * is expected when a network is heavily loaded.
2422 */
2423 (void) ed_nic_inb(sc, ED_P0_TSR);
2424 if (isr & ED_ISR_TXE) {
2425 u_char tsr;
2426
2427 /*
2428 * Excessive collisions (16)
2429 */
2430 tsr = ed_nic_inb(sc, ED_P0_TSR);
2431 if ((tsr & ED_TSR_ABT)
2432 && (collisions == 0)) {
2433
2434 /*
2435 * When collisions total 16, the
2436 * P0_NCR will indicate 0, and the
2437 * TSR_ABT is set.
2438 */
2439 collisions = 16;
2440 sc->mibdata.dot3StatsExcessiveCollisions++;
2441 sc->mibdata.dot3StatsCollFrequencies[15]++;
2442 }
2443 if (tsr & ED_TSR_OWC)
2444 sc->mibdata.dot3StatsLateCollisions++;
2445 if (tsr & ED_TSR_CDH)
2446 sc->mibdata.dot3StatsSQETestErrors++;
2447 if (tsr & ED_TSR_CRS)
2448 sc->mibdata.dot3StatsCarrierSenseErrors++;
2449 if (tsr & ED_TSR_FU)
2450 sc->mibdata.dot3StatsInternalMacTransmitErrors++;
2451
2452 /*
2453 * update output errors counter
2454 */
2455 ifp->if_oerrors++;
2456 } else {
2457
2458 /*
2459 * Update total number of successfully
2460 * transmitted packets.
2461 */
2462 ifp->if_opackets++;
2463 }
2464
2465 /*
2466 * reset tx busy and output active flags
2467 */
2468 sc->xmit_busy = 0;
2469 ifp->if_flags &= ~IFF_OACTIVE;
2470
2471 /*
2472 * clear watchdog timer
2473 */
2474 ifp->if_timer = 0;
2475
2476 /*
2477 * Add in total number of collisions on last
2478 * transmission.
2479 */
2480 ifp->if_collisions += collisions;
2481 switch(collisions) {
2482 case 0:
2483 case 16:
2484 break;
2485 case 1:
2486 sc->mibdata.dot3StatsSingleCollisionFrames++;
2487 sc->mibdata.dot3StatsCollFrequencies[0]++;
2488 break;
2489 default:
2490 sc->mibdata.dot3StatsMultipleCollisionFrames++;
2491 sc->mibdata.
2492 dot3StatsCollFrequencies[collisions-1]
2493 ++;
2494 break;
2495 }
2496
2497 /*
2498 * Decrement buffer in-use count if not zero (can only
2499 * be zero if a transmitter interrupt occured while
2500 * not actually transmitting). If data is ready to
2501 * transmit, start it transmitting, otherwise defer
2502 * until after handling receiver
2503 */
2504 if (sc->txb_inuse && --sc->txb_inuse)
2505 ed_xmit(sc);
2506 }
2507
2508 /*
2509 * Handle receiver interrupts
2510 */
2511 if (isr & (ED_ISR_PRX | ED_ISR_RXE | ED_ISR_OVW)) {
2512
2513 /*
2514 * Overwrite warning. In order to make sure that a
2515 * lockup of the local DMA hasn't occurred, we reset
2516 * and re-init the NIC. The NSC manual suggests only a
2517 * partial reset/re-init is necessary - but some chips
2518 * seem to want more. The DMA lockup has been seen
2519 * only with early rev chips - Methinks this bug was
2520 * fixed in later revs. -DG
2521 */
2522 if (isr & ED_ISR_OVW) {
2523 ifp->if_ierrors++;
2524#ifdef DIAGNOSTIC
2525 log(LOG_WARNING,
2526 "%s: warning - receiver ring buffer overrun\n",
2527 ifp->if_xname);
2528#endif
2529
2530 /*
2531 * Stop/reset/re-init NIC
2532 */
2533 ed_reset(ifp);
2534 } else {
2535
2536 /*
2537 * Receiver Error. One or more of: CRC error,
2538 * frame alignment error FIFO overrun, or
2539 * missed packet.
2540 */
2541 if (isr & ED_ISR_RXE) {
2542 u_char rsr;
2543 rsr = ed_nic_inb(sc, ED_P0_RSR);
2544 if (rsr & ED_RSR_CRC)
2545 sc->mibdata.dot3StatsFCSErrors++;
2546 if (rsr & ED_RSR_FAE)
2547 sc->mibdata.dot3StatsAlignmentErrors++;
2548 if (rsr & ED_RSR_FO)
2549 sc->mibdata.dot3StatsInternalMacReceiveErrors++;
2550 ifp->if_ierrors++;
2551#ifdef ED_DEBUG
2552 if_printf(ifp, "receive error %x\n",
2553 ed_nic_inb(sc, ED_P0_RSR));
2554#endif
2555 }
2556
2557 /*
2558 * Go get the packet(s) XXX - Doing this on an
2559 * error is dubious because there shouldn't be
2560 * any data to get (we've configured the
2561 * interface to not accept packets with
2562 * errors).
2563 */
2564
2565 /*
2566 * Enable 16bit access to shared memory first
2567 * on WD/SMC boards.
2568 */
2569 if (sc->isa16bit &&
2570 (sc->vendor == ED_VENDOR_WD_SMC)) {
2571
2572 ed_asic_outb(sc, ED_WD_LAAR,
2573 sc->wd_laar_proto | ED_WD_LAAR_M16EN);
2574 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
2575 ed_asic_outb(sc, ED_WD_MSR,
2576 ED_WD_MSR_MENB);
2577 }
2578 }
2579 ed_rint(sc);
2580
2581 /* disable 16bit access */
2582 if (sc->isa16bit &&
2583 (sc->vendor == ED_VENDOR_WD_SMC)) {
2584
2585 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
2586 ed_asic_outb(sc, ED_WD_MSR, 0x00);
2587 }
2588 ed_asic_outb(sc, ED_WD_LAAR,
2589 sc->wd_laar_proto & ~ED_WD_LAAR_M16EN);
2590 }
2591 }
2592 }
2593
2594 /*
2595 * If it looks like the transmitter can take more data,
2596 * attempt to start output on the interface. This is done
2597 * after handling the receiver to give the receiver priority.
2598 */
2599 if ((ifp->if_flags & IFF_OACTIVE) == 0)
2600 ed_start(ifp);
2601
2602 /*
2603 * return NIC CR to standard state: page 0, remote DMA
2604 * complete, start (toggling the TXP bit off, even if was just
2605 * set in the transmit routine, is *okay* - it is 'edge'
2606 * triggered from low to high)
2607 */
2608 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
2609
2610 /*
2611 * If the Network Talley Counters overflow, read them to reset
2612 * them. It appears that old 8390's won't clear the ISR flag
2613 * otherwise - resulting in an infinite loop.
2614 */
2615 if (isr & ED_ISR_CNT) {
2616 (void) ed_nic_inb(sc, ED_P0_CNTR0);
2617 (void) ed_nic_inb(sc, ED_P0_CNTR1);
2618 (void) ed_nic_inb(sc, ED_P0_CNTR2);
2619 }
2620 }
2621}
2622
2623/*
2624 * Process an ioctl request.
2625 */
2626static int
2627ed_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
2628{
2629 struct ed_softc *sc = ifp->if_softc;
2630#ifndef ED_NO_MIIBUS
2631 struct ifreq *ifr = (struct ifreq *)data;
2632 struct mii_data *mii;
2633#endif
2634 int s, error = 0;
2635
2636 if (sc == NULL || sc->gone) {
2637 ifp->if_flags &= ~IFF_RUNNING;
2638 return ENXIO;
2639 }
2640 s = splimp();
2641
2642 switch (command) {
2643 case SIOCSIFFLAGS:
2644
2645 /*
2646 * If the interface is marked up and stopped, then start it.
2647 * If it is marked down and running, then stop it.
2648 */
2649 if (ifp->if_flags & IFF_UP) {
2650 if ((ifp->if_flags & IFF_RUNNING) == 0)
2651 ed_init(sc);
2652 } else {
2653 if (ifp->if_flags & IFF_RUNNING) {
2654 ed_stop(sc);
2655 ifp->if_flags &= ~IFF_RUNNING;
2656 }
2657 }
2658
2659 /*
2660 * Promiscuous flag may have changed, so reprogram the RCR.
2661 */
2662 ed_setrcr(sc);
2663
2664 /*
2665 * An unfortunate hack to provide the (required) software
2666 * control of the tranceiver for 3Com boards. The ALTPHYS flag
2667 * disables the tranceiver if set.
2668 */
2669 if (sc->vendor == ED_VENDOR_3COM) {
2670 if (ifp->if_flags & IFF_ALTPHYS) {
2671 ed_asic_outb(sc, ED_3COM_CR, 0);
2672 } else {
2673 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_XSEL);
2674 }
298 printf("%s ", sc->isa16bit ? "(16 bit)" : "(8 bit)");
299
300 printf("%s\n", (((sc->vendor == ED_VENDOR_3COM) ||
301 (sc->vendor == ED_VENDOR_HP)) &&
302 (ifp->if_flags & IFF_ALTPHYS)) ?
303 " tranceiver disabled" : "");
304 }
305 return (0);
306}
307
308/*
309 * Detach the driver from the hardware and other systems in the kernel.
310 */
311int
312ed_detach(device_t dev)
313{
314 struct ed_softc *sc = device_get_softc(dev);
315 struct ifnet *ifp = &sc->arpcom.ac_if;
316
317 if (sc->gone)
318 return (0);
319 ed_stop(sc);
320 ifp->if_flags &= ~IFF_RUNNING;
321 ether_ifdetach(ifp);
322 sc->gone = 1;
323 bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
324 ed_release_resources(dev);
325 return (0);
326}
327
328/*
329 * Reset interface.
330 */
331static void
332ed_reset(struct ifnet *ifp)
333{
334 struct ed_softc *sc = ifp->if_softc;
335 int s;
336
337 if (sc->gone)
338 return;
339 s = splimp();
340
341 /*
342 * Stop interface and re-initialize.
343 */
344 ed_stop(sc);
345 ed_init(sc);
346
347 (void) splx(s);
348}
349
350/*
351 * Take interface offline.
352 */
353void
354ed_stop(struct ed_softc *sc)
355{
356 int n = 5000;
357
358#ifndef ED_NO_MIIBUS
359 untimeout(ed_tick, sc, sc->tick_ch);
360 callout_handle_init(&sc->tick_ch);
361#endif
362 if (sc->gone)
363 return;
364 /*
365 * Stop everything on the interface, and select page 0 registers.
366 */
367 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
368
369 /*
370 * Wait for interface to enter stopped state, but limit # of checks to
371 * 'n' (about 5ms). It shouldn't even take 5us on modern DS8390's, but
372 * just in case it's an old one.
373 */
374 if (sc->chip_type != ED_CHIP_TYPE_AX88190)
375 while (((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RST) == 0) && --n);
376}
377
378/*
379 * Device timeout/watchdog routine. Entered if the device neglects to
380 * generate an interrupt after a transmit has been started on it.
381 */
382static void
383ed_watchdog(struct ifnet *ifp)
384{
385 struct ed_softc *sc = ifp->if_softc;
386
387 if (sc->gone)
388 return;
389 log(LOG_ERR, "%s: device timeout\n", ifp->if_xname);
390 ifp->if_oerrors++;
391
392 ed_reset(ifp);
393}
394
395#ifndef ED_NO_MIIBUS
396static void
397ed_tick(void *arg)
398{
399 struct ed_softc *sc = arg;
400 struct mii_data *mii;
401 int s;
402
403 if (sc->gone) {
404 callout_handle_init(&sc->tick_ch);
405 return;
406 }
407 s = splimp();
408 if (sc->miibus != NULL) {
409 mii = device_get_softc(sc->miibus);
410 mii_tick(mii);
411 }
412 sc->tick_ch = timeout(ed_tick, sc, hz);
413 splx(s);
414}
415#endif
416
417/*
418 * Initialize device.
419 */
420static void
421ed_init(void *xsc)
422{
423 struct ed_softc *sc = xsc;
424 struct ifnet *ifp = &sc->arpcom.ac_if;
425 int i, s;
426
427 if (sc->gone)
428 return;
429
430 /*
431 * Initialize the NIC in the exact order outlined in the NS manual.
432 * This init procedure is "mandatory"...don't change what or when
433 * things happen.
434 */
435 s = splimp();
436
437 /* reset transmitter flags */
438 sc->xmit_busy = 0;
439 ifp->if_timer = 0;
440
441 sc->txb_inuse = 0;
442 sc->txb_new = 0;
443 sc->txb_next_tx = 0;
444
445 /* This variable is used below - don't move this assignment */
446 sc->next_packet = sc->rec_page_start + 1;
447
448 /*
449 * Set interface for page 0, Remote DMA complete, Stopped
450 */
451 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
452
453 if (sc->isa16bit) {
454
455 /*
456 * Set FIFO threshold to 8, No auto-init Remote DMA, byte
457 * order=80x86, word-wide DMA xfers,
458 */
459 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_WTS | ED_DCR_LS);
460 } else {
461
462 /*
463 * Same as above, but byte-wide DMA xfers
464 */
465 ed_nic_outb(sc, ED_P0_DCR, ED_DCR_FT1 | ED_DCR_LS);
466 }
467
468 /*
469 * Clear Remote Byte Count Registers
470 */
471 ed_nic_outb(sc, ED_P0_RBCR0, 0);
472 ed_nic_outb(sc, ED_P0_RBCR1, 0);
473
474 /*
475 * For the moment, don't store incoming packets in memory.
476 */
477 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_MON);
478
479 /*
480 * Place NIC in internal loopback mode
481 */
482 ed_nic_outb(sc, ED_P0_TCR, ED_TCR_LB0);
483
484 /*
485 * Initialize transmit/receive (ring-buffer) Page Start
486 */
487 ed_nic_outb(sc, ED_P0_TPSR, sc->tx_page_start);
488 ed_nic_outb(sc, ED_P0_PSTART, sc->rec_page_start);
489 /* Set lower bits of byte addressable framing to 0 */
490 if (sc->chip_type == ED_CHIP_TYPE_WD790)
491 ed_nic_outb(sc, 0x09, 0);
492
493 /*
494 * Initialize Receiver (ring-buffer) Page Stop and Boundry
495 */
496 ed_nic_outb(sc, ED_P0_PSTOP, sc->rec_page_stop);
497 ed_nic_outb(sc, ED_P0_BNRY, sc->rec_page_start);
498
499 /*
500 * Clear all interrupts. A '1' in each bit position clears the
501 * corresponding flag.
502 */
503 ed_nic_outb(sc, ED_P0_ISR, 0xff);
504
505 /*
506 * Enable the following interrupts: receive/transmit complete,
507 * receive/transmit error, and Receiver OverWrite.
508 *
509 * Counter overflow and Remote DMA complete are *not* enabled.
510 */
511 ed_nic_outb(sc, ED_P0_IMR,
512 ED_IMR_PRXE | ED_IMR_PTXE | ED_IMR_RXEE | ED_IMR_TXEE | ED_IMR_OVWE);
513
514 /*
515 * Program Command Register for page 1
516 */
517 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STP);
518
519 /*
520 * Copy out our station address
521 */
522 for (i = 0; i < ETHER_ADDR_LEN; ++i)
523 ed_nic_outb(sc, ED_P1_PAR(i), sc->arpcom.ac_enaddr[i]);
524
525 /*
526 * Set Current Page pointer to next_packet (initialized above)
527 */
528 ed_nic_outb(sc, ED_P1_CURR, sc->next_packet);
529
530 /*
531 * Program Receiver Configuration Register and multicast filter. CR is
532 * set to page 0 on return.
533 */
534 ed_setrcr(sc);
535
536 /*
537 * Take interface out of loopback
538 */
539 ed_nic_outb(sc, ED_P0_TCR, 0);
540
541 /*
542 * If this is a 3Com board, the tranceiver must be software enabled
543 * (there is no settable hardware default).
544 */
545 if (sc->vendor == ED_VENDOR_3COM) {
546 if (ifp->if_flags & IFF_ALTPHYS) {
547 ed_asic_outb(sc, ED_3COM_CR, 0);
548 } else {
549 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_XSEL);
550 }
551 }
552
553#ifndef ED_NO_MIIBUS
554 if (sc->miibus != NULL) {
555 struct mii_data *mii;
556 mii = device_get_softc(sc->miibus);
557 mii_mediachg(mii);
558 }
559#endif
560 /*
561 * Set 'running' flag, and clear output active flag.
562 */
563 ifp->if_flags |= IFF_RUNNING;
564 ifp->if_flags &= ~IFF_OACTIVE;
565
566 /*
567 * ...and attempt to start output
568 */
569 ed_start(ifp);
570
571#ifndef ED_NO_MIIBUS
572 untimeout(ed_tick, sc, sc->tick_ch);
573 sc->tick_ch = timeout(ed_tick, sc, hz);
574#endif
575 (void) splx(s);
576}
577
578/*
579 * This routine actually starts the transmission on the interface
580 */
581static __inline void
582ed_xmit(struct ed_softc *sc)
583{
584 struct ifnet *ifp = (struct ifnet *)sc;
585 unsigned short len;
586
587 if (sc->gone)
588 return;
589 len = sc->txb_len[sc->txb_next_tx];
590
591 /*
592 * Set NIC for page 0 register access
593 */
594 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
595
596 /*
597 * Set TX buffer start page
598 */
599 ed_nic_outb(sc, ED_P0_TPSR, sc->tx_page_start +
600 sc->txb_next_tx * ED_TXBUF_SIZE);
601
602 /*
603 * Set TX length
604 */
605 ed_nic_outb(sc, ED_P0_TBCR0, len);
606 ed_nic_outb(sc, ED_P0_TBCR1, len >> 8);
607
608 /*
609 * Set page 0, Remote DMA complete, Transmit Packet, and *Start*
610 */
611 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_TXP | ED_CR_STA);
612 sc->xmit_busy = 1;
613
614 /*
615 * Point to next transmit buffer slot and wrap if necessary.
616 */
617 sc->txb_next_tx++;
618 if (sc->txb_next_tx == sc->txb_cnt)
619 sc->txb_next_tx = 0;
620
621 /*
622 * Set a timer just in case we never hear from the board again
623 */
624 ifp->if_timer = 2;
625}
626
627/*
628 * Start output on interface.
629 * We make two assumptions here:
630 * 1) that the current priority is set to splimp _before_ this code
631 * is called *and* is returned to the appropriate priority after
632 * return
633 * 2) that the IFF_OACTIVE flag is checked before this code is called
634 * (i.e. that the output part of the interface is idle)
635 */
636static void
637ed_start(struct ifnet *ifp)
638{
639 struct ed_softc *sc = ifp->if_softc;
640 struct mbuf *m0, *m;
641 caddr_t buffer;
642 int len;
643
644 if (sc->gone) {
645 printf("ed_start(%p) GONE\n",ifp);
646 return;
647 }
648outloop:
649
650 /*
651 * First, see if there are buffered packets and an idle transmitter -
652 * should never happen at this point.
653 */
654 if (sc->txb_inuse && (sc->xmit_busy == 0)) {
655 printf("ed: packets buffered, but transmitter idle\n");
656 ed_xmit(sc);
657 }
658
659 /*
660 * See if there is room to put another packet in the buffer.
661 */
662 if (sc->txb_inuse == sc->txb_cnt) {
663
664 /*
665 * No room. Indicate this to the outside world and exit.
666 */
667 ifp->if_flags |= IFF_OACTIVE;
668 return;
669 }
670 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
671 if (m == 0) {
672
673 /*
674 * We are using the !OACTIVE flag to indicate to the outside
675 * world that we can accept an additional packet rather than
676 * that the transmitter is _actually_ active. Indeed, the
677 * transmitter may be active, but if we haven't filled all the
678 * buffers with data then we still want to accept more.
679 */
680 ifp->if_flags &= ~IFF_OACTIVE;
681 return;
682 }
683
684 /*
685 * Copy the mbuf chain into the transmit buffer
686 */
687
688 m0 = m;
689
690 /* txb_new points to next open buffer slot */
691 buffer = sc->mem_start + (sc->txb_new * ED_TXBUF_SIZE * ED_PAGE_SIZE);
692
693 if (sc->mem_shared) {
694
695 /*
696 * Special case setup for 16 bit boards...
697 */
698 if (sc->isa16bit) {
699 switch (sc->vendor) {
700
701 /*
702 * For 16bit 3Com boards (which have 16k of
703 * memory), we have the xmit buffers in a
704 * different page of memory ('page 0') - so
705 * change pages.
706 */
707 case ED_VENDOR_3COM:
708 ed_asic_outb(sc, ED_3COM_GACFR,
709 ED_3COM_GACFR_RSEL);
710 break;
711
712 /*
713 * Enable 16bit access to shared memory on
714 * WD/SMC boards.
715 */
716 case ED_VENDOR_WD_SMC:
717 ed_asic_outb(sc, ED_WD_LAAR,
718 sc->wd_laar_proto | ED_WD_LAAR_M16EN);
719 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
720 ed_asic_outb(sc, ED_WD_MSR, ED_WD_MSR_MENB);
721 }
722 break;
723 }
724 }
725 for (len = 0; m != 0; m = m->m_next) {
726 bcopy(mtod(m, caddr_t), buffer, m->m_len);
727 buffer += m->m_len;
728 len += m->m_len;
729 }
730
731 /*
732 * Restore previous shared memory access
733 */
734 if (sc->isa16bit) {
735 switch (sc->vendor) {
736 case ED_VENDOR_3COM:
737 ed_asic_outb(sc, ED_3COM_GACFR,
738 ED_3COM_GACFR_RSEL | ED_3COM_GACFR_MBS0);
739 break;
740 case ED_VENDOR_WD_SMC:
741 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
742 ed_asic_outb(sc, ED_WD_MSR, 0x00);
743 }
744 ed_asic_outb(sc, ED_WD_LAAR,
745 sc->wd_laar_proto & ~ED_WD_LAAR_M16EN);
746 break;
747 }
748 }
749 } else {
750 len = ed_pio_write_mbufs(sc, m, (uintptr_t)buffer);
751 if (len == 0) {
752 m_freem(m0);
753 goto outloop;
754 }
755 }
756
757 sc->txb_len[sc->txb_new] = max(len, (ETHER_MIN_LEN-ETHER_CRC_LEN));
758
759 sc->txb_inuse++;
760
761 /*
762 * Point to next buffer slot and wrap if necessary.
763 */
764 sc->txb_new++;
765 if (sc->txb_new == sc->txb_cnt)
766 sc->txb_new = 0;
767
768 if (sc->xmit_busy == 0)
769 ed_xmit(sc);
770
771 /*
772 * Tap off here if there is a bpf listener.
773 */
774 BPF_MTAP(ifp, m0);
775
776 m_freem(m0);
777
778 /*
779 * Loop back to the top to possibly buffer more packets
780 */
781 goto outloop;
782}
783
784/*
785 * Ethernet interface receiver interrupt.
786 */
787static __inline void
788ed_rint(struct ed_softc *sc)
789{
790 struct ifnet *ifp = &sc->arpcom.ac_if;
791 u_char boundry;
792 u_short len;
793 struct ed_ring packet_hdr;
794 char *packet_ptr;
795
796 if (sc->gone)
797 return;
798
799 /*
800 * Set NIC to page 1 registers to get 'current' pointer
801 */
802 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STA);
803
804 /*
805 * 'sc->next_packet' is the logical beginning of the ring-buffer -
806 * i.e. it points to where new data has been buffered. The 'CURR'
807 * (current) register points to the logical end of the ring-buffer -
808 * i.e. it points to where additional new data will be added. We loop
809 * here until the logical beginning equals the logical end (or in
810 * other words, until the ring-buffer is empty).
811 */
812 while (sc->next_packet != ed_nic_inb(sc, ED_P1_CURR)) {
813
814 /* get pointer to this buffer's header structure */
815 packet_ptr = sc->mem_ring +
816 (sc->next_packet - sc->rec_page_start) * ED_PAGE_SIZE;
817
818 /*
819 * The byte count includes a 4 byte header that was added by
820 * the NIC.
821 */
822 if (sc->mem_shared)
823 packet_hdr = *(struct ed_ring *) packet_ptr;
824 else
825 ed_pio_readmem(sc, (uintptr_t)packet_ptr,
826 (char *) &packet_hdr, sizeof(packet_hdr));
827 len = packet_hdr.count;
828 if (len > (ETHER_MAX_LEN - ETHER_CRC_LEN + sizeof(struct ed_ring)) ||
829 len < (ETHER_MIN_LEN - ETHER_CRC_LEN + sizeof(struct ed_ring))) {
830 /*
831 * Length is a wild value. There's a good chance that
832 * this was caused by the NIC being old and buggy.
833 * The bug is that the length low byte is duplicated in
834 * the high byte. Try to recalculate the length based on
835 * the pointer to the next packet.
836 */
837 /*
838 * NOTE: sc->next_packet is pointing at the current packet.
839 */
840 len &= ED_PAGE_SIZE - 1; /* preserve offset into page */
841 if (packet_hdr.next_packet >= sc->next_packet) {
842 len += (packet_hdr.next_packet - sc->next_packet) * ED_PAGE_SIZE;
843 } else {
844 len += ((packet_hdr.next_packet - sc->rec_page_start) +
845 (sc->rec_page_stop - sc->next_packet)) * ED_PAGE_SIZE;
846 }
847 /*
848 * because buffers are aligned on 256-byte boundary,
849 * the length computed above is off by 256 in almost
850 * all cases. Fix it...
851 */
852 if (len & 0xff)
853 len -= 256 ;
854 if (len > (ETHER_MAX_LEN - ETHER_CRC_LEN
855 + sizeof(struct ed_ring)))
856 sc->mibdata.dot3StatsFrameTooLongs++;
857 }
858 /*
859 * Be fairly liberal about what we allow as a "reasonable" length
860 * so that a [crufty] packet will make it to BPF (and can thus
861 * be analyzed). Note that all that is really important is that
862 * we have a length that will fit into one mbuf cluster or less;
863 * the upper layer protocols can then figure out the length from
864 * their own length field(s).
865 * But make sure that we have at least a full ethernet header
866 * or we would be unable to call ether_input() later.
867 */
868 if ((len >= sizeof(struct ed_ring) + ETHER_HDR_LEN) &&
869 (len <= MCLBYTES) &&
870 (packet_hdr.next_packet >= sc->rec_page_start) &&
871 (packet_hdr.next_packet < sc->rec_page_stop)) {
872 /*
873 * Go get packet.
874 */
875 ed_get_packet(sc, packet_ptr + sizeof(struct ed_ring),
876 len - sizeof(struct ed_ring));
877 ifp->if_ipackets++;
878 } else {
879 /*
880 * Really BAD. The ring pointers are corrupted.
881 */
882 log(LOG_ERR,
883 "%s: NIC memory corrupt - invalid packet length %d\n",
884 ifp->if_xname, len);
885 ifp->if_ierrors++;
886 ed_reset(ifp);
887 return;
888 }
889
890 /*
891 * Update next packet pointer
892 */
893 sc->next_packet = packet_hdr.next_packet;
894
895 /*
896 * Update NIC boundry pointer - being careful to keep it one
897 * buffer behind. (as recommended by NS databook)
898 */
899 boundry = sc->next_packet - 1;
900 if (boundry < sc->rec_page_start)
901 boundry = sc->rec_page_stop - 1;
902
903 /*
904 * Set NIC to page 0 registers to update boundry register
905 */
906 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
907
908 ed_nic_outb(sc, ED_P0_BNRY, boundry);
909
910 /*
911 * Set NIC to page 1 registers before looping to top (prepare
912 * to get 'CURR' current pointer)
913 */
914 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STA);
915 }
916}
917
918/*
919 * Ethernet interface interrupt processor
920 */
921void
922edintr(void *arg)
923{
924 struct ed_softc *sc = (struct ed_softc*) arg;
925 struct ifnet *ifp = (struct ifnet *)sc;
926 u_char isr;
927 int count;
928
929 if (sc->gone)
930 return;
931 /*
932 * Set NIC to page 0 registers
933 */
934 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
935
936 /*
937 * loop until there are no more new interrupts. When the card
938 * goes away, the hardware will read back 0xff. Looking at
939 * the interrupts, it would appear that 0xff is impossible,
940 * or at least extremely unlikely.
941 */
942 while ((isr = ed_nic_inb(sc, ED_P0_ISR)) != 0 && isr != 0xff) {
943
944 /*
945 * reset all the bits that we are 'acknowledging' by writing a
946 * '1' to each bit position that was set (writing a '1'
947 * *clears* the bit)
948 */
949 ed_nic_outb(sc, ED_P0_ISR, isr);
950
951 /*
952 * XXX workaround for AX88190
953 * We limit this to 5000 iterations. At 1us per inb/outb,
954 * this translates to about 15ms, which should be plenty
955 * of time, and also gives protection in the card eject
956 * case.
957 */
958 if (sc->chip_type == ED_CHIP_TYPE_AX88190) {
959 count = 5000; /* 15ms */
960 while (count-- && (ed_nic_inb(sc, ED_P0_ISR) & isr)) {
961 ed_nic_outb(sc, ED_P0_ISR,0);
962 ed_nic_outb(sc, ED_P0_ISR,isr);
963 }
964 if (count == 0)
965 break;
966 }
967
968 /*
969 * Handle transmitter interrupts. Handle these first because
970 * the receiver will reset the board under some conditions.
971 */
972 if (isr & (ED_ISR_PTX | ED_ISR_TXE)) {
973 u_char collisions = ed_nic_inb(sc, ED_P0_NCR) & 0x0f;
974
975 /*
976 * Check for transmit error. If a TX completed with an
977 * error, we end up throwing the packet away. Really
978 * the only error that is possible is excessive
979 * collisions, and in this case it is best to allow
980 * the automatic mechanisms of TCP to backoff the
981 * flow. Of course, with UDP we're screwed, but this
982 * is expected when a network is heavily loaded.
983 */
984 (void) ed_nic_inb(sc, ED_P0_TSR);
985 if (isr & ED_ISR_TXE) {
986 u_char tsr;
987
988 /*
989 * Excessive collisions (16)
990 */
991 tsr = ed_nic_inb(sc, ED_P0_TSR);
992 if ((tsr & ED_TSR_ABT)
993 && (collisions == 0)) {
994
995 /*
996 * When collisions total 16, the
997 * P0_NCR will indicate 0, and the
998 * TSR_ABT is set.
999 */
1000 collisions = 16;
1001 sc->mibdata.dot3StatsExcessiveCollisions++;
1002 sc->mibdata.dot3StatsCollFrequencies[15]++;
1003 }
1004 if (tsr & ED_TSR_OWC)
1005 sc->mibdata.dot3StatsLateCollisions++;
1006 if (tsr & ED_TSR_CDH)
1007 sc->mibdata.dot3StatsSQETestErrors++;
1008 if (tsr & ED_TSR_CRS)
1009 sc->mibdata.dot3StatsCarrierSenseErrors++;
1010 if (tsr & ED_TSR_FU)
1011 sc->mibdata.dot3StatsInternalMacTransmitErrors++;
1012
1013 /*
1014 * update output errors counter
1015 */
1016 ifp->if_oerrors++;
1017 } else {
1018
1019 /*
1020 * Update total number of successfully
1021 * transmitted packets.
1022 */
1023 ifp->if_opackets++;
1024 }
1025
1026 /*
1027 * reset tx busy and output active flags
1028 */
1029 sc->xmit_busy = 0;
1030 ifp->if_flags &= ~IFF_OACTIVE;
1031
1032 /*
1033 * clear watchdog timer
1034 */
1035 ifp->if_timer = 0;
1036
1037 /*
1038 * Add in total number of collisions on last
1039 * transmission.
1040 */
1041 ifp->if_collisions += collisions;
1042 switch(collisions) {
1043 case 0:
1044 case 16:
1045 break;
1046 case 1:
1047 sc->mibdata.dot3StatsSingleCollisionFrames++;
1048 sc->mibdata.dot3StatsCollFrequencies[0]++;
1049 break;
1050 default:
1051 sc->mibdata.dot3StatsMultipleCollisionFrames++;
1052 sc->mibdata.
1053 dot3StatsCollFrequencies[collisions-1]
1054 ++;
1055 break;
1056 }
1057
1058 /*
1059 * Decrement buffer in-use count if not zero (can only
1060 * be zero if a transmitter interrupt occured while
1061 * not actually transmitting). If data is ready to
1062 * transmit, start it transmitting, otherwise defer
1063 * until after handling receiver
1064 */
1065 if (sc->txb_inuse && --sc->txb_inuse)
1066 ed_xmit(sc);
1067 }
1068
1069 /*
1070 * Handle receiver interrupts
1071 */
1072 if (isr & (ED_ISR_PRX | ED_ISR_RXE | ED_ISR_OVW)) {
1073
1074 /*
1075 * Overwrite warning. In order to make sure that a
1076 * lockup of the local DMA hasn't occurred, we reset
1077 * and re-init the NIC. The NSC manual suggests only a
1078 * partial reset/re-init is necessary - but some chips
1079 * seem to want more. The DMA lockup has been seen
1080 * only with early rev chips - Methinks this bug was
1081 * fixed in later revs. -DG
1082 */
1083 if (isr & ED_ISR_OVW) {
1084 ifp->if_ierrors++;
1085#ifdef DIAGNOSTIC
1086 log(LOG_WARNING,
1087 "%s: warning - receiver ring buffer overrun\n",
1088 ifp->if_xname);
1089#endif
1090
1091 /*
1092 * Stop/reset/re-init NIC
1093 */
1094 ed_reset(ifp);
1095 } else {
1096
1097 /*
1098 * Receiver Error. One or more of: CRC error,
1099 * frame alignment error FIFO overrun, or
1100 * missed packet.
1101 */
1102 if (isr & ED_ISR_RXE) {
1103 u_char rsr;
1104 rsr = ed_nic_inb(sc, ED_P0_RSR);
1105 if (rsr & ED_RSR_CRC)
1106 sc->mibdata.dot3StatsFCSErrors++;
1107 if (rsr & ED_RSR_FAE)
1108 sc->mibdata.dot3StatsAlignmentErrors++;
1109 if (rsr & ED_RSR_FO)
1110 sc->mibdata.dot3StatsInternalMacReceiveErrors++;
1111 ifp->if_ierrors++;
1112#ifdef ED_DEBUG
1113 if_printf(ifp, "receive error %x\n",
1114 ed_nic_inb(sc, ED_P0_RSR));
1115#endif
1116 }
1117
1118 /*
1119 * Go get the packet(s) XXX - Doing this on an
1120 * error is dubious because there shouldn't be
1121 * any data to get (we've configured the
1122 * interface to not accept packets with
1123 * errors).
1124 */
1125
1126 /*
1127 * Enable 16bit access to shared memory first
1128 * on WD/SMC boards.
1129 */
1130 if (sc->isa16bit &&
1131 (sc->vendor == ED_VENDOR_WD_SMC)) {
1132
1133 ed_asic_outb(sc, ED_WD_LAAR,
1134 sc->wd_laar_proto | ED_WD_LAAR_M16EN);
1135 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
1136 ed_asic_outb(sc, ED_WD_MSR,
1137 ED_WD_MSR_MENB);
1138 }
1139 }
1140 ed_rint(sc);
1141
1142 /* disable 16bit access */
1143 if (sc->isa16bit &&
1144 (sc->vendor == ED_VENDOR_WD_SMC)) {
1145
1146 if (sc->chip_type == ED_CHIP_TYPE_WD790) {
1147 ed_asic_outb(sc, ED_WD_MSR, 0x00);
1148 }
1149 ed_asic_outb(sc, ED_WD_LAAR,
1150 sc->wd_laar_proto & ~ED_WD_LAAR_M16EN);
1151 }
1152 }
1153 }
1154
1155 /*
1156 * If it looks like the transmitter can take more data,
1157 * attempt to start output on the interface. This is done
1158 * after handling the receiver to give the receiver priority.
1159 */
1160 if ((ifp->if_flags & IFF_OACTIVE) == 0)
1161 ed_start(ifp);
1162
1163 /*
1164 * return NIC CR to standard state: page 0, remote DMA
1165 * complete, start (toggling the TXP bit off, even if was just
1166 * set in the transmit routine, is *okay* - it is 'edge'
1167 * triggered from low to high)
1168 */
1169 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
1170
1171 /*
1172 * If the Network Talley Counters overflow, read them to reset
1173 * them. It appears that old 8390's won't clear the ISR flag
1174 * otherwise - resulting in an infinite loop.
1175 */
1176 if (isr & ED_ISR_CNT) {
1177 (void) ed_nic_inb(sc, ED_P0_CNTR0);
1178 (void) ed_nic_inb(sc, ED_P0_CNTR1);
1179 (void) ed_nic_inb(sc, ED_P0_CNTR2);
1180 }
1181 }
1182}
1183
1184/*
1185 * Process an ioctl request.
1186 */
1187static int
1188ed_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
1189{
1190 struct ed_softc *sc = ifp->if_softc;
1191#ifndef ED_NO_MIIBUS
1192 struct ifreq *ifr = (struct ifreq *)data;
1193 struct mii_data *mii;
1194#endif
1195 int s, error = 0;
1196
1197 if (sc == NULL || sc->gone) {
1198 ifp->if_flags &= ~IFF_RUNNING;
1199 return ENXIO;
1200 }
1201 s = splimp();
1202
1203 switch (command) {
1204 case SIOCSIFFLAGS:
1205
1206 /*
1207 * If the interface is marked up and stopped, then start it.
1208 * If it is marked down and running, then stop it.
1209 */
1210 if (ifp->if_flags & IFF_UP) {
1211 if ((ifp->if_flags & IFF_RUNNING) == 0)
1212 ed_init(sc);
1213 } else {
1214 if (ifp->if_flags & IFF_RUNNING) {
1215 ed_stop(sc);
1216 ifp->if_flags &= ~IFF_RUNNING;
1217 }
1218 }
1219
1220 /*
1221 * Promiscuous flag may have changed, so reprogram the RCR.
1222 */
1223 ed_setrcr(sc);
1224
1225 /*
1226 * An unfortunate hack to provide the (required) software
1227 * control of the tranceiver for 3Com boards. The ALTPHYS flag
1228 * disables the tranceiver if set.
1229 */
1230 if (sc->vendor == ED_VENDOR_3COM) {
1231 if (ifp->if_flags & IFF_ALTPHYS) {
1232 ed_asic_outb(sc, ED_3COM_CR, 0);
1233 } else {
1234 ed_asic_outb(sc, ED_3COM_CR, ED_3COM_CR_XSEL);
1235 }
2675 } else if (sc->vendor == ED_VENDOR_HP)
1236 }
1237#ifdef ED_HPP
1238 else if (sc->vendor == ED_VENDOR_HP)
2676 ed_hpp_set_physical_link(sc);
1239 ed_hpp_set_physical_link(sc);
1240#endif
2677 break;
2678
2679 case SIOCADDMULTI:
2680 case SIOCDELMULTI:
2681 /*
2682 * Multicast list has changed; set the hardware filter
2683 * accordingly.
2684 */
2685 ed_setrcr(sc);
2686 error = 0;
2687 break;
2688
2689#ifndef ED_NO_MIIBUS
2690 case SIOCGIFMEDIA:
2691 case SIOCSIFMEDIA:
2692 if (sc->miibus == NULL) {
2693 error = EINVAL;
2694 break;
2695 }
2696 mii = device_get_softc(sc->miibus);
2697 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
2698 break;
2699#endif
2700
2701 default:
2702 error = ether_ioctl(ifp, command, data);
2703 }
2704 (void) splx(s);
2705 return (error);
2706}
2707
2708/*
2709 * Given a source and destination address, copy 'amount' of a packet from
2710 * the ring buffer into a linear destination buffer. Takes into account
2711 * ring-wrap.
2712 */
2713static __inline char *
2714ed_ring_copy(struct ed_softc *sc, char *src, char *dst, u_short amount)
2715{
2716 u_short tmp_amount;
2717
2718 /* does copy wrap to lower addr in ring buffer? */
2719 if (src + amount > sc->mem_end) {
2720 tmp_amount = sc->mem_end - src;
2721
2722 /* copy amount up to end of NIC memory */
2723 if (sc->mem_shared)
2724 bcopy(src, dst, tmp_amount);
2725 else
2726 ed_pio_readmem(sc, (uintptr_t)src, dst, tmp_amount);
2727
2728 amount -= tmp_amount;
2729 src = sc->mem_ring;
2730 dst += tmp_amount;
2731 }
2732 if (sc->mem_shared)
2733 bcopy(src, dst, amount);
2734 else
2735 ed_pio_readmem(sc, (uintptr_t)src, dst, amount);
2736
2737 return (src + amount);
2738}
2739
2740/*
2741 * Retreive packet from shared memory and send to the next level up via
2742 * ether_input().
2743 */
2744static void
2745ed_get_packet(struct ed_softc *sc, char *buf, u_short len)
2746{
2747 struct ifnet *ifp = &sc->arpcom.ac_if;
2748 struct ether_header *eh;
2749 struct mbuf *m;
2750
2751 /* Allocate a header mbuf */
2752 MGETHDR(m, M_DONTWAIT, MT_DATA);
2753 if (m == NULL)
2754 return;
2755 m->m_pkthdr.rcvif = ifp;
2756 m->m_pkthdr.len = m->m_len = len;
2757
2758 /*
2759 * We always put the received packet in a single buffer -
2760 * either with just an mbuf header or in a cluster attached
2761 * to the header. The +2 is to compensate for the alignment
2762 * fixup below.
2763 */
2764 if ((len + 2) > MHLEN) {
2765 /* Attach an mbuf cluster */
2766 MCLGET(m, M_DONTWAIT);
2767
2768 /* Insist on getting a cluster */
2769 if ((m->m_flags & M_EXT) == 0) {
2770 m_freem(m);
2771 return;
2772 }
2773 }
2774
2775 /*
2776 * The +2 is to longword align the start of the real packet.
2777 * This is important for NFS.
2778 */
2779 m->m_data += 2;
2780 eh = mtod(m, struct ether_header *);
2781
2782 /*
2783 * Get packet, including link layer address, from interface.
2784 */
2785 ed_ring_copy(sc, buf, (char *)eh, len);
2786
2787 m->m_pkthdr.len = m->m_len = len;
2788
2789 (*ifp->if_input)(ifp, m);
2790}
2791
2792/*
2793 * Supporting routines
2794 */
2795
2796/*
2797 * Given a NIC memory source address and a host memory destination
2798 * address, copy 'amount' from NIC to host using Programmed I/O.
2799 * The 'amount' is rounded up to a word - okay as long as mbufs
2800 * are word sized.
2801 * This routine is currently Novell-specific.
2802 */
2803void
2804ed_pio_readmem(struct ed_softc *sc, long src, uint8_t *dst, uint16_t amount)
2805{
1241 break;
1242
1243 case SIOCADDMULTI:
1244 case SIOCDELMULTI:
1245 /*
1246 * Multicast list has changed; set the hardware filter
1247 * accordingly.
1248 */
1249 ed_setrcr(sc);
1250 error = 0;
1251 break;
1252
1253#ifndef ED_NO_MIIBUS
1254 case SIOCGIFMEDIA:
1255 case SIOCSIFMEDIA:
1256 if (sc->miibus == NULL) {
1257 error = EINVAL;
1258 break;
1259 }
1260 mii = device_get_softc(sc->miibus);
1261 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
1262 break;
1263#endif
1264
1265 default:
1266 error = ether_ioctl(ifp, command, data);
1267 }
1268 (void) splx(s);
1269 return (error);
1270}
1271
1272/*
1273 * Given a source and destination address, copy 'amount' of a packet from
1274 * the ring buffer into a linear destination buffer. Takes into account
1275 * ring-wrap.
1276 */
1277static __inline char *
1278ed_ring_copy(struct ed_softc *sc, char *src, char *dst, u_short amount)
1279{
1280 u_short tmp_amount;
1281
1282 /* does copy wrap to lower addr in ring buffer? */
1283 if (src + amount > sc->mem_end) {
1284 tmp_amount = sc->mem_end - src;
1285
1286 /* copy amount up to end of NIC memory */
1287 if (sc->mem_shared)
1288 bcopy(src, dst, tmp_amount);
1289 else
1290 ed_pio_readmem(sc, (uintptr_t)src, dst, tmp_amount);
1291
1292 amount -= tmp_amount;
1293 src = sc->mem_ring;
1294 dst += tmp_amount;
1295 }
1296 if (sc->mem_shared)
1297 bcopy(src, dst, amount);
1298 else
1299 ed_pio_readmem(sc, (uintptr_t)src, dst, amount);
1300
1301 return (src + amount);
1302}
1303
1304/*
1305 * Retreive packet from shared memory and send to the next level up via
1306 * ether_input().
1307 */
1308static void
1309ed_get_packet(struct ed_softc *sc, char *buf, u_short len)
1310{
1311 struct ifnet *ifp = &sc->arpcom.ac_if;
1312 struct ether_header *eh;
1313 struct mbuf *m;
1314
1315 /* Allocate a header mbuf */
1316 MGETHDR(m, M_DONTWAIT, MT_DATA);
1317 if (m == NULL)
1318 return;
1319 m->m_pkthdr.rcvif = ifp;
1320 m->m_pkthdr.len = m->m_len = len;
1321
1322 /*
1323 * We always put the received packet in a single buffer -
1324 * either with just an mbuf header or in a cluster attached
1325 * to the header. The +2 is to compensate for the alignment
1326 * fixup below.
1327 */
1328 if ((len + 2) > MHLEN) {
1329 /* Attach an mbuf cluster */
1330 MCLGET(m, M_DONTWAIT);
1331
1332 /* Insist on getting a cluster */
1333 if ((m->m_flags & M_EXT) == 0) {
1334 m_freem(m);
1335 return;
1336 }
1337 }
1338
1339 /*
1340 * The +2 is to longword align the start of the real packet.
1341 * This is important for NFS.
1342 */
1343 m->m_data += 2;
1344 eh = mtod(m, struct ether_header *);
1345
1346 /*
1347 * Get packet, including link layer address, from interface.
1348 */
1349 ed_ring_copy(sc, buf, (char *)eh, len);
1350
1351 m->m_pkthdr.len = m->m_len = len;
1352
1353 (*ifp->if_input)(ifp, m);
1354}
1355
1356/*
1357 * Supporting routines
1358 */
1359
1360/*
1361 * Given a NIC memory source address and a host memory destination
1362 * address, copy 'amount' from NIC to host using Programmed I/O.
1363 * The 'amount' is rounded up to a word - okay as long as mbufs
1364 * are word sized.
1365 * This routine is currently Novell-specific.
1366 */
1367void
1368ed_pio_readmem(struct ed_softc *sc, long src, uint8_t *dst, uint16_t amount)
1369{
1370#ifdef ED_HPP
2806 /* HP PC Lan+ cards need special handling */
2807 if (sc->vendor == ED_VENDOR_HP && sc->type == ED_TYPE_HP_PCLANPLUS) {
2808 ed_hpp_readmem(sc, src, dst, amount);
2809 return;
2810 }
1371 /* HP PC Lan+ cards need special handling */
1372 if (sc->vendor == ED_VENDOR_HP && sc->type == ED_TYPE_HP_PCLANPLUS) {
1373 ed_hpp_readmem(sc, src, dst, amount);
1374 return;
1375 }
1376#endif
2811
2812 /* Regular Novell cards */
2813 /* select page 0 registers */
2814 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STA);
2815
2816 /* round up to a word */
2817 if (amount & 1)
2818 ++amount;
2819
2820 /* set up DMA byte count */
2821 ed_nic_outb(sc, ED_P0_RBCR0, amount);
2822 ed_nic_outb(sc, ED_P0_RBCR1, amount >> 8);
2823
2824 /* set up source address in NIC mem */
2825 ed_nic_outb(sc, ED_P0_RSAR0, src);
2826 ed_nic_outb(sc, ED_P0_RSAR1, src >> 8);
2827
2828 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD0 | ED_CR_STA);
2829
2830 if (sc->isa16bit) {
2831 ed_asic_insw(sc, ED_NOVELL_DATA, dst, amount / 2);
2832 } else {
2833 ed_asic_insb(sc, ED_NOVELL_DATA, dst, amount);
2834 }
2835}
2836
2837/*
2838 * Stripped down routine for writing a linear buffer to NIC memory.
2839 * Only used in the probe routine to test the memory. 'len' must
2840 * be even.
2841 */
2842void
2843ed_pio_writemem(struct ed_softc *sc, uint8_t *src, uint16_t dst, uint16_t len)
2844{
2845 int maxwait = 200; /* about 240us */
2846
2847 /* select page 0 registers */
2848 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STA);
2849
2850 /* reset remote DMA complete flag */
2851 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RDC);
2852
2853 /* set up DMA byte count */
2854 ed_nic_outb(sc, ED_P0_RBCR0, len);
2855 ed_nic_outb(sc, ED_P0_RBCR1, len >> 8);
2856
2857 /* set up destination address in NIC mem */
2858 ed_nic_outb(sc, ED_P0_RSAR0, dst);
2859 ed_nic_outb(sc, ED_P0_RSAR1, dst >> 8);
2860
2861 /* set remote DMA write */
2862 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD1 | ED_CR_STA);
2863
2864 if (sc->isa16bit) {
2865 ed_asic_outsw(sc, ED_NOVELL_DATA, src, len / 2);
2866 } else {
2867 ed_asic_outsb(sc, ED_NOVELL_DATA, src, len);
2868 }
2869
2870 /*
2871 * Wait for remote DMA complete. This is necessary because on the
2872 * transmit side, data is handled internally by the NIC in bursts and
2873 * we can't start another remote DMA until this one completes. Not
2874 * waiting causes really bad things to happen - like the NIC
2875 * irrecoverably jamming the ISA bus.
2876 */
2877 while (((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RDC) != ED_ISR_RDC) && --maxwait);
2878}
2879
2880/*
2881 * Write an mbuf chain to the destination NIC memory address using
2882 * programmed I/O.
2883 */
2884static u_short
2885ed_pio_write_mbufs(struct ed_softc *sc, struct mbuf *m, long dst)
2886{
2887 struct ifnet *ifp = (struct ifnet *)sc;
2888 unsigned short total_len, dma_len;
2889 struct mbuf *mp;
2890 int maxwait = 200; /* about 240us */
2891
1377
1378 /* Regular Novell cards */
1379 /* select page 0 registers */
1380 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STA);
1381
1382 /* round up to a word */
1383 if (amount & 1)
1384 ++amount;
1385
1386 /* set up DMA byte count */
1387 ed_nic_outb(sc, ED_P0_RBCR0, amount);
1388 ed_nic_outb(sc, ED_P0_RBCR1, amount >> 8);
1389
1390 /* set up source address in NIC mem */
1391 ed_nic_outb(sc, ED_P0_RSAR0, src);
1392 ed_nic_outb(sc, ED_P0_RSAR1, src >> 8);
1393
1394 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD0 | ED_CR_STA);
1395
1396 if (sc->isa16bit) {
1397 ed_asic_insw(sc, ED_NOVELL_DATA, dst, amount / 2);
1398 } else {
1399 ed_asic_insb(sc, ED_NOVELL_DATA, dst, amount);
1400 }
1401}
1402
1403/*
1404 * Stripped down routine for writing a linear buffer to NIC memory.
1405 * Only used in the probe routine to test the memory. 'len' must
1406 * be even.
1407 */
1408void
1409ed_pio_writemem(struct ed_softc *sc, uint8_t *src, uint16_t dst, uint16_t len)
1410{
1411 int maxwait = 200; /* about 240us */
1412
1413 /* select page 0 registers */
1414 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STA);
1415
1416 /* reset remote DMA complete flag */
1417 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RDC);
1418
1419 /* set up DMA byte count */
1420 ed_nic_outb(sc, ED_P0_RBCR0, len);
1421 ed_nic_outb(sc, ED_P0_RBCR1, len >> 8);
1422
1423 /* set up destination address in NIC mem */
1424 ed_nic_outb(sc, ED_P0_RSAR0, dst);
1425 ed_nic_outb(sc, ED_P0_RSAR1, dst >> 8);
1426
1427 /* set remote DMA write */
1428 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD1 | ED_CR_STA);
1429
1430 if (sc->isa16bit) {
1431 ed_asic_outsw(sc, ED_NOVELL_DATA, src, len / 2);
1432 } else {
1433 ed_asic_outsb(sc, ED_NOVELL_DATA, src, len);
1434 }
1435
1436 /*
1437 * Wait for remote DMA complete. This is necessary because on the
1438 * transmit side, data is handled internally by the NIC in bursts and
1439 * we can't start another remote DMA until this one completes. Not
1440 * waiting causes really bad things to happen - like the NIC
1441 * irrecoverably jamming the ISA bus.
1442 */
1443 while (((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RDC) != ED_ISR_RDC) && --maxwait);
1444}
1445
1446/*
1447 * Write an mbuf chain to the destination NIC memory address using
1448 * programmed I/O.
1449 */
1450static u_short
1451ed_pio_write_mbufs(struct ed_softc *sc, struct mbuf *m, long dst)
1452{
1453 struct ifnet *ifp = (struct ifnet *)sc;
1454 unsigned short total_len, dma_len;
1455 struct mbuf *mp;
1456 int maxwait = 200; /* about 240us */
1457
1458#ifdef ED_HPP
2892 /* HP PC Lan+ cards need special handling */
1459 /* HP PC Lan+ cards need special handling */
2893 if (sc->vendor == ED_VENDOR_HP && sc->type == ED_TYPE_HP_PCLANPLUS) {
1460 if (sc->vendor == ED_VENDOR_HP && sc->type == ED_TYPE_HP_PCLANPLUS)
2894 return ed_hpp_write_mbufs(sc, m, dst);
1461 return ed_hpp_write_mbufs(sc, m, dst);
2895 }
1462#endif
2896
2897 /* Regular Novell cards */
2898 /* First, count up the total number of bytes to copy */
2899 for (total_len = 0, mp = m; mp; mp = mp->m_next)
2900 total_len += mp->m_len;
2901
2902 dma_len = total_len;
2903 if (sc->isa16bit && (dma_len & 1))
2904 dma_len++;
2905
2906 /* select page 0 registers */
2907 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STA);
2908
2909 /* reset remote DMA complete flag */
2910 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RDC);
2911
2912 /* set up DMA byte count */
2913 ed_nic_outb(sc, ED_P0_RBCR0, dma_len);
2914 ed_nic_outb(sc, ED_P0_RBCR1, dma_len >> 8);
2915
2916 /* set up destination address in NIC mem */
2917 ed_nic_outb(sc, ED_P0_RSAR0, dst);
2918 ed_nic_outb(sc, ED_P0_RSAR1, dst >> 8);
2919
2920 /* set remote DMA write */
2921 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD1 | ED_CR_STA);
2922
2923 /*
2924 * Transfer the mbuf chain to the NIC memory.
2925 * 16-bit cards require that data be transferred as words, and only words.
2926 * So that case requires some extra code to patch over odd-length mbufs.
2927 */
2928
2929 if (!sc->isa16bit) {
2930 /* NE1000s are easy */
2931 while (m) {
2932 if (m->m_len) {
2933 ed_asic_outsb(sc, ED_NOVELL_DATA,
2934 m->m_data, m->m_len);
2935 }
2936 m = m->m_next;
2937 }
2938 } else {
2939 /* NE2000s are a pain */
2940 unsigned char *data;
2941 int len, wantbyte;
2942 unsigned char savebyte[2];
2943
2944 wantbyte = 0;
2945
2946 while (m) {
2947 len = m->m_len;
2948 if (len) {
2949 data = mtod(m, caddr_t);
2950 /* finish the last word */
2951 if (wantbyte) {
2952 savebyte[1] = *data;
2953 ed_asic_outw(sc, ED_NOVELL_DATA,
2954 *(u_short *)savebyte);
2955 data++;
2956 len--;
2957 wantbyte = 0;
2958 }
2959 /* output contiguous words */
2960 if (len > 1) {
2961 ed_asic_outsw(sc, ED_NOVELL_DATA,
2962 data, len >> 1);
2963 data += len & ~1;
2964 len &= 1;
2965 }
2966 /* save last byte, if necessary */
2967 if (len == 1) {
2968 savebyte[0] = *data;
2969 wantbyte = 1;
2970 }
2971 }
2972 m = m->m_next;
2973 }
2974 /* spit last byte */
2975 if (wantbyte) {
2976 ed_asic_outw(sc, ED_NOVELL_DATA, *(u_short *)savebyte);
2977 }
2978 }
2979
2980 /*
2981 * Wait for remote DMA complete. This is necessary because on the
2982 * transmit side, data is handled internally by the NIC in bursts and
2983 * we can't start another remote DMA until this one completes. Not
2984 * waiting causes really bad things to happen - like the NIC
2985 * irrecoverably jamming the ISA bus.
2986 */
2987 while (((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RDC) != ED_ISR_RDC) && --maxwait);
2988
2989 if (!maxwait) {
2990 log(LOG_WARNING, "%s: remote transmit DMA failed to complete\n",
2991 ifp->if_xname);
2992 ed_reset(ifp);
2993 return(0);
2994 }
2995 return (total_len);
2996}
2997
1463
1464 /* Regular Novell cards */
1465 /* First, count up the total number of bytes to copy */
1466 for (total_len = 0, mp = m; mp; mp = mp->m_next)
1467 total_len += mp->m_len;
1468
1469 dma_len = total_len;
1470 if (sc->isa16bit && (dma_len & 1))
1471 dma_len++;
1472
1473 /* select page 0 registers */
1474 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD2 | ED_CR_STA);
1475
1476 /* reset remote DMA complete flag */
1477 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RDC);
1478
1479 /* set up DMA byte count */
1480 ed_nic_outb(sc, ED_P0_RBCR0, dma_len);
1481 ed_nic_outb(sc, ED_P0_RBCR1, dma_len >> 8);
1482
1483 /* set up destination address in NIC mem */
1484 ed_nic_outb(sc, ED_P0_RSAR0, dst);
1485 ed_nic_outb(sc, ED_P0_RSAR1, dst >> 8);
1486
1487 /* set remote DMA write */
1488 ed_nic_outb(sc, ED_P0_CR, ED_CR_RD1 | ED_CR_STA);
1489
1490 /*
1491 * Transfer the mbuf chain to the NIC memory.
1492 * 16-bit cards require that data be transferred as words, and only words.
1493 * So that case requires some extra code to patch over odd-length mbufs.
1494 */
1495
1496 if (!sc->isa16bit) {
1497 /* NE1000s are easy */
1498 while (m) {
1499 if (m->m_len) {
1500 ed_asic_outsb(sc, ED_NOVELL_DATA,
1501 m->m_data, m->m_len);
1502 }
1503 m = m->m_next;
1504 }
1505 } else {
1506 /* NE2000s are a pain */
1507 unsigned char *data;
1508 int len, wantbyte;
1509 unsigned char savebyte[2];
1510
1511 wantbyte = 0;
1512
1513 while (m) {
1514 len = m->m_len;
1515 if (len) {
1516 data = mtod(m, caddr_t);
1517 /* finish the last word */
1518 if (wantbyte) {
1519 savebyte[1] = *data;
1520 ed_asic_outw(sc, ED_NOVELL_DATA,
1521 *(u_short *)savebyte);
1522 data++;
1523 len--;
1524 wantbyte = 0;
1525 }
1526 /* output contiguous words */
1527 if (len > 1) {
1528 ed_asic_outsw(sc, ED_NOVELL_DATA,
1529 data, len >> 1);
1530 data += len & ~1;
1531 len &= 1;
1532 }
1533 /* save last byte, if necessary */
1534 if (len == 1) {
1535 savebyte[0] = *data;
1536 wantbyte = 1;
1537 }
1538 }
1539 m = m->m_next;
1540 }
1541 /* spit last byte */
1542 if (wantbyte) {
1543 ed_asic_outw(sc, ED_NOVELL_DATA, *(u_short *)savebyte);
1544 }
1545 }
1546
1547 /*
1548 * Wait for remote DMA complete. This is necessary because on the
1549 * transmit side, data is handled internally by the NIC in bursts and
1550 * we can't start another remote DMA until this one completes. Not
1551 * waiting causes really bad things to happen - like the NIC
1552 * irrecoverably jamming the ISA bus.
1553 */
1554 while (((ed_nic_inb(sc, ED_P0_ISR) & ED_ISR_RDC) != ED_ISR_RDC) && --maxwait);
1555
1556 if (!maxwait) {
1557 log(LOG_WARNING, "%s: remote transmit DMA failed to complete\n",
1558 ifp->if_xname);
1559 ed_reset(ifp);
1560 return(0);
1561 }
1562 return (total_len);
1563}
1564
2998/*
2999 * Support routines to handle the HP PC Lan+ card.
3000 */
3001
3002/*
3003 * HP PC Lan+: Read from NIC memory, using either PIO or memory mapped
3004 * IO.
3005 */
3006
3007static void
3008ed_hpp_readmem(struct ed_softc *sc, long src, uint8_t *dst, uint16_t amount)
3009{
3010
3011 int use_32bit_access = !(sc->hpp_id & ED_HPP_ID_16_BIT_ACCESS);
3012
3013
3014 /* Program the source address in RAM */
3015 ed_asic_outw(sc, ED_HPP_PAGE_2, src);
3016
3017 /*
3018 * The HP PC Lan+ card supports word reads as well as
3019 * a memory mapped i/o port that is aliased to every
3020 * even address on the board.
3021 */
3022
3023 if (sc->hpp_mem_start) {
3024
3025 /* Enable memory mapped access. */
3026 ed_asic_outw(sc, ED_HPP_OPTION, sc->hpp_options &
3027 ~(ED_HPP_OPTION_MEM_DISABLE |
3028 ED_HPP_OPTION_BOOT_ROM_ENB));
3029
3030 if (use_32bit_access && (amount > 3)) {
3031 uint32_t *dl = (uint32_t *) dst;
3032 volatile uint32_t *const sl =
3033 (uint32_t *) sc->hpp_mem_start;
3034 uint32_t *const fence = dl + (amount >> 2);
3035
3036 /* Copy out NIC data. We could probably write this
3037 as a `movsl'. The currently generated code is lousy.
3038 */
3039
3040 while (dl < fence)
3041 *dl++ = *sl;
3042
3043 dst += (amount & ~3);
3044 amount &= 3;
3045
3046 }
3047
3048 /* Finish off any words left, as a series of short reads */
3049 if (amount > 1) {
3050 u_short *d = (u_short *) dst;
3051 volatile u_short *const s =
3052 (u_short *) sc->hpp_mem_start;
3053 u_short *const fence = d + (amount >> 1);
3054
3055 /* Copy out NIC data. */
3056
3057 while (d < fence)
3058 *d++ = *s;
3059
3060 dst += (amount & ~1);
3061 amount &= 1;
3062 }
3063
3064 /*
3065 * read in a byte; however we need to always read 16 bits
3066 * at a time or the hardware gets into a funny state
3067 */
3068
3069 if (amount == 1) {
3070 /* need to read in a short and copy LSB */
3071 volatile u_short *const s =
3072 (volatile u_short *) sc->hpp_mem_start;
3073
3074 *dst = (*s) & 0xFF;
3075 }
3076
3077 /* Restore Boot ROM access. */
3078
3079 ed_asic_outw(sc, ED_HPP_OPTION, sc->hpp_options);
3080
3081
3082 } else {
3083 /* Read in data using the I/O port */
3084 if (use_32bit_access && (amount > 3)) {
3085 ed_asic_insl(sc, ED_HPP_PAGE_4, dst, amount >> 2);
3086 dst += (amount & ~3);
3087 amount &= 3;
3088 }
3089 if (amount > 1) {
3090 ed_asic_insw(sc, ED_HPP_PAGE_4, dst, amount >> 1);
3091 dst += (amount & ~1);
3092 amount &= 1;
3093 }
3094 if (amount == 1) { /* read in a short and keep the LSB */
3095 *dst = ed_asic_inw(sc, ED_HPP_PAGE_4) & 0xFF;
3096 }
3097 }
3098}
3099
3100/*
3101 * HP PC Lan+: Write to NIC memory, using either PIO or memory mapped
3102 * IO.
3103 * Only used in the probe routine to test the memory. 'len' must
3104 * be even.
3105 */
3106static void
3107ed_hpp_writemem(struct ed_softc *sc, uint8_t *src, uint16_t dst, uint16_t len)
3108{
3109 /* reset remote DMA complete flag */
3110 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RDC);
3111
3112 /* program the write address in RAM */
3113 ed_asic_outw(sc, ED_HPP_PAGE_0, dst);
3114
3115 if (sc->hpp_mem_start) {
3116 u_short *s = (u_short *) src;
3117 volatile u_short *d = (u_short *) sc->hpp_mem_start;
3118 u_short *const fence = s + (len >> 1);
3119
3120 /*
3121 * Enable memory mapped access.
3122 */
3123
3124 ed_asic_outw(sc, ED_HPP_OPTION, sc->hpp_options &
3125 ~(ED_HPP_OPTION_MEM_DISABLE |
3126 ED_HPP_OPTION_BOOT_ROM_ENB));
3127
3128 /*
3129 * Copy to NIC memory.
3130 */
3131
3132 while (s < fence)
3133 *d = *s++;
3134
3135 /*
3136 * Restore Boot ROM access.
3137 */
3138
3139 ed_asic_outw(sc, ED_HPP_OPTION, sc->hpp_options);
3140
3141 } else {
3142 /* write data using I/O writes */
3143 ed_asic_outsw(sc, ED_HPP_PAGE_4, src, len / 2);
3144 }
3145}
3146
3147/*
3148 * Write to HP PC Lan+ NIC memory. Access to the NIC can be by using
3149 * outsw() or via the memory mapped interface to the same register.
3150 * Writes have to be in word units; byte accesses won't work and may cause
3151 * the NIC to behave weirdly. Long word accesses are permitted if the ASIC
3152 * allows it.
3153 */
3154
3155static u_short
3156ed_hpp_write_mbufs(struct ed_softc *sc, struct mbuf *m, int dst)
3157{
3158 int len, wantbyte;
3159 unsigned short total_len;
3160 unsigned char savebyte[2];
3161 volatile u_short * const d =
3162 (volatile u_short *) sc->hpp_mem_start;
3163 int use_32bit_accesses = !(sc->hpp_id & ED_HPP_ID_16_BIT_ACCESS);
3164
3165 /* select page 0 registers */
3166 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
3167
3168 /* reset remote DMA complete flag */
3169 ed_nic_outb(sc, ED_P0_ISR, ED_ISR_RDC);
3170
3171 /* program the write address in RAM */
3172 ed_asic_outw(sc, ED_HPP_PAGE_0, dst);
3173
3174 if (sc->hpp_mem_start) /* enable memory mapped I/O */
3175 ed_asic_outw(sc, ED_HPP_OPTION, sc->hpp_options &
3176 ~(ED_HPP_OPTION_MEM_DISABLE |
3177 ED_HPP_OPTION_BOOT_ROM_ENB));
3178
3179 wantbyte = 0;
3180 total_len = 0;
3181
3182 if (sc->hpp_mem_start) { /* Memory mapped I/O port */
3183 while (m) {
3184 total_len += (len = m->m_len);
3185 if (len) {
3186 caddr_t data = mtod(m, caddr_t);
3187 /* finish the last word of the previous mbuf */
3188 if (wantbyte) {
3189 savebyte[1] = *data;
3190 *d = *((u_short *) savebyte);
3191 data++; len--; wantbyte = 0;
3192 }
3193 /* output contiguous words */
3194 if ((len > 3) && (use_32bit_accesses)) {
3195 volatile uint32_t *const dl =
3196 (volatile uint32_t *) d;
3197 uint32_t *sl = (uint32_t *) data;
3198 uint32_t *fence = sl + (len >> 2);
3199
3200 while (sl < fence)
3201 *dl = *sl++;
3202
3203 data += (len & ~3);
3204 len &= 3;
3205 }
3206 /* finish off remain 16 bit writes */
3207 if (len > 1) {
3208 u_short *s = (u_short *) data;
3209 u_short *fence = s + (len >> 1);
3210
3211 while (s < fence)
3212 *d = *s++;
3213
3214 data += (len & ~1);
3215 len &= 1;
3216 }
3217 /* save last byte if needed */
3218 if ((wantbyte = (len == 1)) != 0)
3219 savebyte[0] = *data;
3220 }
3221 m = m->m_next; /* to next mbuf */
3222 }
3223 if (wantbyte) /* write last byte */
3224 *d = *((u_short *) savebyte);
3225 } else {
3226 /* use programmed I/O */
3227 while (m) {
3228 total_len += (len = m->m_len);
3229 if (len) {
3230 caddr_t data = mtod(m, caddr_t);
3231 /* finish the last word of the previous mbuf */
3232 if (wantbyte) {
3233 savebyte[1] = *data;
3234 ed_asic_outw(sc, ED_HPP_PAGE_4,
3235 *((u_short *)savebyte));
3236 data++;
3237 len--;
3238 wantbyte = 0;
3239 }
3240 /* output contiguous words */
3241 if ((len > 3) && use_32bit_accesses) {
3242 ed_asic_outsl(sc, ED_HPP_PAGE_4,
3243 data, len >> 2);
3244 data += (len & ~3);
3245 len &= 3;
3246 }
3247 /* finish off remaining 16 bit accesses */
3248 if (len > 1) {
3249 ed_asic_outsw(sc, ED_HPP_PAGE_4,
3250 data, len >> 1);
3251 data += (len & ~1);
3252 len &= 1;
3253 }
3254 if ((wantbyte = (len == 1)) != 0)
3255 savebyte[0] = *data;
3256
3257 } /* if len != 0 */
3258 m = m->m_next;
3259 }
3260 if (wantbyte) /* spit last byte */
3261 ed_asic_outw(sc, ED_HPP_PAGE_4, *(u_short *)savebyte);
3262
3263 }
3264
3265 if (sc->hpp_mem_start) /* turn off memory mapped i/o */
3266 ed_asic_outw(sc, ED_HPP_OPTION, sc->hpp_options);
3267
3268 return (total_len);
3269}
3270
3271#ifndef ED_NO_MIIBUS
3272/*
3273 * MII bus support routines.
3274 */
3275int
3276ed_miibus_readreg(device_t dev, int phy, int reg)
3277{
3278 struct ed_softc *sc;
3279 int failed, s, val;
3280
3281 s = splimp();
3282 sc = device_get_softc(dev);
3283 if (sc->gone) {
3284 splx(s);
3285 return (0);
3286 }
3287
3288 (*sc->mii_writebits)(sc, 0xffffffff, 32);
3289 (*sc->mii_writebits)(sc, ED_MII_STARTDELIM, ED_MII_STARTDELIM_BITS);
3290 (*sc->mii_writebits)(sc, ED_MII_READOP, ED_MII_OP_BITS);
3291 (*sc->mii_writebits)(sc, phy, ED_MII_PHY_BITS);
3292 (*sc->mii_writebits)(sc, reg, ED_MII_REG_BITS);
3293
3294 failed = (*sc->mii_readbits)(sc, ED_MII_ACK_BITS);
3295 val = (*sc->mii_readbits)(sc, ED_MII_DATA_BITS);
3296 (*sc->mii_writebits)(sc, ED_MII_IDLE, ED_MII_IDLE_BITS);
3297
3298 splx(s);
3299 return (failed ? 0 : val);
3300}
3301
3302void
3303ed_miibus_writereg(device_t dev, int phy, int reg, int data)
3304{
3305 struct ed_softc *sc;
3306 int s;
3307
3308 s = splimp();
3309 sc = device_get_softc(dev);
3310 if (sc->gone) {
3311 splx(s);
3312 return;
3313 }
3314
3315 (*sc->mii_writebits)(sc, 0xffffffff, 32);
3316 (*sc->mii_writebits)(sc, ED_MII_STARTDELIM, ED_MII_STARTDELIM_BITS);
3317 (*sc->mii_writebits)(sc, ED_MII_WRITEOP, ED_MII_OP_BITS);
3318 (*sc->mii_writebits)(sc, phy, ED_MII_PHY_BITS);
3319 (*sc->mii_writebits)(sc, reg, ED_MII_REG_BITS);
3320 (*sc->mii_writebits)(sc, ED_MII_TURNAROUND, ED_MII_TURNAROUND_BITS);
3321 (*sc->mii_writebits)(sc, data, ED_MII_DATA_BITS);
3322 (*sc->mii_writebits)(sc, ED_MII_IDLE, ED_MII_IDLE_BITS);
3323
3324 splx(s);
3325}
3326
3327int
3328ed_ifmedia_upd(struct ifnet *ifp)
3329{
3330 struct ed_softc *sc;
3331 struct mii_data *mii;
3332
3333 sc = ifp->if_softc;
3334 if (sc->gone || sc->miibus == NULL)
3335 return (ENXIO);
3336
3337 mii = device_get_softc(sc->miibus);
3338 return mii_mediachg(mii);
3339}
3340
3341void
3342ed_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
3343{
3344 struct ed_softc *sc;
3345 struct mii_data *mii;
3346
3347 sc = ifp->if_softc;
3348 if (sc->gone || sc->miibus == NULL)
3349 return;
3350
3351 mii = device_get_softc(sc->miibus);
3352 mii_pollstat(mii);
3353 ifmr->ifm_active = mii->mii_media_active;
3354 ifmr->ifm_status = mii->mii_media_status;
3355}
3356
3357void
3358ed_child_detached(device_t dev, device_t child)
3359{
3360 struct ed_softc *sc;
3361
3362 sc = device_get_softc(dev);
3363 if (child == sc->miibus)
3364 sc->miibus = NULL;
3365}
3366#endif
3367
3368static void
3369ed_setrcr(struct ed_softc *sc)
3370{
3371 struct ifnet *ifp = (struct ifnet *)sc;
3372 int i;
3373 u_char reg1;
3374
3375 /* Bit 6 in AX88190 RCR register must be set. */
3376 if (sc->chip_type == ED_CHIP_TYPE_AX88190)
3377 reg1 = ED_RCR_INTT;
3378 else
3379 reg1 = 0x00;
3380
3381 /* set page 1 registers */
3382 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STP);
3383
3384 if (ifp->if_flags & IFF_PROMISC) {
3385
3386 /*
3387 * Reconfigure the multicast filter.
3388 */
3389 for (i = 0; i < 8; i++)
3390 ed_nic_outb(sc, ED_P1_MAR(i), 0xff);
3391
3392 /*
3393 * And turn on promiscuous mode. Also enable reception of
3394 * runts and packets with CRC & alignment errors.
3395 */
3396 /* Set page 0 registers */
3397 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
3398
3399 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_PRO | ED_RCR_AM |
3400 ED_RCR_AB | ED_RCR_AR | ED_RCR_SEP | reg1);
3401 } else {
3402 /* set up multicast addresses and filter modes */
3403 if (ifp->if_flags & IFF_MULTICAST) {
3404 uint32_t mcaf[2];
3405
3406 if (ifp->if_flags & IFF_ALLMULTI) {
3407 mcaf[0] = 0xffffffff;
3408 mcaf[1] = 0xffffffff;
3409 } else
3410 ed_ds_getmcaf(sc, mcaf);
3411
3412 /*
3413 * Set multicast filter on chip.
3414 */
3415 for (i = 0; i < 8; i++)
3416 ed_nic_outb(sc, ED_P1_MAR(i), ((u_char *) mcaf)[i]);
3417
3418 /* Set page 0 registers */
3419 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
3420
3421 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_AM | ED_RCR_AB | reg1);
3422 } else {
3423
3424 /*
3425 * Initialize multicast address hashing registers to
3426 * not accept multicasts.
3427 */
3428 for (i = 0; i < 8; ++i)
3429 ed_nic_outb(sc, ED_P1_MAR(i), 0x00);
3430
3431 /* Set page 0 registers */
3432 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
3433
3434 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_AB | reg1);
3435 }
3436 }
3437
3438 /*
3439 * Start interface.
3440 */
3441 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
3442}
3443
3444/*
3445 * Compute the multicast address filter from the
3446 * list of multicast addresses we need to listen to.
3447 */
3448static void
3449ed_ds_getmcaf(struct ed_softc *sc, uint32_t *mcaf)
3450{
3451 uint32_t index;
3452 u_char *af = (u_char *) mcaf;
3453 struct ifmultiaddr *ifma;
3454
3455 mcaf[0] = 0;
3456 mcaf[1] = 0;
3457
3458 TAILQ_FOREACH(ifma, &sc->arpcom.ac_if.if_multiaddrs, ifma_link) {
3459 if (ifma->ifma_addr->sa_family != AF_LINK)
3460 continue;
3461 index = ether_crc32_be(LLADDR((struct sockaddr_dl *)
3462 ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
3463 af[index >> 3] |= 1 << (index & 7);
3464 }
3465}
3466
3467int
1565#ifndef ED_NO_MIIBUS
1566/*
1567 * MII bus support routines.
1568 */
1569int
1570ed_miibus_readreg(device_t dev, int phy, int reg)
1571{
1572 struct ed_softc *sc;
1573 int failed, s, val;
1574
1575 s = splimp();
1576 sc = device_get_softc(dev);
1577 if (sc->gone) {
1578 splx(s);
1579 return (0);
1580 }
1581
1582 (*sc->mii_writebits)(sc, 0xffffffff, 32);
1583 (*sc->mii_writebits)(sc, ED_MII_STARTDELIM, ED_MII_STARTDELIM_BITS);
1584 (*sc->mii_writebits)(sc, ED_MII_READOP, ED_MII_OP_BITS);
1585 (*sc->mii_writebits)(sc, phy, ED_MII_PHY_BITS);
1586 (*sc->mii_writebits)(sc, reg, ED_MII_REG_BITS);
1587
1588 failed = (*sc->mii_readbits)(sc, ED_MII_ACK_BITS);
1589 val = (*sc->mii_readbits)(sc, ED_MII_DATA_BITS);
1590 (*sc->mii_writebits)(sc, ED_MII_IDLE, ED_MII_IDLE_BITS);
1591
1592 splx(s);
1593 return (failed ? 0 : val);
1594}
1595
1596void
1597ed_miibus_writereg(device_t dev, int phy, int reg, int data)
1598{
1599 struct ed_softc *sc;
1600 int s;
1601
1602 s = splimp();
1603 sc = device_get_softc(dev);
1604 if (sc->gone) {
1605 splx(s);
1606 return;
1607 }
1608
1609 (*sc->mii_writebits)(sc, 0xffffffff, 32);
1610 (*sc->mii_writebits)(sc, ED_MII_STARTDELIM, ED_MII_STARTDELIM_BITS);
1611 (*sc->mii_writebits)(sc, ED_MII_WRITEOP, ED_MII_OP_BITS);
1612 (*sc->mii_writebits)(sc, phy, ED_MII_PHY_BITS);
1613 (*sc->mii_writebits)(sc, reg, ED_MII_REG_BITS);
1614 (*sc->mii_writebits)(sc, ED_MII_TURNAROUND, ED_MII_TURNAROUND_BITS);
1615 (*sc->mii_writebits)(sc, data, ED_MII_DATA_BITS);
1616 (*sc->mii_writebits)(sc, ED_MII_IDLE, ED_MII_IDLE_BITS);
1617
1618 splx(s);
1619}
1620
1621int
1622ed_ifmedia_upd(struct ifnet *ifp)
1623{
1624 struct ed_softc *sc;
1625 struct mii_data *mii;
1626
1627 sc = ifp->if_softc;
1628 if (sc->gone || sc->miibus == NULL)
1629 return (ENXIO);
1630
1631 mii = device_get_softc(sc->miibus);
1632 return mii_mediachg(mii);
1633}
1634
1635void
1636ed_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
1637{
1638 struct ed_softc *sc;
1639 struct mii_data *mii;
1640
1641 sc = ifp->if_softc;
1642 if (sc->gone || sc->miibus == NULL)
1643 return;
1644
1645 mii = device_get_softc(sc->miibus);
1646 mii_pollstat(mii);
1647 ifmr->ifm_active = mii->mii_media_active;
1648 ifmr->ifm_status = mii->mii_media_status;
1649}
1650
1651void
1652ed_child_detached(device_t dev, device_t child)
1653{
1654 struct ed_softc *sc;
1655
1656 sc = device_get_softc(dev);
1657 if (child == sc->miibus)
1658 sc->miibus = NULL;
1659}
1660#endif
1661
1662static void
1663ed_setrcr(struct ed_softc *sc)
1664{
1665 struct ifnet *ifp = (struct ifnet *)sc;
1666 int i;
1667 u_char reg1;
1668
1669 /* Bit 6 in AX88190 RCR register must be set. */
1670 if (sc->chip_type == ED_CHIP_TYPE_AX88190)
1671 reg1 = ED_RCR_INTT;
1672 else
1673 reg1 = 0x00;
1674
1675 /* set page 1 registers */
1676 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_PAGE_1 | ED_CR_STP);
1677
1678 if (ifp->if_flags & IFF_PROMISC) {
1679
1680 /*
1681 * Reconfigure the multicast filter.
1682 */
1683 for (i = 0; i < 8; i++)
1684 ed_nic_outb(sc, ED_P1_MAR(i), 0xff);
1685
1686 /*
1687 * And turn on promiscuous mode. Also enable reception of
1688 * runts and packets with CRC & alignment errors.
1689 */
1690 /* Set page 0 registers */
1691 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
1692
1693 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_PRO | ED_RCR_AM |
1694 ED_RCR_AB | ED_RCR_AR | ED_RCR_SEP | reg1);
1695 } else {
1696 /* set up multicast addresses and filter modes */
1697 if (ifp->if_flags & IFF_MULTICAST) {
1698 uint32_t mcaf[2];
1699
1700 if (ifp->if_flags & IFF_ALLMULTI) {
1701 mcaf[0] = 0xffffffff;
1702 mcaf[1] = 0xffffffff;
1703 } else
1704 ed_ds_getmcaf(sc, mcaf);
1705
1706 /*
1707 * Set multicast filter on chip.
1708 */
1709 for (i = 0; i < 8; i++)
1710 ed_nic_outb(sc, ED_P1_MAR(i), ((u_char *) mcaf)[i]);
1711
1712 /* Set page 0 registers */
1713 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
1714
1715 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_AM | ED_RCR_AB | reg1);
1716 } else {
1717
1718 /*
1719 * Initialize multicast address hashing registers to
1720 * not accept multicasts.
1721 */
1722 for (i = 0; i < 8; ++i)
1723 ed_nic_outb(sc, ED_P1_MAR(i), 0x00);
1724
1725 /* Set page 0 registers */
1726 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STP);
1727
1728 ed_nic_outb(sc, ED_P0_RCR, ED_RCR_AB | reg1);
1729 }
1730 }
1731
1732 /*
1733 * Start interface.
1734 */
1735 ed_nic_outb(sc, ED_P0_CR, sc->cr_proto | ED_CR_STA);
1736}
1737
1738/*
1739 * Compute the multicast address filter from the
1740 * list of multicast addresses we need to listen to.
1741 */
1742static void
1743ed_ds_getmcaf(struct ed_softc *sc, uint32_t *mcaf)
1744{
1745 uint32_t index;
1746 u_char *af = (u_char *) mcaf;
1747 struct ifmultiaddr *ifma;
1748
1749 mcaf[0] = 0;
1750 mcaf[1] = 0;
1751
1752 TAILQ_FOREACH(ifma, &sc->arpcom.ac_if.if_multiaddrs, ifma_link) {
1753 if (ifma->ifma_addr->sa_family != AF_LINK)
1754 continue;
1755 index = ether_crc32_be(LLADDR((struct sockaddr_dl *)
1756 ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
1757 af[index >> 3] |= 1 << (index & 7);
1758 }
1759}
1760
1761int
1762ed_isa_mem_ok(device_t dev, u_long pmem, u_int memsize)
1763{
1764 if (pmem < 0xa0000 || pmem + memsize > 0x1000000) {
1765 device_printf(dev, "Invalid ISA memory address range "
1766 "configured: 0x%lx - 0x%lx\n", pmem, pmem + memsize);
1767 return (ENXIO);
1768 }
1769 return (0);
1770}
1771
1772int
3468ed_clear_memory(device_t dev)
3469{
3470 struct ed_softc *sc = device_get_softc(dev);
3471 int i;
3472
3473 /*
3474 * Now zero memory and verify that it is clear
3475 */
3476 bzero(sc->mem_start, sc->mem_size);
3477
3478 for (i = 0; i < sc->mem_size; ++i) {
3479 if (sc->mem_start[i]) {
3480 device_printf(dev, "failed to clear shared memory at "
3481 "0x%jx - check configuration\n",
3482 (uintmax_t)rman_get_start(sc->mem_res) + i);
3483 return (ENXIO);
3484 }
3485 }
3486 return (0);
3487}
1773ed_clear_memory(device_t dev)
1774{
1775 struct ed_softc *sc = device_get_softc(dev);
1776 int i;
1777
1778 /*
1779 * Now zero memory and verify that it is clear
1780 */
1781 bzero(sc->mem_start, sc->mem_size);
1782
1783 for (i = 0; i < sc->mem_size; ++i) {
1784 if (sc->mem_start[i]) {
1785 device_printf(dev, "failed to clear shared memory at "
1786 "0x%jx - check configuration\n",
1787 (uintmax_t)rman_get_start(sc->mem_res) + i);
1788 return (ENXIO);
1789 }
1790 }
1791 return (0);
1792}