if_axen.c revision 1.19 1 /* $NetBSD: if_axen.c,v 1.19 2019/01/30 11:13:25 rin Exp $ */
2 /* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */
3
4 /*
5 * Copyright (c) 2013 Yojiro UO <yuo (at) openbsd.org>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 /*
21 * ASIX Electronics AX88178a USB 2.0 ethernet and AX88179 USB 3.0 Ethernet
22 * driver.
23 */
24
25 #include <sys/cdefs.h>
26 __KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.19 2019/01/30 11:13:25 rin Exp $");
27
28 #ifdef _KERNEL_OPT
29 #include "opt_inet.h"
30 #include "opt_usb.h"
31 #endif
32
33 #include <sys/param.h>
34 #include <sys/bus.h>
35 #include <sys/device.h>
36 #include <sys/kernel.h>
37 #include <sys/mbuf.h>
38 #include <sys/module.h>
39 #include <sys/rwlock.h>
40 #include <sys/socket.h>
41 #include <sys/sockio.h>
42 #include <sys/systm.h>
43
44 #include <sys/rndsource.h>
45
46 #include <net/if.h>
47 #include <net/if_dl.h>
48 #include <net/if_ether.h>
49 #include <net/if_media.h>
50
51 #include <net/bpf.h>
52
53 #include <dev/mii/mii.h>
54 #include <dev/mii/miivar.h>
55
56 #include <dev/usb/usb.h>
57 #include <dev/usb/usbdi.h>
58 #include <dev/usb/usbdi_util.h>
59 #include <dev/usb/usbdivar.h>
60 #include <dev/usb/usbdevs.h>
61
62 #include <dev/usb/if_axenreg.h>
63
64 #ifdef AXEN_DEBUG
65 #define DPRINTF(x) do { if (axendebug) printf x; } while (/*CONSTCOND*/0)
66 #define DPRINTFN(n,x) do { if (axendebug >= (n)) printf x; } while (/*CONSTCOND*/0)
67 int axendebug = 0;
68 #else
69 #define DPRINTF(x)
70 #define DPRINTFN(n,x)
71 #endif
72
73 /*
74 * Various supported device vendors/products.
75 */
76 static const struct axen_type axen_devs[] = {
77 #if 0 /* not tested */
78 { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88178A}, AX178A },
79 #endif
80 { { USB_VENDOR_ASIX, USB_PRODUCT_ASIX_AX88179}, AX179 },
81 { { USB_VENDOR_DLINK, USB_PRODUCT_DLINK_DUB1312}, AX179 }
82 };
83
84 #define axen_lookup(v, p) ((const struct axen_type *)usb_lookup(axen_devs, v, p))
85
86 static int axen_match(device_t, cfdata_t, void *);
87 static void axen_attach(device_t, device_t, void *);
88 static int axen_detach(device_t, int);
89 static int axen_activate(device_t, devact_t);
90
91 CFATTACH_DECL_NEW(axen, sizeof(struct axen_softc),
92 axen_match, axen_attach, axen_detach, axen_activate);
93
94 static int axen_tx_list_init(struct axen_softc *);
95 static int axen_rx_list_init(struct axen_softc *);
96 static struct mbuf *axen_newbuf(void);
97 static int axen_encap(struct axen_softc *, struct mbuf *, int);
98 static void axen_rxeof(struct usbd_xfer *, void *, usbd_status);
99 static int axen_csum_flags_rx(struct ifnet *, uint32_t);
100 static void axen_txeof(struct usbd_xfer *, void *, usbd_status);
101 static void axen_tick(void *);
102 static void axen_tick_task(void *);
103 static void axen_start(struct ifnet *);
104 static int axen_ioctl(struct ifnet *, u_long, void *);
105 static int axen_init(struct ifnet *);
106 static void axen_stop(struct ifnet *, int);
107 static void axen_watchdog(struct ifnet *);
108 static int axen_miibus_readreg(device_t, int, int, uint16_t *);
109 static int axen_miibus_writereg(device_t, int, int, uint16_t);
110 static void axen_miibus_statchg(struct ifnet *);
111 static int axen_cmd(struct axen_softc *, int, int, int, void *);
112 static int axen_ifmedia_upd(struct ifnet *);
113 static void axen_ifmedia_sts(struct ifnet *, struct ifmediareq *);
114 static void axen_reset(struct axen_softc *);
115 #if 0
116 static int axen_ax88179_eeprom(struct axen_softc *, void *);
117 #endif
118
119 static void axen_iff(struct axen_softc *);
120 static void axen_lock_mii(struct axen_softc *);
121 static void axen_unlock_mii(struct axen_softc *);
122
123 static void axen_ax88179_init(struct axen_softc *);
124 static void axen_setcoe(struct axen_softc *);
125
126 /* Get exclusive access to the MII registers */
127 static void
128 axen_lock_mii(struct axen_softc *sc)
129 {
130
131 sc->axen_refcnt++;
132 rw_enter(&sc->axen_mii_lock, RW_WRITER);
133 }
134
135 static void
136 axen_unlock_mii(struct axen_softc *sc)
137 {
138
139 rw_exit(&sc->axen_mii_lock);
140 if (--sc->axen_refcnt < 0)
141 usb_detach_wakeupold(sc->axen_dev);
142 }
143
144 static int
145 axen_cmd(struct axen_softc *sc, int cmd, int index, int val, void *buf)
146 {
147 usb_device_request_t req;
148 usbd_status err;
149
150 KASSERT(rw_lock_held(&sc->axen_mii_lock));
151
152 if (sc->axen_dying)
153 return 0;
154
155 if (AXEN_CMD_DIR(cmd))
156 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
157 else
158 req.bmRequestType = UT_READ_VENDOR_DEVICE;
159 req.bRequest = AXEN_CMD_CMD(cmd);
160 USETW(req.wValue, val);
161 USETW(req.wIndex, index);
162 USETW(req.wLength, AXEN_CMD_LEN(cmd));
163
164 err = usbd_do_request(sc->axen_udev, &req, buf);
165 DPRINTFN(5, ("axen_cmd: cmd 0x%04x val 0x%04x len %d\n",
166 cmd, val, AXEN_CMD_LEN(cmd)));
167
168 if (err) {
169 DPRINTF(("axen_cmd err: cmd: %d, error: %d\n", cmd, err));
170 return -1;
171 }
172
173 return 0;
174 }
175
176 static int
177 axen_miibus_readreg(device_t dev, int phy, int reg, uint16_t *val)
178 {
179 struct axen_softc *sc = device_private(dev);
180 usbd_status err;
181 uint16_t data;
182
183 if (sc->axen_dying) {
184 DPRINTF(("axen: dying\n"));
185 return -1;
186 }
187
188 if (sc->axen_phyno != phy)
189 return -1;
190
191 axen_lock_mii(sc);
192 err = axen_cmd(sc, AXEN_CMD_MII_READ_REG, reg, phy, &data);
193 axen_unlock_mii(sc);
194
195 if (err) {
196 aprint_error_dev(sc->axen_dev, "read PHY failed\n");
197 return err;
198 }
199
200 *val = le16toh(data);
201 DPRINTFN(2,("axen_miibus_readreg: phy 0x%x reg 0x%x val 0x%hx\n",
202 phy, reg, *val));
203
204 if (reg == MII_BMSR) {
205 *val &= ~BMSR_EXTCAP;
206 }
207
208 return 0;
209 }
210
211 static int
212 axen_miibus_writereg(device_t dev, int phy, int reg, uint16_t val)
213 {
214 struct axen_softc *sc = device_private(dev);
215 usbd_status err;
216 uint16_t uval;
217
218 if (sc->axen_dying)
219 return -1;
220
221 if (sc->axen_phyno != phy)
222 return -1;
223
224 uval = htole16(val);
225 axen_lock_mii(sc);
226 err = axen_cmd(sc, AXEN_CMD_MII_WRITE_REG, reg, phy, &uval);
227 axen_unlock_mii(sc);
228 DPRINTFN(2, ("axen_miibus_writereg: phy 0x%x reg 0x%x val 0x%04hx\n",
229 phy, reg, val));
230
231 if (err) {
232 aprint_error_dev(sc->axen_dev, "write PHY failed\n");
233 return err;
234 }
235
236 return 0;
237 }
238
239 static void
240 axen_miibus_statchg(struct ifnet *ifp)
241 {
242 struct axen_softc *sc = ifp->if_softc;
243 struct mii_data *mii = GET_MII(sc);
244 int err;
245 uint16_t val;
246 uint16_t wval;
247
248 sc->axen_link = 0;
249 if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) ==
250 (IFM_ACTIVE | IFM_AVALID)) {
251 switch (IFM_SUBTYPE(mii->mii_media_active)) {
252 case IFM_10_T:
253 case IFM_100_TX:
254 sc->axen_link++;
255 break;
256 case IFM_1000_T:
257 sc->axen_link++;
258 break;
259 default:
260 break;
261 }
262 }
263
264 /* Lost link, do nothing. */
265 if (sc->axen_link == 0)
266 return;
267
268 val = 0;
269 if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX)
270 val |= AXEN_MEDIUM_FDX;
271
272 val |= (AXEN_MEDIUM_RECV_EN | AXEN_MEDIUM_ALWAYS_ONE);
273 val |= (AXEN_MEDIUM_RXFLOW_CTRL_EN | AXEN_MEDIUM_TXFLOW_CTRL_EN);
274
275 switch (IFM_SUBTYPE(mii->mii_media_active)) {
276 case IFM_1000_T:
277 val |= AXEN_MEDIUM_GIGA | AXEN_MEDIUM_EN_125MHZ;
278 break;
279 case IFM_100_TX:
280 val |= AXEN_MEDIUM_PS;
281 break;
282 case IFM_10_T:
283 /* doesn't need to be handled */
284 break;
285 }
286
287 DPRINTF(("axen_miibus_statchg: val=0x%x\n", val));
288 wval = htole16(val);
289 axen_lock_mii(sc);
290 err = axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MEDIUM_STATUS, &wval);
291 axen_unlock_mii(sc);
292 if (err) {
293 aprint_error_dev(sc->axen_dev, "media change failed\n");
294 return;
295 }
296 }
297
298 /*
299 * Set media options.
300 */
301 static int
302 axen_ifmedia_upd(struct ifnet *ifp)
303 {
304 struct axen_softc *sc = ifp->if_softc;
305 struct mii_data *mii = GET_MII(sc);
306 int rc;
307
308 sc->axen_link = 0;
309
310 if (mii->mii_instance) {
311 struct mii_softc *miisc;
312
313 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
314 mii_phy_reset(miisc);
315 }
316
317 if ((rc = mii_mediachg(mii)) == ENXIO)
318 return 0;
319 return rc;
320 }
321
322 /*
323 * Report current media status.
324 */
325 static void
326 axen_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
327 {
328 struct axen_softc *sc = ifp->if_softc;
329 struct mii_data *mii = GET_MII(sc);
330
331 mii_pollstat(mii);
332 ifmr->ifm_active = mii->mii_media_active;
333 ifmr->ifm_status = mii->mii_media_status;
334 }
335
336 static void
337 axen_iff(struct axen_softc *sc)
338 {
339 struct ifnet *ifp = GET_IFP(sc);
340 struct ethercom *ec = &sc->axen_ec;
341 struct ether_multi *enm;
342 struct ether_multistep step;
343 uint32_t h = 0;
344 uint16_t rxmode;
345 uint8_t hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
346 uint16_t wval;
347
348 if (sc->axen_dying)
349 return;
350
351 rxmode = 0;
352
353 /* Enable receiver, set RX mode */
354 axen_lock_mii(sc);
355 axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MAC_RXCTL, &wval);
356 rxmode = le16toh(wval);
357 rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST |
358 AXEN_RXCTL_PROMISC);
359 ifp->if_flags &= ~IFF_ALLMULTI;
360
361 /*
362 * Always accept broadcast frames.
363 * Always accept frames destined to our station address.
364 */
365 rxmode |= AXEN_RXCTL_ACPT_BCAST;
366
367 if (ifp->if_flags & IFF_PROMISC || ec->ec_multicnt > 0 /* XXX */) {
368 ifp->if_flags |= IFF_ALLMULTI;
369 rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
370 if (ifp->if_flags & IFF_PROMISC)
371 rxmode |= AXEN_RXCTL_PROMISC;
372 } else {
373 rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
374
375 /* now program new ones */
376 ETHER_FIRST_MULTI(step, ec, enm);
377 while (enm != NULL) {
378 h = ether_crc32_be(enm->enm_addrlo,
379 ETHER_ADDR_LEN) >> 26;
380 hashtbl[h / 8] |= 1 << (h % 8);
381 ETHER_NEXT_MULTI(step, enm);
382 }
383 }
384
385 axen_cmd(sc, AXEN_CMD_MAC_WRITE_FILTER, 8, AXEN_FILTER_MULTI, hashtbl);
386 wval = htole16(rxmode);
387 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval);
388 axen_unlock_mii(sc);
389 }
390
391 static void
392 axen_reset(struct axen_softc *sc)
393 {
394
395 if (sc->axen_dying)
396 return;
397 /* XXX What to reset? */
398
399 /* Wait a little while for the chip to get its brains in order. */
400 DELAY(1000);
401 }
402
403 #if 0 /* not used */
404 #define AXEN_GPIO_WRITE(x,y) do { \
405 axen_cmd(sc, AXEN_CMD_WRITE_GPIO, 0, (x), NULL); \
406 usbd_delay_ms(sc->axen_udev, (y)); \
407 } while (/*CONSTCOND*/0)
408
409 static int
410 axen_ax88179_eeprom(struct axen_softc *sc, void *addr)
411 {
412 int i, retry;
413 uint8_t eeprom[20];
414 uint16_t csum;
415 uint16_t buf;
416
417 for (i = 0; i < 6; i++) {
418 /* set eeprom address */
419 buf = htole16(i);
420 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_MAC_EEPROM_ADDR, &buf);
421
422 /* set eeprom command */
423 buf = htole16(AXEN_EEPROM_READ);
424 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_MAC_EEPROM_CMD, &buf);
425
426 /* check the value is ready */
427 retry = 3;
428 do {
429 buf = htole16(AXEN_EEPROM_READ);
430 usbd_delay_ms(sc->axen_udev, 10);
431 axen_cmd(sc, AXEN_CMD_MAC_READ, 1, AXEN_MAC_EEPROM_CMD,
432 &buf);
433 retry--;
434 if (retry < 0)
435 return EINVAL;
436 } while ((le16toh(buf) & 0xff) & AXEN_EEPROM_BUSY);
437
438 /* read data */
439 axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_EEPROM_READ,
440 &eeprom[i * 2]);
441
442 /* sanity check */
443 if ((i == 0) && (eeprom[0] == 0xff))
444 return EINVAL;
445 }
446
447 /* check checksum */
448 csum = eeprom[6] + eeprom[7] + eeprom[8] + eeprom[9];
449 csum = (csum >> 8) + (csum & 0xff) + eeprom[10];
450 if (csum != 0xff) {
451 printf("eeprom checksum mismatchi(0x%02x)\n", csum);
452 return EINVAL;
453 }
454
455 memcpy(addr, eeprom, ETHER_ADDR_LEN);
456 return 0;
457 }
458 #endif
459
460 static void
461 axen_ax88179_init(struct axen_softc *sc)
462 {
463 struct axen_qctrl qctrl;
464 uint16_t ctl, temp;
465 uint16_t wval;
466 uint8_t val;
467
468 axen_lock_mii(sc);
469
470 /* XXX: ? */
471 axen_cmd(sc, AXEN_CMD_MAC_READ, 1, AXEN_UNK_05, &val);
472 DPRINTFN(5, ("AXEN_CMD_MAC_READ(0x05): 0x%02x\n", val));
473
474 /* check AX88179 version, UA1 / UA2 */
475 axen_cmd(sc, AXEN_CMD_MAC_READ, 1, AXEN_GENERAL_STATUS, &val);
476 /* UA1 */
477 if (!(val & AXEN_GENERAL_STATUS_MASK)) {
478 sc->axen_rev = AXEN_REV_UA1;
479 DPRINTF(("AX88179 ver. UA1\n"));
480 } else {
481 sc->axen_rev = AXEN_REV_UA2;
482 DPRINTF(("AX88179 ver. UA2\n"));
483 }
484
485 /* power up ethernet PHY */
486 wval = htole16(0);
487 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_PHYPWR_RSTCTL, &wval);
488
489 wval = htole16(AXEN_PHYPWR_RSTCTL_IPRL);
490 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_PHYPWR_RSTCTL, &wval);
491 usbd_delay_ms(sc->axen_udev, 200);
492
493 /* set clock mode */
494 val = AXEN_PHYCLK_ACS | AXEN_PHYCLK_BCS;
495 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_PHYCLK, &val);
496 usbd_delay_ms(sc->axen_udev, 100);
497
498 /* set monitor mode (disable) */
499 val = AXEN_MONITOR_NONE;
500 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_MONITOR_MODE, &val);
501
502 /* enable auto detach */
503 axen_cmd(sc, AXEN_CMD_EEPROM_READ, 2, AXEN_EEPROM_STAT, &wval);
504 temp = le16toh(wval);
505 DPRINTFN(2,("EEPROM0x43 = 0x%04x\n", temp));
506 if (!(temp == 0xffff) && !(temp & 0x0100)) {
507 /* Enable auto detach bit */
508 val = 0;
509 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_PHYCLK, &val);
510 val = AXEN_PHYCLK_ULR;
511 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_PHYCLK, &val);
512 usbd_delay_ms(sc->axen_udev, 100);
513
514 axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_PHYPWR_RSTCTL, &wval);
515 ctl = le16toh(wval);
516 ctl |= AXEN_PHYPWR_RSTCTL_AUTODETACH;
517 wval = htole16(ctl);
518 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_PHYPWR_RSTCTL, &wval);
519 usbd_delay_ms(sc->axen_udev, 200);
520 aprint_error_dev(sc->axen_dev, "enable auto detach (0x%04x)\n",
521 ctl);
522 }
523
524 /* bulkin queue setting */
525 axen_cmd(sc, AXEN_CMD_MAC_READ, 1, AXEN_USB_UPLINK, &val);
526 switch (val) {
527 case AXEN_USB_FS:
528 DPRINTF(("uplink: USB1.1\n"));
529 qctrl.ctrl = 0x07;
530 qctrl.timer_low = 0xcc;
531 qctrl.timer_high = 0x4c;
532 qctrl.bufsize = AXEN_BUFSZ_LS - 1;
533 qctrl.ifg = 0x08;
534 break;
535 case AXEN_USB_HS:
536 DPRINTF(("uplink: USB2.0\n"));
537 qctrl.ctrl = 0x07;
538 qctrl.timer_low = 0x02;
539 qctrl.timer_high = 0xa0;
540 qctrl.bufsize = AXEN_BUFSZ_HS - 1;
541 qctrl.ifg = 0xff;
542 break;
543 case AXEN_USB_SS:
544 DPRINTF(("uplink: USB3.0\n"));
545 qctrl.ctrl = 0x07;
546 qctrl.timer_low = 0x4f;
547 qctrl.timer_high = 0x00;
548 qctrl.bufsize = AXEN_BUFSZ_SS - 1;
549 qctrl.ifg = 0xff;
550 break;
551 default:
552 aprint_error_dev(sc->axen_dev, "unknown uplink bus:0x%02x\n",
553 val);
554 axen_unlock_mii(sc);
555 return;
556 }
557 axen_cmd(sc, AXEN_CMD_MAC_SET_RXSR, 5, AXEN_RX_BULKIN_QCTRL, &qctrl);
558
559 /*
560 * set buffer high/low watermark to pause/resume.
561 * write 2byte will set high/log simultaneous with AXEN_PAUSE_HIGH.
562 * XXX: what is the best value? OSX driver uses 0x3c-0x4c as LOW-HIGH
563 * watermark parameters.
564 */
565 val = 0x34;
566 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_PAUSE_LOW_WATERMARK, &val);
567 val = 0x52;
568 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_PAUSE_HIGH_WATERMARK, &val);
569
570 /* Set RX/TX configuration. */
571 /* Offloadng enable */
572 axen_setcoe(sc);
573
574 /* Set RX control register */
575 ctl = AXEN_RXCTL_IPE | AXEN_RXCTL_DROPCRCERR | AXEN_RXCTL_AUTOB;
576 ctl |= AXEN_RXCTL_ACPT_PHY_MCAST | AXEN_RXCTL_ACPT_ALL_MCAST;
577 ctl |= AXEN_RXCTL_START;
578 wval = htole16(ctl);
579 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval);
580
581 /* set monitor mode (enable) */
582 val = AXEN_MONITOR_PMETYPE | AXEN_MONITOR_PMEPOL | AXEN_MONITOR_RWMP;
583 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_MONITOR_MODE, &val);
584 axen_cmd(sc, AXEN_CMD_MAC_READ, 1, AXEN_MONITOR_MODE, &val);
585 DPRINTF(("axen: Monitor mode = 0x%02x\n", val));
586
587 /* set medium type */
588 ctl = AXEN_MEDIUM_GIGA | AXEN_MEDIUM_FDX | AXEN_MEDIUM_ALWAYS_ONE |
589 AXEN_MEDIUM_RXFLOW_CTRL_EN | AXEN_MEDIUM_TXFLOW_CTRL_EN;
590 ctl |= AXEN_MEDIUM_RECV_EN;
591 wval = htole16(ctl);
592 DPRINTF(("axen: set to medium mode: 0x%04x\n", ctl));
593 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MEDIUM_STATUS, &wval);
594 usbd_delay_ms(sc->axen_udev, 100);
595
596 axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MEDIUM_STATUS, &wval);
597 DPRINTF(("axen: current medium mode: 0x%04x\n", le16toh(wval)));
598
599 axen_unlock_mii(sc);
600
601 #if 0 /* XXX: TBD.... */
602 #define GMII_LED_ACTIVE 0x1a
603 #define GMII_PHY_PAGE_SEL 0x1e
604 #define GMII_PHY_PAGE_SEL 0x1f
605 #define GMII_PAGE_EXT 0x0007
606 axen_miibus_writereg(&sc->axen_dev, sc->axen_phyno, GMII_PHY_PAGE_SEL,
607 GMII_PAGE_EXT);
608 axen_miibus_writereg(&sc->axen_dev, sc->axen_phyno, GMII_PHY_PAGE,
609 0x002c);
610 #endif
611
612 #if 1 /* XXX: phy hack ? */
613 axen_miibus_writereg(sc->axen_dev, sc->axen_phyno, 0x1F, 0x0005);
614 axen_miibus_writereg(sc->axen_dev, sc->axen_phyno, 0x0C, 0x0000);
615 axen_miibus_readreg(sc->axen_dev, sc->axen_phyno, 0x0001, &wval);
616 axen_miibus_writereg(sc->axen_dev, sc->axen_phyno, 0x01,
617 wval | 0x0080);
618 axen_miibus_writereg(sc->axen_dev, sc->axen_phyno, 0x1F, 0x0000);
619 #endif
620 }
621
622 static void
623 axen_setcoe(struct axen_softc *sc)
624 {
625 struct ifnet *ifp = GET_IFP(sc);
626 uint64_t enabled = ifp->if_capenable;
627 uint8_t val;
628
629 if (enabled & (IFCAP_CSUM_IPv4_Rx |
630 IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_UDPv4_Rx |
631 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_UDPv6_Rx)) {
632 val = 0;
633 if (enabled & IFCAP_CSUM_IPv4_Rx)
634 val |= AXEN_RXCOE_IPv4;
635 if (enabled & IFCAP_CSUM_TCPv4_Rx)
636 val |= AXEN_RXCOE_TCPv4;
637 if (enabled & IFCAP_CSUM_UDPv4_Rx)
638 val |= AXEN_RXCOE_UDPv4;
639 if (enabled & IFCAP_CSUM_TCPv6_Rx)
640 val |= AXEN_RXCOE_TCPv6;
641 if (enabled & IFCAP_CSUM_UDPv6_Rx)
642 val |= AXEN_RXCOE_UDPv6;
643 } else
644 val = AXEN_RXCOE_OFF;
645 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_RX_COE, &val);
646
647 if (enabled & (IFCAP_CSUM_IPv4_Tx |
648 IFCAP_CSUM_TCPv4_Tx | IFCAP_CSUM_UDPv4_Tx |
649 IFCAP_CSUM_TCPv6_Tx | IFCAP_CSUM_UDPv6_Tx)) {
650 val = 0;
651 if (enabled & IFCAP_CSUM_IPv4_Tx)
652 val |= AXEN_TXCOE_IPv4;
653 if (enabled & IFCAP_CSUM_TCPv4_Tx)
654 val |= AXEN_TXCOE_TCPv4;
655 if (enabled & IFCAP_CSUM_UDPv4_Tx)
656 val |= AXEN_TXCOE_UDPv4;
657 if (enabled & IFCAP_CSUM_TCPv6_Tx)
658 val |= AXEN_TXCOE_TCPv6;
659 if (enabled & IFCAP_CSUM_UDPv6_Tx)
660 val |= AXEN_TXCOE_UDPv6;
661 } else
662 val = AXEN_TXCOE_OFF;
663 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_TX_COE, &val);
664 }
665
666 static int
667 axen_match(device_t parent, cfdata_t match, void *aux)
668 {
669 struct usb_attach_arg *uaa = aux;
670
671 return axen_lookup(uaa->uaa_vendor, uaa->uaa_product) != NULL ?
672 UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
673 }
674
675 static void
676 axen_attach(device_t parent, device_t self, void *aux)
677 {
678 struct axen_softc *sc = device_private(self);
679 struct usb_attach_arg *uaa = aux;
680 struct usbd_device *dev = uaa->uaa_device;
681 usbd_status err;
682 usb_interface_descriptor_t *id;
683 usb_endpoint_descriptor_t *ed;
684 struct mii_data *mii;
685 uint8_t eaddr[ETHER_ADDR_LEN];
686 char *devinfop;
687 const char *devname = device_xname(self);
688 struct ifnet *ifp;
689 int i, s;
690
691 aprint_naive("\n");
692 aprint_normal("\n");
693
694 sc->axen_dev = self;
695 sc->axen_udev = dev;
696
697 devinfop = usbd_devinfo_alloc(dev, 0);
698 aprint_normal_dev(self, "%s\n", devinfop);
699 usbd_devinfo_free(devinfop);
700
701 err = usbd_set_config_no(dev, AXEN_CONFIG_NO, 1);
702 if (err) {
703 aprint_error_dev(self, "failed to set configuration"
704 ", err=%s\n", usbd_errstr(err));
705 return;
706 }
707
708 sc->axen_flags = axen_lookup(uaa->uaa_vendor, uaa->uaa_product)->axen_flags;
709
710 rw_init(&sc->axen_mii_lock);
711 usb_init_task(&sc->axen_tick_task, axen_tick_task, sc, 0);
712
713 err = usbd_device2interface_handle(dev, AXEN_IFACE_IDX,&sc->axen_iface);
714 if (err) {
715 aprint_error_dev(self, "getting interface handle failed\n");
716 return;
717 }
718
719 sc->axen_product = uaa->uaa_product;
720 sc->axen_vendor = uaa->uaa_vendor;
721
722 id = usbd_get_interface_descriptor(sc->axen_iface);
723
724 /* decide on what our bufsize will be */
725 switch (sc->axen_udev->ud_speed) {
726 case USB_SPEED_SUPER:
727 sc->axen_bufsz = AXEN_BUFSZ_SS * 1024;
728 break;
729 case USB_SPEED_HIGH:
730 sc->axen_bufsz = AXEN_BUFSZ_HS * 1024;
731 break;
732 default:
733 sc->axen_bufsz = AXEN_BUFSZ_LS * 1024;
734 break;
735 }
736
737 /* Find endpoints. */
738 for (i = 0; i < id->bNumEndpoints; i++) {
739 ed = usbd_interface2endpoint_descriptor(sc->axen_iface, i);
740 if (!ed) {
741 aprint_error_dev(self, "couldn't get ep %d\n", i);
742 return;
743 }
744 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
745 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
746 sc->axen_ed[AXEN_ENDPT_RX] = ed->bEndpointAddress;
747 } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT &&
748 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) {
749 sc->axen_ed[AXEN_ENDPT_TX] = ed->bEndpointAddress;
750 } else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
751 UE_GET_XFERTYPE(ed->bmAttributes) == UE_INTERRUPT) {
752 sc->axen_ed[AXEN_ENDPT_INTR] = ed->bEndpointAddress;
753 }
754 }
755
756 s = splnet();
757
758 sc->axen_phyno = AXEN_PHY_ID;
759 DPRINTF(("%s: phyno %d\n", device_xname(self), sc->axen_phyno));
760
761 /*
762 * Get station address.
763 */
764 #if 0 /* read from eeprom */
765 if (axen_ax88179_eeprom(sc, &eaddr)) {
766 printf("EEPROM checksum error\n");
767 return;
768 }
769 #else /* use MAC command */
770 axen_lock_mii(sc);
771 axen_cmd(sc, AXEN_CMD_MAC_READ_ETHER, 6, AXEN_CMD_MAC_NODE_ID, &eaddr);
772 axen_unlock_mii(sc);
773 #endif
774 axen_ax88179_init(sc);
775
776 /*
777 * An ASIX chip was detected. Inform the world.
778 */
779 if (sc->axen_flags & AX178A)
780 aprint_normal_dev(self, "AX88178a\n");
781 else if (sc->axen_flags & AX179)
782 aprint_normal_dev(self, "AX88179\n");
783 aprint_normal_dev(self, "Ethernet address %s\n", ether_sprintf(eaddr));
784
785 /* Initialize interface info.*/
786
787 ifp = &sc->sc_if;
788 ifp->if_softc = sc;
789 strlcpy(ifp->if_xname, devname, IFNAMSIZ);
790 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
791 ifp->if_ioctl = axen_ioctl;
792 ifp->if_start = axen_start;
793 ifp->if_init = axen_init;
794 ifp->if_stop = axen_stop;
795 ifp->if_watchdog = axen_watchdog;
796
797 IFQ_SET_READY(&ifp->if_snd);
798
799 sc->axen_ec.ec_capabilities = ETHERCAP_VLAN_MTU;
800 ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx |
801 IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv4_Tx |
802 IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv4_Tx |
803 IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_TCPv6_Tx |
804 IFCAP_CSUM_UDPv6_Rx | IFCAP_CSUM_UDPv6_Tx;
805
806 /* Initialize MII/media info. */
807 mii = &sc->axen_mii;
808 mii->mii_ifp = ifp;
809 mii->mii_readreg = axen_miibus_readreg;
810 mii->mii_writereg = axen_miibus_writereg;
811 mii->mii_statchg = axen_miibus_statchg;
812 mii->mii_flags = MIIF_AUTOTSLEEP;
813
814 sc->axen_ec.ec_mii = mii;
815 ifmedia_init(&mii->mii_media, 0, axen_ifmedia_upd, axen_ifmedia_sts);
816 mii_attach(self, mii, 0xffffffff, MII_PHY_ANY, MII_OFFSET_ANY, 0);
817
818 if (LIST_FIRST(&mii->mii_phys) == NULL) {
819 ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
820 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
821 } else
822 ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
823
824 /* Attach the interface. */
825 if_attach(ifp);
826 ether_ifattach(ifp, eaddr);
827 rnd_attach_source(&sc->rnd_source, device_xname(sc->axen_dev),
828 RND_TYPE_NET, RND_FLAG_DEFAULT);
829
830 callout_init(&sc->axen_stat_ch, 0);
831 callout_setfunc(&sc->axen_stat_ch, axen_tick, sc);
832
833 sc->axen_attached = true;
834 splx(s);
835
836 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->axen_udev,sc->axen_dev);
837
838 if (!pmf_device_register(self, NULL, NULL))
839 aprint_error_dev(self, "couldn't establish power handler\n");
840 }
841
842 static int
843 axen_detach(device_t self, int flags)
844 {
845 struct axen_softc *sc = device_private(self);
846 struct ifnet *ifp = GET_IFP(sc);
847 int s;
848
849 DPRINTFN(2,("%s: %s: enter\n", device_xname(sc->axen_dev), __func__));
850
851 /* Detached before attached finished, so just bail out. */
852 if (!sc->axen_attached)
853 return 0;
854
855 pmf_device_deregister(self);
856
857 sc->axen_dying = true;
858
859 callout_halt(&sc->axen_stat_ch, NULL);
860 usb_rem_task_wait(sc->axen_udev, &sc->axen_tick_task,
861 USB_TASKQ_DRIVER, NULL);
862
863 s = splusb();
864
865 if (ifp->if_flags & IFF_RUNNING)
866 axen_stop(ifp, 1);
867
868 callout_destroy(&sc->axen_stat_ch);
869 rnd_detach_source(&sc->rnd_source);
870 mii_detach(&sc->axen_mii, MII_PHY_ANY, MII_OFFSET_ANY);
871 ifmedia_delete_instance(&sc->axen_mii.mii_media, IFM_INST_ANY);
872 ether_ifdetach(ifp);
873 if_detach(ifp);
874
875 #ifdef DIAGNOSTIC
876 if (sc->axen_ep[AXEN_ENDPT_TX] != NULL ||
877 sc->axen_ep[AXEN_ENDPT_RX] != NULL ||
878 sc->axen_ep[AXEN_ENDPT_INTR] != NULL)
879 aprint_debug_dev(self, "detach has active endpoints\n");
880 #endif
881
882 sc->axen_attached = false;
883
884 if (--sc->axen_refcnt >= 0) {
885 /* Wait for processes to go away. */
886 usb_detach_waitold(sc->axen_dev);
887 }
888 splx(s);
889
890 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->axen_udev,sc->axen_dev);
891
892 rw_destroy(&sc->axen_mii_lock);
893
894 return 0;
895 }
896
897 static int
898 axen_activate(device_t self, devact_t act)
899 {
900 struct axen_softc *sc = device_private(self);
901 struct ifnet *ifp = GET_IFP(sc);
902
903 DPRINTFN(2,("%s: %s: enter\n", device_xname(sc->axen_dev), __func__));
904
905 switch (act) {
906 case DVACT_DEACTIVATE:
907 if_deactivate(ifp);
908 sc->axen_dying = true;
909 return 0;
910 default:
911 return EOPNOTSUPP;
912 }
913 }
914
915 static struct mbuf *
916 axen_newbuf(void)
917 {
918 struct mbuf *m;
919
920 MGETHDR(m, M_DONTWAIT, MT_DATA);
921 if (m == NULL)
922 return NULL;
923
924 MCLGET(m, M_DONTWAIT);
925 if (!(m->m_flags & M_EXT)) {
926 m_freem(m);
927 return NULL;
928 }
929
930 m->m_len = m->m_pkthdr.len = MCLBYTES;
931 m_adj(m, ETHER_ALIGN);
932
933 return m;
934 }
935
936 static int
937 axen_rx_list_init(struct axen_softc *sc)
938 {
939 struct axen_cdata *cd;
940 struct axen_chain *c;
941 int i;
942
943 DPRINTF(("%s: %s: enter\n", device_xname(sc->axen_dev), __func__));
944
945 cd = &sc->axen_cdata;
946 for (i = 0; i < AXEN_RX_LIST_CNT; i++) {
947 c = &cd->axen_rx_chain[i];
948 c->axen_sc = sc;
949 c->axen_idx = i;
950 if (c->axen_xfer == NULL) {
951 int err = usbd_create_xfer(sc->axen_ep[AXEN_ENDPT_RX],
952 sc->axen_bufsz, 0, 0, &c->axen_xfer);
953 if (err)
954 return err;
955 c->axen_buf = usbd_get_buffer(c->axen_xfer);
956 }
957 }
958
959 return 0;
960 }
961
962 static int
963 axen_tx_list_init(struct axen_softc *sc)
964 {
965 struct axen_cdata *cd;
966 struct axen_chain *c;
967 int i;
968
969 DPRINTF(("%s: %s: enter\n", device_xname(sc->axen_dev), __func__));
970
971 cd = &sc->axen_cdata;
972 for (i = 0; i < AXEN_TX_LIST_CNT; i++) {
973 c = &cd->axen_tx_chain[i];
974 c->axen_sc = sc;
975 c->axen_idx = i;
976 if (c->axen_xfer == NULL) {
977 int err = usbd_create_xfer(sc->axen_ep[AXEN_ENDPT_TX],
978 sc->axen_bufsz, USBD_FORCE_SHORT_XFER, 0,
979 &c->axen_xfer);
980 if (err)
981 return err;
982 c->axen_buf = usbd_get_buffer(c->axen_xfer);
983 }
984 }
985
986 return 0;
987 }
988
989 /*
990 * A frame has been uploaded: pass the resulting mbuf chain up to
991 * the higher level protocols.
992 */
993 static void
994 axen_rxeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
995 {
996 struct axen_chain *c = (struct axen_chain *)priv;
997 struct axen_softc *sc = c->axen_sc;
998 struct ifnet *ifp = GET_IFP(sc);
999 uint8_t *buf = c->axen_buf;
1000 struct mbuf *m;
1001 uint32_t total_len;
1002 uint32_t rx_hdr, pkt_hdr;
1003 uint32_t *hdr_p;
1004 uint16_t hdr_offset, pkt_count;
1005 size_t pkt_len;
1006 size_t temp;
1007 int s;
1008
1009 DPRINTFN(10,("%s: %s: enter\n", device_xname(sc->axen_dev), __func__));
1010
1011 if (sc->axen_dying)
1012 return;
1013
1014 if (!(ifp->if_flags & IFF_RUNNING))
1015 return;
1016
1017 if (status != USBD_NORMAL_COMPLETION) {
1018 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
1019 return;
1020 if (usbd_ratecheck(&sc->axen_rx_notice)) {
1021 aprint_error_dev(sc->axen_dev, "usb errors on rx: %s\n",
1022 usbd_errstr(status));
1023 }
1024 if (status == USBD_STALLED)
1025 usbd_clear_endpoint_stall_async(sc->axen_ep[AXEN_ENDPT_RX]);
1026 goto done;
1027 }
1028
1029 usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL);
1030
1031 if (total_len < sizeof(pkt_hdr)) {
1032 ifp->if_ierrors++;
1033 goto done;
1034 }
1035
1036 /*
1037 * buffer map
1038 * [packet #0]...[packet #n][pkt hdr#0]..[pkt hdr#n][recv_hdr]
1039 * each packet has 0xeeee as psuedo header..
1040 */
1041 hdr_p = (uint32_t *)(buf + total_len - sizeof(uint32_t));
1042 rx_hdr = le32toh(*hdr_p);
1043 hdr_offset = (uint16_t)(rx_hdr >> 16);
1044 pkt_count = (uint16_t)(rx_hdr & 0xffff);
1045
1046 if (total_len > sc->axen_bufsz) {
1047 aprint_error_dev(sc->axen_dev, "rxeof: too large transfer\n");
1048 goto done;
1049 }
1050
1051 /* sanity check */
1052 if (hdr_offset > total_len) {
1053 ifp->if_ierrors++;
1054 usbd_delay_ms(sc->axen_udev, 100);
1055 goto done;
1056 }
1057
1058 /* point first packet header */
1059 hdr_p = (uint32_t *)(buf + hdr_offset);
1060
1061 /*
1062 * ax88179 will pack multiple ip packet to a USB transaction.
1063 * process all of packets in the buffer
1064 */
1065
1066 #if 1 /* XXX: paranoiac check. need to remove later */
1067 #define AXEN_MAX_PACKED_PACKET 200
1068 if (pkt_count > AXEN_MAX_PACKED_PACKET) {
1069 DPRINTF(("%s: Too many packets (%d) in a transaction, discard.\n",
1070 device_xname(sc->axen_dev), pkt_count));
1071 goto done;
1072 }
1073 #endif
1074
1075 do {
1076 if ((buf[0] != 0xee) || (buf[1] != 0xee)){
1077 aprint_error_dev(sc->axen_dev,
1078 "invalid buffer(pkt#%d), continue\n", pkt_count);
1079 ifp->if_ierrors += pkt_count;
1080 goto done;
1081 }
1082
1083 pkt_hdr = le32toh(*hdr_p);
1084 pkt_len = (pkt_hdr >> 16) & 0x1fff;
1085 DPRINTFN(10,
1086 ("%s: rxeof: packet#%d, pkt_hdr 0x%08x, pkt_len %zu\n",
1087 device_xname(sc->axen_dev), pkt_count, pkt_hdr, pkt_len));
1088
1089 if ((pkt_hdr & AXEN_RXHDR_CRC_ERR) ||
1090 (pkt_hdr & AXEN_RXHDR_DROP_ERR)) {
1091 ifp->if_ierrors++;
1092 /* move to next pkt header */
1093 DPRINTF(("%s: crc err (pkt#%d)\n",
1094 device_xname(sc->axen_dev), pkt_count));
1095 goto nextpkt;
1096 }
1097
1098 /* process each packet */
1099 /* allocate mbuf */
1100 m = axen_newbuf();
1101 if (m == NULL) {
1102 ifp->if_ierrors++;
1103 goto nextpkt;
1104 }
1105
1106 /* skip pseudo header (2byte) */
1107 m_set_rcvif(m, ifp);
1108 m->m_pkthdr.len = m->m_len = pkt_len - 6;
1109
1110 m->m_pkthdr.csum_flags = axen_csum_flags_rx(ifp, pkt_hdr);
1111 memcpy(mtod(m, char *), buf + 2, pkt_len - 6);
1112
1113 /* push the packet up */
1114 s = splnet();
1115 if_percpuq_enqueue((ifp)->if_percpuq, (m));
1116 splx(s);
1117
1118 nextpkt:
1119 /*
1120 * prepare next packet
1121 * as each packet will be aligned 8byte boundary,
1122 * need to fix up the start point of the buffer.
1123 */
1124 temp = ((pkt_len + 7) & 0xfff8);
1125 buf = buf + temp;
1126 hdr_p++;
1127 pkt_count--;
1128 } while( pkt_count > 0);
1129
1130 done:
1131 /* clear buffer for next transaction */
1132 memset(c->axen_buf, 0, sc->axen_bufsz);
1133
1134 /* Setup new transfer. */
1135 usbd_setup_xfer(xfer, c, c->axen_buf, sc->axen_bufsz,
1136 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axen_rxeof);
1137 usbd_transfer(xfer);
1138
1139 DPRINTFN(10,("%s: %s: start rx\n",device_xname(sc->axen_dev),__func__));
1140 }
1141
1142 static int
1143 axen_csum_flags_rx(struct ifnet *ifp, uint32_t pkt_hdr)
1144 {
1145 int enabled_flags = ifp->if_csum_flags_rx;
1146 int csum_flags = 0;
1147 int l3_type, l4_type;
1148
1149 if (enabled_flags == 0)
1150 return 0;
1151
1152 l3_type = (pkt_hdr & AXEN_RXHDR_L3_TYPE_MASK) >>
1153 AXEN_RXHDR_L3_TYPE_OFFSET;
1154
1155 if (l3_type == AXEN_RXHDR_L3_TYPE_IPV4)
1156 csum_flags |= M_CSUM_IPv4;
1157
1158 l4_type = (pkt_hdr & AXEN_RXHDR_L4_TYPE_MASK) >>
1159 AXEN_RXHDR_L4_TYPE_OFFSET;
1160
1161 switch (l4_type) {
1162 case AXEN_RXHDR_L4_TYPE_TCP:
1163 if (l3_type == AXEN_RXHDR_L3_TYPE_IPV4)
1164 csum_flags |= M_CSUM_TCPv4;
1165 else
1166 csum_flags |= M_CSUM_TCPv6;
1167 break;
1168 case AXEN_RXHDR_L4_TYPE_UDP:
1169 if (l3_type == AXEN_RXHDR_L3_TYPE_IPV4)
1170 csum_flags |= M_CSUM_UDPv4;
1171 else
1172 csum_flags |= M_CSUM_UDPv6;
1173 break;
1174 default:
1175 break;
1176 }
1177
1178 csum_flags &= enabled_flags;
1179 if ((csum_flags & M_CSUM_IPv4) && (pkt_hdr & AXEN_RXHDR_L3CSUM_ERR))
1180 csum_flags |= M_CSUM_IPv4_BAD;
1181 if ((csum_flags & ~M_CSUM_IPv4) && (pkt_hdr & AXEN_RXHDR_L4CSUM_ERR))
1182 csum_flags |= M_CSUM_TCP_UDP_BAD;
1183
1184 return csum_flags;
1185 }
1186
1187 /*
1188 * A frame was downloaded to the chip. It's safe for us to clean up
1189 * the list buffers.
1190 */
1191 static void
1192 axen_txeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
1193 {
1194 struct axen_chain *c = (struct axen_chain *)priv;
1195 struct axen_softc *sc = c->axen_sc;
1196 struct ifnet *ifp = GET_IFP(sc);
1197 int s;
1198
1199 if (sc->axen_dying)
1200 return;
1201
1202 s = splnet();
1203
1204 if (status != USBD_NORMAL_COMPLETION) {
1205 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
1206 splx(s);
1207 return;
1208 }
1209 ifp->if_oerrors++;
1210 aprint_error_dev(sc->axen_dev, "usb error on tx: %s\n",
1211 usbd_errstr(status));
1212 if (status == USBD_STALLED)
1213 usbd_clear_endpoint_stall_async(sc->axen_ep[AXEN_ENDPT_TX]);
1214 splx(s);
1215 return;
1216 }
1217
1218 ifp->if_timer = 0;
1219 ifp->if_flags &= ~IFF_OACTIVE;
1220
1221 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1222 axen_start(ifp);
1223
1224 ifp->if_opackets++;
1225 splx(s);
1226 }
1227
1228 static void
1229 axen_tick(void *xsc)
1230 {
1231 struct axen_softc *sc = xsc;
1232
1233 if (sc == NULL)
1234 return;
1235
1236 DPRINTFN(0xff,("%s: %s: enter\n", device_xname(sc->axen_dev),__func__));
1237
1238 if (sc->axen_dying)
1239 return;
1240
1241 /* Perform periodic stuff in process context */
1242 usb_add_task(sc->axen_udev, &sc->axen_tick_task, USB_TASKQ_DRIVER);
1243 }
1244
1245 static void
1246 axen_tick_task(void *xsc)
1247 {
1248 int s;
1249 struct axen_softc *sc;
1250 struct ifnet *ifp;
1251 struct mii_data *mii;
1252
1253 sc = xsc;
1254
1255 if (sc == NULL)
1256 return;
1257
1258 if (sc->axen_dying)
1259 return;
1260
1261 ifp = GET_IFP(sc);
1262 mii = GET_MII(sc);
1263 if (mii == NULL)
1264 return;
1265
1266 s = splnet();
1267
1268 mii_tick(mii);
1269 if (sc->axen_link == 0 &&
1270 (mii->mii_media_status & IFM_ACTIVE) != 0 &&
1271 IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
1272 DPRINTF(("%s: %s: got link\n", device_xname(sc->axen_dev),
1273 __func__));
1274 sc->axen_link++;
1275 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1276 axen_start(ifp);
1277 }
1278
1279 callout_schedule(&sc->axen_stat_ch, hz);
1280
1281 splx(s);
1282 }
1283
1284 static int
1285 axen_encap(struct axen_softc *sc, struct mbuf *m, int idx)
1286 {
1287 struct ifnet *ifp = GET_IFP(sc);
1288 struct axen_chain *c;
1289 usbd_status err;
1290 struct axen_sframe_hdr hdr;
1291 int length, boundary;
1292
1293 c = &sc->axen_cdata.axen_tx_chain[idx];
1294
1295 boundary = (sc->axen_udev->ud_speed == USB_SPEED_HIGH) ? 512 : 64;
1296
1297 hdr.plen = htole32(m->m_pkthdr.len);
1298 hdr.gso = 0; /* disable segmentation offloading */
1299
1300 memcpy(c->axen_buf, &hdr, sizeof(hdr));
1301 length = sizeof(hdr);
1302
1303 m_copydata(m, 0, m->m_pkthdr.len, c->axen_buf + length);
1304 length += m->m_pkthdr.len;
1305
1306 if ((length % boundary) == 0) {
1307 hdr.plen = 0x0;
1308 hdr.gso |= 0x80008000; /* enable padding */
1309 memcpy(c->axen_buf + length, &hdr, sizeof(hdr));
1310 length += sizeof(hdr);
1311 }
1312
1313 usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, length,
1314 USBD_FORCE_SHORT_XFER, 10000, axen_txeof);
1315
1316 /* Transmit */
1317 err = usbd_transfer(c->axen_xfer);
1318 if (err != USBD_IN_PROGRESS) {
1319 axen_stop(ifp, 0);
1320 return EIO;
1321 }
1322
1323 sc->axen_cdata.axen_tx_cnt++;
1324
1325 return 0;
1326 }
1327
1328 static void
1329 axen_start(struct ifnet *ifp)
1330 {
1331 struct axen_softc *sc;
1332 struct mbuf *m;
1333
1334 sc = ifp->if_softc;
1335
1336 if (sc->axen_link == 0)
1337 return;
1338
1339 if ((ifp->if_flags & (IFF_OACTIVE|IFF_RUNNING)) != IFF_RUNNING)
1340 return;
1341
1342 IFQ_POLL(&ifp->if_snd, m);
1343 if (m == NULL)
1344 return;
1345
1346 if (axen_encap(sc, m, 0)) {
1347 ifp->if_flags |= IFF_OACTIVE;
1348 return;
1349 }
1350 IFQ_DEQUEUE(&ifp->if_snd, m);
1351
1352 /*
1353 * If there's a BPF listener, bounce a copy of this frame
1354 * to him.
1355 */
1356 bpf_mtap(ifp, m, BPF_D_OUT);
1357 m_freem(m);
1358
1359 ifp->if_flags |= IFF_OACTIVE;
1360
1361 /*
1362 * Set a timeout in case the chip goes out to lunch.
1363 */
1364 ifp->if_timer = 5;
1365 }
1366
1367 static int
1368 axen_init(struct ifnet *ifp)
1369 {
1370 struct axen_softc *sc = ifp->if_softc;
1371 struct axen_chain *c;
1372 usbd_status err;
1373 int i, s;
1374 uint16_t rxmode;
1375 uint16_t wval;
1376 uint8_t bval;
1377
1378 s = splnet();
1379
1380 if (ifp->if_flags & IFF_RUNNING)
1381 axen_stop(ifp, 0);
1382
1383 /*
1384 * Cancel pending I/O and free all RX/TX buffers.
1385 */
1386 axen_reset(sc);
1387
1388 /* XXX: ? */
1389 axen_lock_mii(sc);
1390 bval = 0x01;
1391 axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_UNK_28, &bval);
1392 axen_unlock_mii(sc);
1393
1394 /* Program promiscuous mode and multicast filters. */
1395 axen_iff(sc);
1396
1397 /* Enable receiver, set RX mode */
1398 axen_lock_mii(sc);
1399 axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MAC_RXCTL, &wval);
1400 rxmode = le16toh(wval);
1401 rxmode |= AXEN_RXCTL_START;
1402 wval = htole16(rxmode);
1403 axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval);
1404 axen_unlock_mii(sc);
1405
1406 /* Open RX and TX pipes. */
1407 err = usbd_open_pipe(sc->axen_iface, sc->axen_ed[AXEN_ENDPT_RX],
1408 USBD_EXCLUSIVE_USE, &sc->axen_ep[AXEN_ENDPT_RX]);
1409 if (err) {
1410 aprint_error_dev(sc->axen_dev, "open rx pipe failed: %s\n",
1411 usbd_errstr(err));
1412 splx(s);
1413 return EIO;
1414 }
1415
1416 err = usbd_open_pipe(sc->axen_iface, sc->axen_ed[AXEN_ENDPT_TX],
1417 USBD_EXCLUSIVE_USE, &sc->axen_ep[AXEN_ENDPT_TX]);
1418 if (err) {
1419 aprint_error_dev(sc->axen_dev, "open tx pipe failed: %s\n",
1420 usbd_errstr(err));
1421 splx(s);
1422 return EIO;
1423 }
1424
1425 /* Init RX ring. */
1426 if (axen_rx_list_init(sc)) {
1427 aprint_error_dev(sc->axen_dev, "rx list init failed\n");
1428 splx(s);
1429 return ENOBUFS;
1430 }
1431
1432 /* Init TX ring. */
1433 if (axen_tx_list_init(sc)) {
1434 aprint_error_dev(sc->axen_dev, "tx list init failed\n");
1435 splx(s);
1436 return ENOBUFS;
1437 }
1438
1439 /* Start up the receive pipe. */
1440 for (i = 0; i < AXEN_RX_LIST_CNT; i++) {
1441 c = &sc->axen_cdata.axen_rx_chain[i];
1442
1443 usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, sc->axen_bufsz,
1444 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axen_rxeof);
1445 usbd_transfer(c->axen_xfer);
1446 }
1447
1448 ifp->if_flags |= IFF_RUNNING;
1449 ifp->if_flags &= ~IFF_OACTIVE;
1450
1451 splx(s);
1452
1453 callout_schedule(&sc->axen_stat_ch, hz);
1454 return 0;
1455 }
1456
1457 static int
1458 axen_ioctl(struct ifnet *ifp, u_long cmd, void *data)
1459 {
1460 struct axen_softc *sc = ifp->if_softc;
1461 int s;
1462 int error = 0;
1463
1464 s = splnet();
1465
1466 switch (cmd) {
1467 case SIOCSIFFLAGS:
1468 if ((error = ifioctl_common(ifp, cmd, data)) != 0)
1469 break;
1470
1471 switch (ifp->if_flags & (IFF_UP | IFF_RUNNING)) {
1472 case IFF_RUNNING:
1473 axen_stop(ifp, 1);
1474 break;
1475 case IFF_UP:
1476 axen_init(ifp);
1477 break;
1478 case IFF_UP | IFF_RUNNING:
1479 if ((ifp->if_flags ^ sc->axen_if_flags) == IFF_PROMISC)
1480 axen_iff(sc);
1481 else
1482 axen_init(ifp);
1483 break;
1484 }
1485 sc->axen_if_flags = ifp->if_flags;
1486 break;
1487
1488 default:
1489 if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET)
1490 break;
1491
1492 error = 0;
1493 switch(cmd) {
1494 case SIOCADDMULTI:
1495 case SIOCDELMULTI:
1496 axen_iff(sc);
1497 break;
1498 case SIOCSIFCAP:
1499 axen_lock_mii(sc);
1500 axen_setcoe(sc);
1501 axen_unlock_mii(sc);
1502 break;
1503 default:
1504 break;
1505 }
1506 break;
1507 }
1508 splx(s);
1509
1510 return error;
1511 }
1512
1513 static void
1514 axen_watchdog(struct ifnet *ifp)
1515 {
1516 struct axen_softc *sc;
1517 struct axen_chain *c;
1518 usbd_status stat;
1519 int s;
1520
1521 sc = ifp->if_softc;
1522
1523 ifp->if_oerrors++;
1524 aprint_error_dev(sc->axen_dev, "watchdog timeout\n");
1525
1526 s = splusb();
1527 c = &sc->axen_cdata.axen_tx_chain[0];
1528 usbd_get_xfer_status(c->axen_xfer, NULL, NULL, NULL, &stat);
1529 axen_txeof(c->axen_xfer, c, stat);
1530
1531 if (!IFQ_IS_EMPTY(&ifp->if_snd))
1532 axen_start(ifp);
1533 splx(s);
1534 }
1535
1536 /*
1537 * Stop the adapter and free any mbufs allocated to the
1538 * RX and TX lists.
1539 */
1540 static void
1541 axen_stop(struct ifnet *ifp, int disable)
1542 {
1543 struct axen_softc *sc = ifp->if_softc;
1544 usbd_status err;
1545 int i;
1546
1547 axen_reset(sc);
1548
1549 ifp->if_timer = 0;
1550 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1551
1552 callout_stop(&sc->axen_stat_ch);
1553
1554 /* Stop transfers. */
1555 if (sc->axen_ep[AXEN_ENDPT_RX] != NULL) {
1556 err = usbd_abort_pipe(sc->axen_ep[AXEN_ENDPT_RX]);
1557 if (err) {
1558 aprint_error_dev(sc->axen_dev,
1559 "abort rx pipe failed: %s\n", usbd_errstr(err));
1560
1561 }
1562 }
1563
1564 if (sc->axen_ep[AXEN_ENDPT_TX] != NULL) {
1565 err = usbd_abort_pipe(sc->axen_ep[AXEN_ENDPT_TX]);
1566 if (err) {
1567 aprint_error_dev(sc->axen_dev,
1568 "abort tx pipe failed: %s\n", usbd_errstr(err));
1569 }
1570 }
1571
1572 if (sc->axen_ep[AXEN_ENDPT_INTR] != NULL) {
1573 err = usbd_abort_pipe(sc->axen_ep[AXEN_ENDPT_INTR]);
1574 if (err) {
1575 aprint_error_dev(sc->axen_dev,
1576 "abort intr pipe failed: %s\n", usbd_errstr(err));
1577 }
1578 }
1579
1580 /* Free RX resources. */
1581 for (i = 0; i < AXEN_RX_LIST_CNT; i++) {
1582 if (sc->axen_cdata.axen_rx_chain[i].axen_xfer != NULL) {
1583 usbd_destroy_xfer(sc->axen_cdata.axen_rx_chain[i].axen_xfer);
1584 sc->axen_cdata.axen_rx_chain[i].axen_xfer = NULL;
1585 }
1586 }
1587
1588 /* Free TX resources. */
1589 for (i = 0; i < AXEN_TX_LIST_CNT; i++) {
1590 if (sc->axen_cdata.axen_tx_chain[i].axen_xfer != NULL) {
1591 usbd_destroy_xfer(sc->axen_cdata.axen_tx_chain[i].axen_xfer);
1592 sc->axen_cdata.axen_tx_chain[i].axen_xfer = NULL;
1593 }
1594 }
1595
1596 /* Close pipes. */
1597 if (sc->axen_ep[AXEN_ENDPT_RX] != NULL) {
1598 err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_RX]);
1599 if (err) {
1600 aprint_error_dev(sc->axen_dev,
1601 "close rx pipe failed: %s\n", usbd_errstr(err));
1602 }
1603 sc->axen_ep[AXEN_ENDPT_RX] = NULL;
1604 }
1605
1606 if (sc->axen_ep[AXEN_ENDPT_TX] != NULL) {
1607 err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_TX]);
1608 if (err) {
1609 aprint_error_dev(sc->axen_dev,
1610 "close tx pipe failed: %s\n", usbd_errstr(err));
1611 }
1612 sc->axen_ep[AXEN_ENDPT_TX] = NULL;
1613 }
1614
1615 if (sc->axen_ep[AXEN_ENDPT_INTR] != NULL) {
1616 err = usbd_close_pipe(sc->axen_ep[AXEN_ENDPT_INTR]);
1617 if (err) {
1618 aprint_error_dev(sc->axen_dev,
1619 "close intr pipe failed: %s\n", usbd_errstr(err));
1620 }
1621 sc->axen_ep[AXEN_ENDPT_INTR] = NULL;
1622 }
1623
1624 sc->axen_link = 0;
1625 }
1626
1627 MODULE(MODULE_CLASS_DRIVER, if_axen, NULL);
1628
1629 #ifdef _MODULE
1630 #include "ioconf.c"
1631 #endif
1632
1633 static int
1634 if_axen_modcmd(modcmd_t cmd, void *aux)
1635 {
1636 int error = 0;
1637
1638 switch (cmd) {
1639 case MODULE_CMD_INIT:
1640 #ifdef _MODULE
1641 error = config_init_component(cfdriver_ioconf_axen,
1642 cfattach_ioconf_axen, cfdata_ioconf_axen);
1643 #endif
1644 return error;
1645 case MODULE_CMD_FINI:
1646 #ifdef _MODULE
1647 error = config_fini_component(cfdriver_ioconf_axen,
1648 cfattach_ioconf_axen, cfdata_ioconf_axen);
1649 #endif
1650 return error;
1651 default:
1652 return ENOTTY;
1653 }
1654 }
1655