Module Name: src Committed By: rin Date: Thu Jan 31 15:22:56 UTC 2019
Modified Files: src/sys/dev/usb: if_axen.c Log Message: Enable AXEN_RXCTL_START bit only when RX is ready. Otherwise, the adapter eventually falls into "no carrier" state while it is not running. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 src/sys/dev/usb/if_axen.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/if_axen.c diff -u src/sys/dev/usb/if_axen.c:1.20 src/sys/dev/usb/if_axen.c:1.21 --- src/sys/dev/usb/if_axen.c:1.20 Thu Jan 31 15:21:05 2019 +++ src/sys/dev/usb/if_axen.c Thu Jan 31 15:22:56 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_axen.c,v 1.20 2019/01/31 15:21:05 rin Exp $ */ +/* $NetBSD: if_axen.c,v 1.21 2019/01/31 15:22:56 rin Exp $ */ /* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */ /* @@ -23,7 +23,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.20 2019/01/31 15:21:05 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.21 2019/01/31 15:22:56 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -571,7 +571,6 @@ axen_ax88179_init(struct axen_softc *sc) /* Set RX control register */ ctl = AXEN_RXCTL_IPE | AXEN_RXCTL_DROPCRCERR | AXEN_RXCTL_AUTOB; ctl |= AXEN_RXCTL_ACPT_PHY_MCAST | AXEN_RXCTL_ACPT_ALL_MCAST; - ctl |= AXEN_RXCTL_START; wval = htole16(ctl); axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval); @@ -1535,9 +1534,19 @@ axen_stop(struct ifnet *ifp, int disable struct axen_softc *sc = ifp->if_softc; usbd_status err; int i; + uint16_t rxmode, wval; axen_reset(sc); + /* Disable receiver, set RX mode */ + axen_lock_mii(sc); + axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MAC_RXCTL, &wval); + rxmode = le16toh(wval); + rxmode &= ~AXEN_RXCTL_START; + wval = htole16(rxmode); + axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval); + axen_unlock_mii(sc); + ifp->if_timer = 0; ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);