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