Home | History | Annotate | Line # | Download | only in usb
usbnet.c revision 1.10
      1  1.10    mrg /*	$NetBSD: usbnet.c,v 1.10 2019/08/09 01:17:33 mrg Exp $	*/
      2   1.1    mrg 
      3   1.1    mrg /*
      4   1.1    mrg  * Copyright (c) 2019 Matthew R. Green
      5   1.1    mrg  * All rights reserved.
      6   1.1    mrg  *
      7   1.1    mrg  * Redistribution and use in source and binary forms, with or without
      8   1.1    mrg  * modification, are permitted provided that the following conditions
      9   1.1    mrg  * are met:
     10   1.1    mrg  * 1. Redistributions of source code must retain the above copyright
     11   1.1    mrg  *    notice, this list of conditions and the following disclaimer.
     12   1.1    mrg  * 2. Redistributions in binary form must reproduce the above copyright
     13   1.1    mrg  *    notice, this list of conditions and the following disclaimer in the
     14   1.1    mrg  *    documentation and/or other materials provided with the distribution.
     15   1.1    mrg  * 3. The name of the author may not be used to endorse or promote products
     16   1.1    mrg  *    derived from this software without specific prior written permission.
     17   1.1    mrg  *
     18   1.1    mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19   1.1    mrg  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20   1.1    mrg  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21   1.1    mrg  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22   1.1    mrg  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     23   1.1    mrg  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     24   1.1    mrg  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     25   1.1    mrg  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     26   1.1    mrg  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     27   1.1    mrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28   1.1    mrg  * SUCH DAMAGE.
     29   1.1    mrg  */
     30   1.1    mrg 
     31   1.1    mrg /*
     32   1.1    mrg  * Common code shared between USB ethernet drivers.
     33   1.1    mrg  */
     34   1.1    mrg 
     35   1.1    mrg #include <sys/cdefs.h>
     36  1.10    mrg __KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.10 2019/08/09 01:17:33 mrg Exp $");
     37   1.1    mrg 
     38   1.1    mrg #include <sys/param.h>
     39   1.1    mrg #include <sys/kernel.h>
     40   1.1    mrg #include <sys/kmem.h>
     41   1.1    mrg #include <sys/module.h>
     42   1.1    mrg 
     43   1.1    mrg #include <dev/usb/usbnet.h>
     44   1.4    mrg #include <dev/usb/usbhist.h>
     45   1.1    mrg 
     46   1.1    mrg static int usbnet_modcmd(modcmd_t, void *);
     47   1.1    mrg 
     48   1.2    mrg #ifdef USB_DEBUG
     49   1.2    mrg #ifndef USBNET_DEBUG
     50   1.2    mrg #define usbnetdebug 0
     51   1.2    mrg #else
     52   1.4    mrg static int usbnetdebug = 1;
     53   1.4    mrg 
     54   1.4    mrg int     sysctl_hw_usbnet_setup(SYSCTLFN_PROTO);
     55   1.2    mrg 
     56   1.2    mrg SYSCTL_SETUP(sysctl_hw_usbnet_setup, "sysctl hw.usbnet setup")
     57   1.2    mrg {
     58   1.2    mrg 	int err;
     59   1.2    mrg 	const struct sysctlnode *rnode;
     60   1.2    mrg 	const struct sysctlnode *cnode;
     61   1.2    mrg 
     62   1.2    mrg 	err = sysctl_createv(clog, 0, NULL, &rnode,
     63   1.2    mrg 	    CTLFLAG_PERMANENT, CTLTYPE_NODE, "usbnet",
     64   1.2    mrg 	    SYSCTL_DESCR("usbnet global controls"),
     65   1.2    mrg 	    NULL, 0, NULL, 0, CTL_HW, CTL_CREATE, CTL_EOL);
     66   1.2    mrg 
     67   1.2    mrg 	if (err)
     68   1.2    mrg 		goto fail;
     69   1.2    mrg 
     70   1.2    mrg 	/* control debugging printfs */
     71   1.2    mrg 	err = sysctl_createv(clog, 0, &rnode, &cnode,
     72   1.2    mrg 	    CTLFLAG_PERMANENT | CTLFLAG_READWRITE, CTLTYPE_INT,
     73   1.2    mrg 	    "debug", SYSCTL_DESCR("Enable debugging output"),
     74   1.2    mrg 	    NULL, 0, &usbnetdebug, sizeof(usbnetdebug), CTL_CREATE, CTL_EOL);
     75   1.2    mrg 	if (err)
     76   1.2    mrg 		goto fail;
     77   1.2    mrg 
     78   1.2    mrg 	return;
     79   1.2    mrg fail:
     80   1.2    mrg 	aprint_error("%s: sysctl_createv failed (err = %d)\n", __func__, err);
     81   1.2    mrg }
     82   1.2    mrg 
     83   1.2    mrg #endif /* USBNET_DEBUG */
     84   1.2    mrg #endif /* USB_DEBUG */
     85   1.2    mrg 
     86   1.2    mrg #define DPRINTF(FMT,A,B,C,D)	USBHIST_LOGN(usbnetdebug,1,FMT,A,B,C,D)
     87   1.2    mrg #define DPRINTFN(N,FMT,A,B,C,D)	USBHIST_LOGN(usbnetdebug,N,FMT,A,B,C,D)
     88   1.2    mrg #define USBNETHIST_FUNC()	USBHIST_FUNC()
     89   1.2    mrg #define USBNETHIST_CALLED(name)	USBHIST_CALLED(usbnetdebug)
     90   1.1    mrg 
     91  1.10    mrg /* Callback vectors. */
     92  1.10    mrg 
     93  1.10    mrg static void
     94  1.10    mrg uno_stop(struct usbnet *un, struct ifnet *ifp, int disable)
     95  1.10    mrg {
     96  1.10    mrg 	if (un->un_ops->uno_stop)
     97  1.10    mrg 		(*un->un_ops->uno_stop)(ifp, disable);
     98  1.10    mrg }
     99  1.10    mrg 
    100  1.10    mrg static int
    101  1.10    mrg uno_ioctl(struct usbnet *un, struct ifnet *ifp, u_long cmd, void *data)
    102  1.10    mrg {
    103  1.10    mrg 	if (un->un_ops->uno_ioctl)
    104  1.10    mrg 		return (*un->un_ops->uno_ioctl)(ifp, cmd, data);
    105  1.10    mrg 	return 0;
    106  1.10    mrg }
    107  1.10    mrg 
    108  1.10    mrg static int
    109  1.10    mrg uno_override_ioctl(struct usbnet *un, struct ifnet *ifp, u_long cmd, void *data)
    110  1.10    mrg {
    111  1.10    mrg 	return (*un->un_ops->uno_override_ioctl)(ifp, cmd, data);
    112  1.10    mrg }
    113  1.10    mrg 
    114  1.10    mrg static int
    115  1.10    mrg uno_init(struct usbnet *un, struct ifnet *ifp)
    116  1.10    mrg {
    117  1.10    mrg 	return (*un->un_ops->uno_init)(ifp);
    118  1.10    mrg }
    119  1.10    mrg 
    120  1.10    mrg static int
    121  1.10    mrg uno_read_reg(struct usbnet *un, int phy, int reg, uint16_t *val)
    122  1.10    mrg {
    123  1.10    mrg 	return (*un->un_ops->uno_read_reg)(un, phy, reg, val);
    124  1.10    mrg }
    125  1.10    mrg 
    126  1.10    mrg static int
    127  1.10    mrg uno_write_reg(struct usbnet *un, int phy, int reg, uint16_t val)
    128  1.10    mrg {
    129  1.10    mrg 	return (*un->un_ops->uno_write_reg)(un, phy, reg, val);
    130  1.10    mrg }
    131  1.10    mrg 
    132  1.10    mrg static void
    133  1.10    mrg uno_mii_statchg(struct usbnet *un, struct ifnet *ifp)
    134  1.10    mrg {
    135  1.10    mrg 	(*un->un_ops->uno_statchg)(ifp);
    136  1.10    mrg }
    137  1.10    mrg 
    138  1.10    mrg static unsigned
    139  1.10    mrg uno_tx_prepare(struct usbnet *un, struct mbuf *m, struct usbnet_chain *c)
    140  1.10    mrg {
    141  1.10    mrg 	return (*un->un_ops->uno_tx_prepare)(un, m, c);
    142  1.10    mrg }
    143  1.10    mrg 
    144  1.10    mrg static void
    145  1.10    mrg uno_rx_loop(struct usbnet *un, struct usbd_xfer *xfer,
    146  1.10    mrg 	    struct usbnet_chain *c, uint32_t total_len)
    147  1.10    mrg {
    148  1.10    mrg 	(*un->un_ops->uno_rx_loop)(un, xfer, c, total_len);
    149  1.10    mrg }
    150  1.10    mrg 
    151  1.10    mrg static void
    152  1.10    mrg uno_intr(struct usbnet *un, usbd_status status)
    153  1.10    mrg {
    154  1.10    mrg 	if (un->un_ops->uno_intr)
    155  1.10    mrg 		(*un->un_ops->uno_intr)(un, status);
    156  1.10    mrg }
    157  1.10    mrg 
    158   1.1    mrg /* Interrupt handling. */
    159   1.1    mrg 
    160   1.1    mrg static struct mbuf *
    161   1.1    mrg usbnet_newbuf(void)
    162   1.1    mrg {
    163   1.1    mrg 	struct mbuf *m;
    164   1.1    mrg 
    165   1.1    mrg 	MGETHDR(m, M_DONTWAIT, MT_DATA);
    166   1.1    mrg 	if (m == NULL)
    167   1.1    mrg 		return NULL;
    168   1.1    mrg 
    169   1.1    mrg 	MCLGET(m, M_DONTWAIT);
    170   1.1    mrg 	if (!(m->m_flags & M_EXT)) {
    171   1.1    mrg 		m_freem(m);
    172   1.1    mrg 		return NULL;
    173   1.1    mrg 	}
    174   1.1    mrg 
    175   1.1    mrg 	m->m_len = m->m_pkthdr.len = MCLBYTES;
    176   1.1    mrg 	m_adj(m, ETHER_ALIGN);
    177   1.1    mrg 
    178   1.1    mrg 	return m;
    179   1.1    mrg }
    180   1.1    mrg 
    181   1.1    mrg /*
    182   1.1    mrg  * usbnet_rxeof() is designed to be the done callback for rx completion.
    183   1.1    mrg  * it provides generic setup and finalisation, calls a different usbnet
    184   1.1    mrg  * rx_loop callback in the middle, which can use usbnet_enqueue() to
    185   1.5    mrg  * enqueue a packet for higher levels (or usbnet_input() if previously
    186   1.5    mrg  * using if_input() path.)
    187   1.1    mrg  */
    188   1.1    mrg void
    189   1.1    mrg usbnet_enqueue(struct usbnet * const un, uint8_t *buf, size_t buflen,
    190   1.5    mrg 	       int csum_flags, uint32_t csum_data, int mbuf_flags)
    191   1.1    mrg {
    192   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    193   1.1    mrg 	struct ifnet *ifp = &un->un_ec.ec_if;
    194   1.1    mrg 	struct mbuf *m;
    195   1.1    mrg 
    196   1.1    mrg 	KASSERT(mutex_owned(&un->un_rxlock));
    197   1.1    mrg 
    198   1.1    mrg 	m = usbnet_newbuf();
    199   1.1    mrg 	if (m == NULL) {
    200   1.1    mrg 		ifp->if_ierrors++;
    201   1.1    mrg 		return;
    202   1.1    mrg 	}
    203   1.1    mrg 
    204   1.1    mrg 	m_set_rcvif(m, ifp);
    205   1.1    mrg 	m->m_pkthdr.len = m->m_len = buflen;
    206   1.5    mrg 	m->m_pkthdr.csum_flags = csum_flags;
    207   1.5    mrg 	m->m_pkthdr.csum_data = csum_data;
    208   1.5    mrg 	m->m_flags |= mbuf_flags;
    209   1.1    mrg 	memcpy(mtod(m, char *), buf, buflen);
    210   1.1    mrg 
    211   1.1    mrg 	/* push the packet up */
    212   1.1    mrg 	if_percpuq_enqueue(ifp->if_percpuq, m);
    213   1.1    mrg }
    214   1.1    mrg 
    215   1.5    mrg void
    216   1.5    mrg usbnet_input(struct usbnet * const un, uint8_t *buf, size_t buflen)
    217   1.5    mrg {
    218   1.5    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    219   1.5    mrg 	struct ifnet * const ifp = usbnet_ifp(un);
    220   1.5    mrg 	struct mbuf *m;
    221   1.5    mrg 
    222   1.5    mrg 	KASSERT(mutex_owned(&un->un_rxlock));
    223   1.5    mrg 
    224   1.5    mrg 	m = usbnet_newbuf();
    225   1.5    mrg 	if (m == NULL) {
    226   1.5    mrg 		ifp->if_ierrors++;
    227   1.5    mrg 		return;
    228   1.5    mrg 	}
    229   1.5    mrg 
    230   1.5    mrg 	m_set_rcvif(m, ifp);
    231   1.5    mrg 	m->m_pkthdr.len = m->m_len = buflen;
    232   1.5    mrg 	memcpy(mtod(m, char *), buf, buflen);
    233   1.5    mrg 
    234   1.5    mrg 	/* push the packet up */
    235   1.5    mrg 	if_input(ifp, m);
    236   1.5    mrg }
    237   1.5    mrg 
    238   1.1    mrg /*
    239   1.1    mrg  * A frame has been uploaded: pass the resulting mbuf chain up to
    240   1.1    mrg  * the higher level protocols.
    241   1.1    mrg  */
    242   1.1    mrg static void
    243   1.4    mrg usbnet_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
    244   1.1    mrg {
    245   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    246   1.4    mrg 	struct usbnet_chain *c = priv;
    247   1.1    mrg 	struct usbnet * const un = c->unc_un;
    248  1.10    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    249   1.5    mrg 	struct ifnet * const ifp = usbnet_ifp(un);
    250   1.1    mrg 	uint32_t total_len;
    251   1.1    mrg 
    252   1.1    mrg 	mutex_enter(&un->un_rxlock);
    253   1.1    mrg 
    254   1.1    mrg 	if (un->un_dying || un->un_stopping ||
    255   1.1    mrg 	    status == USBD_INVAL || status == USBD_NOT_STARTED ||
    256   1.1    mrg 	    status == USBD_CANCELLED || !(ifp->if_flags & IFF_RUNNING))
    257   1.1    mrg 		goto out;
    258   1.1    mrg 
    259   1.1    mrg 	if (status != USBD_NORMAL_COMPLETION) {
    260   1.1    mrg 		if (usbd_ratecheck(&un->un_rx_notice))
    261   1.1    mrg 			aprint_error_dev(un->un_dev, "usb errors on rx: %s\n",
    262   1.1    mrg 			    usbd_errstr(status));
    263   1.1    mrg 		if (status == USBD_STALLED)
    264   1.1    mrg 			usbd_clear_endpoint_stall_async(un->un_ep[USBNET_ENDPT_RX]);
    265   1.1    mrg 		goto done;
    266   1.1    mrg 	}
    267   1.1    mrg 
    268   1.1    mrg 	usbd_get_xfer_status(xfer, NULL, NULL, &total_len, NULL);
    269   1.1    mrg 
    270  1.10    mrg 	if (total_len > cd->uncd_rx_bufsz) {
    271   1.1    mrg 		aprint_error_dev(un->un_dev,
    272   1.1    mrg 		    "rxeof: too large transfer (%u > %u)\n",
    273  1.10    mrg 		    total_len, cd->uncd_rx_bufsz);
    274   1.1    mrg 		goto done;
    275   1.1    mrg 	}
    276   1.1    mrg 
    277  1.10    mrg 	uno_rx_loop(un, xfer, c, total_len);
    278   1.1    mrg 	KASSERT(mutex_owned(&un->un_rxlock));
    279   1.1    mrg 
    280   1.1    mrg done:
    281   1.1    mrg 	if (un->un_dying || un->un_stopping)
    282   1.1    mrg 		goto out;
    283   1.1    mrg 
    284   1.1    mrg 	mutex_exit(&un->un_rxlock);
    285   1.1    mrg 
    286   1.1    mrg 	/* Setup new transfer. */
    287  1.10    mrg 	usbd_setup_xfer(xfer, c, c->unc_buf, cd->uncd_rx_bufsz,
    288  1.10    mrg 	    cd->uncd_rx_xfer_flags, USBD_NO_TIMEOUT, usbnet_rxeof);
    289   1.1    mrg 	usbd_transfer(xfer);
    290   1.1    mrg 	return;
    291   1.1    mrg 
    292   1.1    mrg out:
    293   1.1    mrg 	mutex_exit(&un->un_rxlock);
    294   1.1    mrg }
    295   1.1    mrg 
    296   1.1    mrg static void
    297   1.4    mrg usbnet_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
    298   1.1    mrg {
    299   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    300   1.4    mrg 	struct usbnet_chain *c = priv;
    301   1.1    mrg 	struct usbnet * const un = c->unc_un;
    302   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    303   1.1    mrg 	struct ifnet * const ifp = usbnet_ifp(un);
    304   1.1    mrg 
    305   1.1    mrg 	mutex_enter(&un->un_txlock);
    306   1.1    mrg 	if (un->un_stopping || un->un_dying) {
    307   1.1    mrg 		mutex_exit(&un->un_txlock);
    308   1.1    mrg 		return;
    309   1.1    mrg 	}
    310   1.1    mrg 
    311   1.1    mrg 	KASSERT(cd->uncd_tx_cnt > 0);
    312   1.1    mrg 	cd->uncd_tx_cnt--;
    313   1.1    mrg 
    314   1.1    mrg 	un->un_timer = 0;
    315   1.1    mrg 
    316   1.1    mrg 	switch (status) {
    317   1.1    mrg 	case USBD_NOT_STARTED:
    318   1.1    mrg 	case USBD_CANCELLED:
    319   1.1    mrg 		break;
    320   1.1    mrg 
    321   1.1    mrg 	case USBD_NORMAL_COMPLETION:
    322   1.1    mrg 		ifp->if_opackets++;
    323   1.1    mrg 		break;
    324   1.1    mrg 
    325   1.1    mrg 	default:
    326   1.1    mrg 
    327   1.1    mrg 		ifp->if_oerrors++;
    328   1.1    mrg 		if (usbd_ratecheck(&un->un_tx_notice))
    329   1.1    mrg 			aprint_error_dev(un->un_dev, "usb error on tx: %s\n",
    330   1.1    mrg 			    usbd_errstr(status));
    331   1.1    mrg 		if (status == USBD_STALLED)
    332   1.1    mrg 			usbd_clear_endpoint_stall_async(un->un_ep[USBNET_ENDPT_TX]);
    333   1.1    mrg 		break;
    334   1.1    mrg 	}
    335   1.1    mrg 
    336   1.1    mrg 	mutex_exit(&un->un_txlock);
    337   1.1    mrg 
    338   1.1    mrg 	if (status == USBD_NORMAL_COMPLETION && !IFQ_IS_EMPTY(&ifp->if_snd))
    339   1.1    mrg 		(*ifp->if_start)(ifp);
    340   1.1    mrg }
    341   1.1    mrg 
    342   1.1    mrg static void
    343   1.4    mrg usbnet_intr(struct usbd_xfer *xfer, void *priv, usbd_status status)
    344   1.4    mrg {
    345   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    346   1.4    mrg 	struct usbnet		*un = priv;
    347   1.4    mrg 	struct ifnet		*ifp = usbnet_ifp(un);
    348   1.4    mrg 
    349   1.4    mrg 	if (un->un_dying || un->un_stopping ||
    350   1.4    mrg 	    status == USBD_INVAL || status == USBD_NOT_STARTED ||
    351   1.4    mrg 	    status == USBD_CANCELLED || !(ifp->if_flags & IFF_RUNNING))
    352   1.4    mrg 		return;
    353   1.4    mrg 
    354   1.4    mrg 	if (status != USBD_NORMAL_COMPLETION) {
    355   1.4    mrg 		if (usbd_ratecheck(&un->un_intr_notice)) {
    356   1.4    mrg 			aprint_error_dev(un->un_dev, "usb error on intr: %s\n",
    357   1.4    mrg 			    usbd_errstr(status));
    358   1.4    mrg 		}
    359   1.4    mrg 		if (status == USBD_STALLED)
    360   1.4    mrg 			usbd_clear_endpoint_stall_async(un->un_ep[USBNET_ENDPT_INTR]);
    361   1.4    mrg 		return;
    362   1.4    mrg 	}
    363   1.4    mrg 
    364  1.10    mrg 	uno_intr(un, status);
    365   1.4    mrg }
    366   1.4    mrg 
    367   1.4    mrg static void
    368   1.1    mrg usbnet_start_locked(struct ifnet *ifp)
    369   1.1    mrg {
    370   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    371   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    372   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    373   1.1    mrg 	struct mbuf *m;
    374   1.1    mrg 	unsigned length;
    375   1.1    mrg 	int idx;
    376   1.1    mrg 
    377   1.1    mrg 	KASSERT(mutex_owned(&un->un_txlock));
    378   1.1    mrg 	KASSERT(cd->uncd_tx_cnt <= cd->uncd_tx_list_cnt);
    379   1.1    mrg 
    380   1.1    mrg 	if (!un->un_link || (ifp->if_flags & IFF_RUNNING) == 0)
    381   1.1    mrg 		return;
    382   1.1    mrg 
    383   1.1    mrg 	idx = cd->uncd_tx_prod;
    384   1.1    mrg 	while (cd->uncd_tx_cnt < cd->uncd_tx_list_cnt) {
    385   1.1    mrg 		IFQ_POLL(&ifp->if_snd, m);
    386   1.1    mrg 		if (m == NULL)
    387   1.1    mrg 			break;
    388   1.1    mrg 
    389  1.10    mrg 		struct usbnet_chain *c = &cd->uncd_tx_chain[idx];
    390   1.1    mrg 
    391  1.10    mrg 		length = uno_tx_prepare(un, m, c);
    392   1.1    mrg 		if (length == 0) {
    393   1.1    mrg 			ifp->if_oerrors++;
    394   1.1    mrg 			break;
    395   1.1    mrg 		}
    396   1.1    mrg 
    397   1.1    mrg 		if (__predict_false(c->unc_xfer == NULL)) {
    398   1.1    mrg 			ifp->if_oerrors++;
    399   1.1    mrg 			break;
    400   1.1    mrg 		}
    401   1.1    mrg 
    402   1.1    mrg 		usbd_setup_xfer(c->unc_xfer, c, c->unc_buf, length,
    403  1.10    mrg 		    cd->uncd_tx_xfer_flags, 10000, usbnet_txeof);
    404   1.1    mrg 
    405   1.1    mrg 		/* Transmit */
    406   1.1    mrg 		usbd_status err = usbd_transfer(c->unc_xfer);
    407   1.1    mrg 		if (err != USBD_IN_PROGRESS) {
    408   1.1    mrg 			ifp->if_oerrors++;
    409   1.1    mrg 			break;
    410   1.1    mrg 		}
    411   1.1    mrg 
    412   1.1    mrg 		IFQ_DEQUEUE(&ifp->if_snd, m);
    413   1.1    mrg 
    414   1.1    mrg 		/*
    415   1.1    mrg 		 * If there's a BPF listener, bounce a copy of this frame
    416   1.1    mrg 		 * to him.
    417   1.1    mrg 		 */
    418   1.1    mrg 		bpf_mtap(ifp, m, BPF_D_OUT);
    419   1.1    mrg 		m_freem(m);
    420   1.1    mrg 
    421   1.1    mrg 		idx = (idx + 1) % cd->uncd_tx_list_cnt;
    422   1.1    mrg 		cd->uncd_tx_cnt++;
    423   1.1    mrg 	}
    424   1.1    mrg 	cd->uncd_tx_prod = idx;
    425   1.1    mrg 
    426   1.1    mrg 	/*
    427   1.1    mrg 	 * Set a timeout in case the chip goes out to lunch.
    428   1.1    mrg 	 */
    429   1.1    mrg 	un->un_timer = 5;
    430   1.1    mrg }
    431   1.1    mrg 
    432   1.1    mrg static void
    433   1.1    mrg usbnet_start(struct ifnet *ifp)
    434   1.1    mrg {
    435   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    436   1.1    mrg 
    437   1.1    mrg 	mutex_enter(&un->un_txlock);
    438   1.1    mrg 	if (!un->un_stopping)
    439   1.1    mrg 		usbnet_start_locked(ifp);
    440   1.1    mrg 	mutex_exit(&un->un_txlock);
    441   1.1    mrg }
    442   1.1    mrg 
    443   1.1    mrg /*
    444   1.1    mrg  * Chain management.
    445   1.1    mrg  *
    446   1.1    mrg  * RX and TX are identical. Keep them that way.
    447   1.1    mrg  */
    448   1.1    mrg 
    449   1.1    mrg /* Start of common RX functions */
    450   1.1    mrg 
    451   1.1    mrg static size_t
    452   1.1    mrg usbnet_rx_list_size(struct usbnet_cdata *cd)
    453   1.1    mrg {
    454   1.1    mrg 	return sizeof(*cd->uncd_rx_chain) * cd->uncd_rx_list_cnt;
    455   1.1    mrg }
    456   1.1    mrg 
    457   1.1    mrg static void
    458  1.10    mrg usbnet_rx_list_alloc(struct usbnet *un)
    459   1.1    mrg {
    460   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    461   1.1    mrg 
    462   1.1    mrg 	cd->uncd_rx_chain = kmem_zalloc(usbnet_rx_list_size(cd), KM_SLEEP);
    463   1.1    mrg }
    464   1.1    mrg 
    465   1.1    mrg static void
    466   1.1    mrg usbnet_rx_list_free(struct usbnet *un)
    467   1.1    mrg {
    468   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    469   1.1    mrg 
    470   1.1    mrg 	if (cd->uncd_rx_chain) {
    471   1.1    mrg 		kmem_free(cd->uncd_rx_chain, usbnet_rx_list_size(cd));
    472   1.1    mrg 		cd->uncd_rx_chain = NULL;
    473   1.1    mrg 	}
    474   1.1    mrg }
    475   1.1    mrg 
    476   1.1    mrg static int
    477  1.10    mrg usbnet_rx_list_init(struct usbnet *un)
    478   1.1    mrg {
    479   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    480   1.1    mrg 
    481   1.1    mrg 	for (size_t i = 0; i < cd->uncd_rx_list_cnt; i++) {
    482   1.1    mrg 		struct usbnet_chain *c = &cd->uncd_rx_chain[i];
    483   1.1    mrg 
    484   1.1    mrg 		c->unc_un = un;
    485   1.1    mrg 		if (c->unc_xfer == NULL) {
    486   1.1    mrg 			int err = usbd_create_xfer(un->un_ep[USBNET_ENDPT_RX],
    487  1.10    mrg 			    cd->uncd_rx_bufsz, cd->uncd_rx_xfer_flags, 0,
    488  1.10    mrg 			    &c->unc_xfer);
    489   1.1    mrg 			if (err)
    490   1.1    mrg 				return err;
    491   1.1    mrg 			c->unc_buf = usbd_get_buffer(c->unc_xfer);
    492   1.1    mrg 		}
    493   1.1    mrg 	}
    494   1.1    mrg 
    495   1.1    mrg 	return 0;
    496   1.1    mrg }
    497   1.1    mrg 
    498   1.1    mrg static void
    499   1.1    mrg usbnet_rx_list_fini(struct usbnet *un)
    500   1.1    mrg {
    501   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    502   1.1    mrg 
    503   1.1    mrg 	for (size_t i = 0; i < cd->uncd_rx_list_cnt; i++) {
    504   1.1    mrg 		struct usbnet_chain *c = &cd->uncd_rx_chain[i];
    505   1.1    mrg 
    506   1.1    mrg 		if (c->unc_xfer != NULL) {
    507   1.1    mrg 			usbd_destroy_xfer(c->unc_xfer);
    508   1.1    mrg 			c->unc_xfer = NULL;
    509   1.1    mrg 			c->unc_buf = NULL;
    510   1.1    mrg 		}
    511   1.1    mrg 	}
    512   1.1    mrg }
    513   1.1    mrg 
    514   1.1    mrg /* End of common RX functions */
    515   1.1    mrg 
    516   1.1    mrg static void
    517   1.1    mrg usbnet_rx_start_pipes(struct usbnet *un, usbd_callback cb)
    518   1.1    mrg {
    519   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    520   1.1    mrg 
    521   1.1    mrg 	mutex_enter(&un->un_rxlock);
    522   1.1    mrg 	mutex_enter(&un->un_txlock);
    523   1.1    mrg 	un->un_stopping = false;
    524   1.1    mrg 
    525   1.1    mrg 	for (size_t i = 0; i < cd->uncd_rx_list_cnt; i++) {
    526   1.1    mrg 		struct usbnet_chain *c = &cd->uncd_rx_chain[i];
    527   1.1    mrg 
    528   1.1    mrg 		usbd_setup_xfer(c->unc_xfer, c, c->unc_buf, cd->uncd_rx_bufsz,
    529  1.10    mrg 		    cd->uncd_rx_xfer_flags, USBD_NO_TIMEOUT, cb);
    530   1.1    mrg 		usbd_transfer(c->unc_xfer);
    531   1.3  skrll 	}
    532   1.1    mrg 
    533   1.1    mrg 	mutex_exit(&un->un_txlock);
    534   1.1    mrg 	mutex_exit(&un->un_rxlock);
    535   1.1    mrg }
    536   1.1    mrg 
    537   1.1    mrg /* Start of common TX functions */
    538   1.1    mrg 
    539   1.1    mrg static size_t
    540   1.1    mrg usbnet_tx_list_size(struct usbnet_cdata *cd)
    541   1.1    mrg {
    542   1.1    mrg 	return sizeof(*cd->uncd_tx_chain) * cd->uncd_tx_list_cnt;
    543   1.1    mrg }
    544   1.1    mrg 
    545   1.1    mrg static void
    546  1.10    mrg usbnet_tx_list_alloc(struct usbnet *un)
    547   1.1    mrg {
    548   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    549   1.1    mrg 
    550   1.1    mrg 	cd->uncd_tx_chain = kmem_zalloc(usbnet_tx_list_size(cd), KM_SLEEP);
    551   1.1    mrg }
    552   1.1    mrg 
    553   1.1    mrg static void
    554   1.1    mrg usbnet_tx_list_free(struct usbnet *un)
    555   1.1    mrg {
    556   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    557   1.1    mrg 
    558   1.1    mrg 	if (cd->uncd_tx_chain) {
    559   1.1    mrg 		kmem_free(cd->uncd_tx_chain, usbnet_tx_list_size(cd));
    560   1.1    mrg 		cd->uncd_tx_chain = NULL;
    561   1.1    mrg 	}
    562   1.1    mrg }
    563   1.1    mrg 
    564   1.1    mrg static int
    565  1.10    mrg usbnet_tx_list_init(struct usbnet *un)
    566   1.1    mrg {
    567   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    568   1.1    mrg 
    569   1.1    mrg 	for (size_t i = 0; i < cd->uncd_tx_list_cnt; i++) {
    570   1.1    mrg 		struct usbnet_chain *c = &cd->uncd_tx_chain[i];
    571   1.1    mrg 
    572   1.1    mrg 		c->unc_un = un;
    573   1.1    mrg 		if (c->unc_xfer == NULL) {
    574   1.1    mrg 			int err = usbd_create_xfer(un->un_ep[USBNET_ENDPT_TX],
    575  1.10    mrg 			    cd->uncd_tx_bufsz, cd->uncd_tx_xfer_flags, 0,
    576  1.10    mrg 			    &c->unc_xfer);
    577   1.1    mrg 			if (err)
    578   1.1    mrg 				return err;
    579   1.1    mrg 			c->unc_buf = usbd_get_buffer(c->unc_xfer);
    580   1.1    mrg 		}
    581   1.1    mrg 	}
    582   1.1    mrg 
    583   1.1    mrg 	return 0;
    584   1.1    mrg }
    585   1.1    mrg 
    586   1.1    mrg static void
    587   1.1    mrg usbnet_tx_list_fini(struct usbnet *un)
    588   1.1    mrg {
    589   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    590   1.1    mrg 
    591   1.1    mrg 	for (size_t i = 0; i < cd->uncd_tx_list_cnt; i++) {
    592   1.1    mrg 		struct usbnet_chain *c = &cd->uncd_tx_chain[i];
    593   1.1    mrg 
    594   1.1    mrg 		if (c->unc_xfer != NULL) {
    595   1.1    mrg 			usbd_destroy_xfer(c->unc_xfer);
    596   1.1    mrg 			c->unc_xfer = NULL;
    597   1.1    mrg 			c->unc_buf = NULL;
    598   1.1    mrg 		}
    599   1.1    mrg 	}
    600   1.1    mrg }
    601   1.1    mrg 
    602   1.1    mrg /* End of common TX functions */
    603   1.1    mrg 
    604   1.1    mrg /* Endpoint pipe management. */
    605   1.1    mrg 
    606   1.1    mrg static void
    607   1.1    mrg usbnet_ep_close_pipes(struct usbnet *un)
    608   1.1    mrg {
    609   1.1    mrg 	for (size_t i = 0; i < __arraycount(un->un_ep); i++) {
    610   1.1    mrg 		if (un->un_ep[i] == NULL)
    611   1.1    mrg 			continue;
    612   1.1    mrg 		usbd_status err = usbd_close_pipe(un->un_ep[i]);
    613   1.1    mrg 		if (err)
    614   1.1    mrg 			aprint_error_dev(un->un_dev, "close pipe %zu: %s\n", i,
    615   1.1    mrg 			    usbd_errstr(err));
    616   1.1    mrg 		un->un_ep[i] = NULL;
    617   1.1    mrg 	}
    618   1.1    mrg }
    619   1.1    mrg 
    620   1.1    mrg static usbd_status
    621   1.1    mrg usbnet_ep_open_pipes(struct usbnet *un)
    622   1.1    mrg {
    623   1.1    mrg 	for (size_t i = 0; i < __arraycount(un->un_ep); i++) {
    624   1.4    mrg 		usbd_status err;
    625   1.4    mrg 
    626   1.1    mrg 		if (un->un_ed[i] == 0)
    627   1.1    mrg 			continue;
    628   1.4    mrg 
    629   1.4    mrg 		if (i == USBNET_ENDPT_INTR && un->un_intr_buf) {
    630   1.4    mrg 			err = usbd_open_pipe_intr(un->un_iface, un->un_ed[i],
    631   1.4    mrg 			    USBD_EXCLUSIVE_USE | USBD_MPSAFE, &un->un_ep[i], un,
    632   1.4    mrg 			    un->un_intr_buf, un->un_intr_bufsz, usbnet_intr,
    633   1.4    mrg 			    un->un_intr_interval);
    634   1.4    mrg 		} else {
    635   1.4    mrg 			err = usbd_open_pipe(un->un_iface, un->un_ed[i],
    636   1.4    mrg 			    USBD_EXCLUSIVE_USE | USBD_MPSAFE, &un->un_ep[i]);
    637   1.4    mrg 		}
    638   1.1    mrg 		if (err) {
    639   1.1    mrg 			usbnet_ep_close_pipes(un);
    640   1.1    mrg 			return err;
    641   1.1    mrg 		}
    642   1.1    mrg 	}
    643   1.1    mrg 
    644   1.1    mrg 	return USBD_NORMAL_COMPLETION;
    645   1.1    mrg }
    646   1.1    mrg 
    647   1.1    mrg static usbd_status
    648   1.1    mrg usbnet_ep_stop_pipes(struct usbnet *un)
    649   1.1    mrg {
    650   1.1    mrg 	for (size_t i = 0; i < __arraycount(un->un_ep); i++) {
    651   1.1    mrg 		if (un->un_ep[i] == NULL)
    652   1.1    mrg 			continue;
    653   1.1    mrg 		usbd_status err = usbd_abort_pipe(un->un_ep[i]);
    654   1.1    mrg 		if (err)
    655   1.1    mrg 			return err;
    656   1.1    mrg 	}
    657   1.1    mrg 
    658   1.1    mrg 	return USBD_NORMAL_COMPLETION;
    659   1.1    mrg }
    660   1.1    mrg 
    661   1.1    mrg int
    662  1.10    mrg usbnet_init_rx_tx(struct usbnet * const un)
    663   1.1    mrg {
    664   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    665   1.1    mrg 	struct ifnet * const ifp = usbnet_ifp(un);
    666   1.1    mrg 	usbd_status err;
    667   1.4    mrg 	int error = 0;
    668   1.4    mrg 
    669   1.4    mrg 	usbnet_isowned(un);
    670   1.4    mrg 
    671   1.4    mrg 	if (un->un_dying) {
    672   1.4    mrg 		return EIO;
    673   1.4    mrg 	}
    674   1.4    mrg 	un->un_refcnt++;
    675   1.1    mrg 
    676   1.1    mrg 	/* Open RX and TX pipes. */
    677   1.1    mrg 	err = usbnet_ep_open_pipes(un);
    678   1.1    mrg 	if (err) {
    679   1.1    mrg 		aprint_error_dev(un->un_dev, "open rx/tx pipes failed: %s\n",
    680   1.1    mrg 		    usbd_errstr(err));
    681   1.4    mrg 		error = EIO;
    682   1.4    mrg 		goto out;
    683   1.1    mrg 	}
    684   1.1    mrg 
    685   1.1    mrg 	/* Init RX ring. */
    686  1.10    mrg 	if (usbnet_rx_list_init(un)) {
    687   1.1    mrg 		aprint_error_dev(un->un_dev, "rx list init failed\n");
    688   1.4    mrg 		error = ENOBUFS;
    689   1.4    mrg 		goto out;
    690   1.1    mrg 	}
    691   1.1    mrg 
    692   1.1    mrg 	/* Init TX ring. */
    693  1.10    mrg 	if (usbnet_tx_list_init(un)) {
    694   1.1    mrg 		aprint_error_dev(un->un_dev, "tx list init failed\n");
    695   1.4    mrg 		error = ENOBUFS;
    696   1.4    mrg 		goto out;
    697   1.1    mrg 	}
    698   1.1    mrg 
    699   1.1    mrg 	/* Start up the receive pipe(s). */
    700   1.1    mrg 	usbnet_rx_start_pipes(un, usbnet_rxeof);
    701   1.1    mrg 
    702   1.1    mrg 	/* Indicate we are up and running. */
    703   1.8    mrg 	KASSERT(ifp->if_softc == NULL || IFNET_LOCKED(ifp));
    704   1.1    mrg 	ifp->if_flags |= IFF_RUNNING;
    705   1.1    mrg 
    706   1.1    mrg 	callout_schedule(&un->un_stat_ch, hz);
    707   1.1    mrg 
    708   1.4    mrg out:
    709   1.4    mrg 	if (error) {
    710   1.4    mrg 		usbnet_rx_list_fini(un);
    711   1.4    mrg 		usbnet_tx_list_fini(un);
    712   1.4    mrg 		usbnet_ep_close_pipes(un);
    713   1.4    mrg 	}
    714   1.4    mrg 	if (--un->un_refcnt < 0)
    715   1.4    mrg 		cv_broadcast(&un->un_detachcv);
    716   1.4    mrg 
    717   1.4    mrg 	usbnet_isowned(un);
    718   1.1    mrg 
    719   1.4    mrg 	return error;
    720   1.1    mrg }
    721   1.1    mrg 
    722   1.1    mrg /* MII management. */
    723   1.1    mrg 
    724   1.1    mrg /*
    725   1.1    mrg  * Access functions for MII.  Take the MII lock to call access MII regs.
    726   1.1    mrg  * Two forms: usbnet (softc) lock currently held or not.
    727   1.1    mrg  */
    728   1.1    mrg void
    729   1.1    mrg usbnet_lock_mii(struct usbnet *un)
    730   1.1    mrg {
    731   1.1    mrg 
    732   1.1    mrg 	mutex_enter(&un->un_lock);
    733   1.1    mrg 	un->un_refcnt++;
    734   1.1    mrg 	mutex_exit(&un->un_lock);
    735   1.1    mrg 
    736   1.1    mrg 	mutex_enter(&un->un_miilock);
    737   1.1    mrg }
    738   1.1    mrg 
    739   1.1    mrg void
    740   1.1    mrg usbnet_lock_mii_un_locked(struct usbnet *un)
    741   1.1    mrg {
    742   1.1    mrg 	KASSERT(mutex_owned(&un->un_lock));
    743   1.1    mrg 
    744   1.1    mrg 	un->un_refcnt++;
    745   1.1    mrg 	mutex_enter(&un->un_miilock);
    746   1.1    mrg }
    747   1.1    mrg 
    748   1.1    mrg void
    749   1.1    mrg usbnet_unlock_mii(struct usbnet *un)
    750   1.1    mrg {
    751   1.1    mrg 
    752   1.1    mrg 	mutex_exit(&un->un_miilock);
    753   1.1    mrg 	mutex_enter(&un->un_lock);
    754   1.1    mrg 	if (--un->un_refcnt < 0)
    755   1.1    mrg 		cv_broadcast(&un->un_detachcv);
    756   1.1    mrg 	mutex_exit(&un->un_lock);
    757   1.1    mrg }
    758   1.1    mrg 
    759   1.1    mrg void
    760   1.1    mrg usbnet_unlock_mii_un_locked(struct usbnet *un)
    761   1.1    mrg {
    762   1.1    mrg 	KASSERT(mutex_owned(&un->un_lock));
    763   1.1    mrg 
    764   1.1    mrg 	mutex_exit(&un->un_miilock);
    765   1.1    mrg 	if (--un->un_refcnt < 0)
    766   1.1    mrg 		cv_broadcast(&un->un_detachcv);
    767   1.1    mrg }
    768   1.1    mrg 
    769   1.1    mrg int
    770  1.10    mrg usbnet_mii_readreg(device_t dev, int phy, int reg, uint16_t *val)
    771   1.1    mrg {
    772   1.1    mrg 	struct usbnet * const un = device_private(dev);
    773   1.1    mrg 	usbd_status err;
    774   1.1    mrg 
    775   1.1    mrg 	mutex_enter(&un->un_lock);
    776   1.1    mrg 	if (un->un_dying || un->un_phyno != phy) {
    777   1.1    mrg 		mutex_exit(&un->un_lock);
    778   1.1    mrg 		return EIO;
    779   1.1    mrg 	}
    780   1.1    mrg 	mutex_exit(&un->un_lock);
    781   1.1    mrg 
    782   1.1    mrg 	usbnet_lock_mii(un);
    783  1.10    mrg 	err = uno_read_reg(un, phy, reg, val);
    784   1.1    mrg 	usbnet_unlock_mii(un);
    785   1.1    mrg 
    786   1.1    mrg 	if (err) {
    787   1.1    mrg 		aprint_error_dev(un->un_dev, "read PHY failed: %d\n", err);
    788   1.1    mrg 		return EIO;
    789   1.1    mrg 	}
    790   1.1    mrg 
    791   1.1    mrg 	return 0;
    792   1.1    mrg }
    793   1.1    mrg 
    794   1.1    mrg int
    795  1.10    mrg usbnet_mii_writereg(device_t dev, int phy, int reg, uint16_t val)
    796   1.1    mrg {
    797   1.1    mrg 	struct usbnet * const un = device_private(dev);
    798   1.1    mrg 	usbd_status err;
    799   1.1    mrg 
    800   1.1    mrg 	mutex_enter(&un->un_lock);
    801   1.1    mrg 	if (un->un_dying || un->un_phyno != phy) {
    802   1.1    mrg 		mutex_exit(&un->un_lock);
    803   1.1    mrg 		return EIO;
    804   1.1    mrg 	}
    805   1.1    mrg 	mutex_exit(&un->un_lock);
    806   1.1    mrg 
    807   1.1    mrg 	usbnet_lock_mii(un);
    808  1.10    mrg 	err = uno_write_reg(un, phy, reg, val);
    809   1.1    mrg 	usbnet_unlock_mii(un);
    810   1.1    mrg 
    811   1.1    mrg 	if (err) {
    812   1.1    mrg 		aprint_error_dev(un->un_dev, "write PHY failed: %d\n", err);
    813   1.1    mrg 		return EIO;
    814   1.1    mrg 	}
    815   1.1    mrg 
    816   1.1    mrg 	return 0;
    817   1.1    mrg }
    818   1.1    mrg 
    819   1.1    mrg void
    820  1.10    mrg usbnet_mii_statchg(struct ifnet *ifp)
    821   1.1    mrg {
    822   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    823   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    824   1.1    mrg 
    825  1.10    mrg 	uno_mii_statchg(un, ifp);
    826   1.1    mrg }
    827   1.1    mrg 
    828   1.1    mrg static int
    829   1.1    mrg usbnet_media_upd(struct ifnet *ifp)
    830   1.1    mrg {
    831   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    832   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    833   1.1    mrg 	struct mii_data * const mii = usbnet_mii(un);
    834   1.1    mrg 
    835   1.1    mrg 	if (un->un_dying)
    836   1.1    mrg 		return EIO;
    837   1.1    mrg 
    838   1.1    mrg 	un->un_link = false;
    839   1.1    mrg 
    840   1.1    mrg 	if (mii->mii_instance) {
    841   1.1    mrg 		struct mii_softc *miisc;
    842   1.1    mrg 
    843   1.1    mrg 		LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
    844   1.1    mrg 			mii_phy_reset(miisc);
    845   1.1    mrg 	}
    846   1.1    mrg 
    847   1.1    mrg 	return ether_mediachange(ifp);
    848   1.1    mrg }
    849   1.1    mrg 
    850   1.1    mrg /* ioctl */
    851   1.1    mrg 
    852   1.1    mrg static int
    853   1.1    mrg usbnet_ifflags_cb(struct ethercom *ec)
    854   1.1    mrg {
    855   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    856   1.1    mrg 	struct ifnet *ifp = &ec->ec_if;
    857   1.1    mrg 	struct usbnet *un = ifp->if_softc;
    858   1.1    mrg 	int rv = 0;
    859   1.1    mrg 
    860   1.1    mrg 	mutex_enter(&un->un_lock);
    861   1.1    mrg 
    862   1.1    mrg 	const int changed = ifp->if_flags ^ un->un_if_flags;
    863   1.1    mrg 	if ((changed & ~(IFF_CANTCHANGE | IFF_DEBUG)) == 0) {
    864   1.1    mrg 		un->un_if_flags = ifp->if_flags;
    865   1.1    mrg 		if ((changed & IFF_PROMISC) != 0)
    866   1.1    mrg 			rv = ENETRESET;
    867   1.1    mrg 	} else {
    868   1.1    mrg 		rv = ENETRESET;
    869   1.1    mrg 	}
    870   1.1    mrg 
    871   1.1    mrg 	mutex_exit(&un->un_lock);
    872   1.1    mrg 
    873   1.1    mrg 	return rv;
    874   1.1    mrg }
    875   1.1    mrg 
    876   1.1    mrg static int
    877   1.1    mrg usbnet_ioctl(struct ifnet *ifp, u_long cmd, void *data)
    878   1.1    mrg {
    879   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    880   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    881   1.1    mrg 	int error;
    882   1.1    mrg 
    883  1.10    mrg 	if (un->un_ops->uno_override_ioctl)
    884  1.10    mrg 		return uno_override_ioctl(un, ifp, cmd, data);
    885   1.5    mrg 
    886   1.1    mrg 	error = ether_ioctl(ifp, cmd, data);
    887  1.10    mrg 	if (error == ENETRESET)
    888  1.10    mrg 		error = uno_ioctl(un, ifp, cmd, data);
    889   1.1    mrg 
    890   1.1    mrg 	return error;
    891   1.1    mrg }
    892   1.1    mrg 
    893   1.1    mrg /*
    894   1.1    mrg  * Generic stop network function:
    895   1.1    mrg  *	- mark as stopping
    896   1.1    mrg  *	- call DD routine to stop the device
    897   1.1    mrg  *	- turn off running, timer, statchg callout, link
    898   1.1    mrg  *	- stop transfers
    899   1.1    mrg  *	- free RX and TX resources
    900   1.1    mrg  *	- close pipes
    901   1.1    mrg  *
    902   1.1    mrg  * usbnet_stop() is exported for drivers to use, expects lock held.
    903   1.1    mrg  *
    904   1.1    mrg  * usbnet_stop_ifp() is for the if_stop handler.
    905   1.1    mrg  */
    906   1.1    mrg void
    907   1.1    mrg usbnet_stop(struct usbnet *un, struct ifnet *ifp, int disable)
    908   1.1    mrg {
    909   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
    910   1.4    mrg 
    911   1.1    mrg 	KASSERT(mutex_owned(&un->un_lock));
    912   1.1    mrg 
    913   1.1    mrg 	mutex_enter(&un->un_rxlock);
    914   1.1    mrg 	mutex_enter(&un->un_txlock);
    915   1.1    mrg 	un->un_stopping = true;
    916   1.1    mrg 	mutex_exit(&un->un_txlock);
    917   1.1    mrg 	mutex_exit(&un->un_rxlock);
    918   1.1    mrg 
    919  1.10    mrg 	uno_stop(un, ifp, disable);
    920   1.1    mrg 
    921   1.1    mrg 	/*
    922   1.1    mrg 	 * XXXSMP Would like to
    923   1.1    mrg 	 *	KASSERT(IFNET_LOCKED(ifp))
    924   1.1    mrg 	 * here but the locking order is:
    925   1.1    mrg 	 *	ifnet -> unlock -> rxlock -> txlock
    926   1.1    mrg 	 * and unlock is already held.
    927   1.1    mrg 	 */
    928   1.1    mrg 	ifp->if_flags &= ~IFF_RUNNING;
    929   1.1    mrg 	un->un_timer = 0;
    930   1.1    mrg 
    931   1.1    mrg 	callout_stop(&un->un_stat_ch);
    932   1.1    mrg 	un->un_link = false;
    933   1.1    mrg 
    934   1.1    mrg 	/* Stop transfers. */
    935   1.1    mrg 	usbnet_ep_stop_pipes(un);
    936   1.1    mrg 
    937   1.1    mrg 	/* Free RX/TX resources. */
    938   1.1    mrg 	usbnet_rx_list_fini(un);
    939   1.1    mrg 	usbnet_tx_list_fini(un);
    940   1.1    mrg 
    941   1.1    mrg 	/* Close pipes. */
    942   1.1    mrg 	usbnet_ep_close_pipes(un);
    943   1.1    mrg }
    944   1.1    mrg 
    945   1.1    mrg static void
    946   1.1    mrg usbnet_stop_ifp(struct ifnet *ifp, int disable)
    947   1.1    mrg {
    948   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    949   1.1    mrg 
    950   1.1    mrg 	mutex_enter(&un->un_lock);
    951   1.1    mrg 	usbnet_stop(un, ifp, disable);
    952   1.1    mrg 	mutex_exit(&un->un_lock);
    953   1.1    mrg }
    954   1.1    mrg 
    955   1.1    mrg /*
    956   1.1    mrg  * Generic tick task function.
    957   1.1    mrg  *
    958   1.1    mrg  * usbnet_tick() is triggered from a callout, and triggers a call to
    959   1.1    mrg  * usbnet_tick_task() from the usb_task subsystem.
    960   1.1    mrg  */
    961   1.1    mrg static void
    962   1.1    mrg usbnet_tick(void *arg)
    963   1.1    mrg {
    964   1.1    mrg 	struct usbnet * const un = arg;
    965   1.1    mrg 
    966   1.1    mrg 	mutex_enter(&un->un_lock);
    967   1.1    mrg 	if (!un->un_stopping && !un->un_dying) {
    968   1.1    mrg 		/* Perform periodic stuff in process context */
    969   1.1    mrg 		usb_add_task(un->un_udev, &un->un_ticktask, USB_TASKQ_DRIVER);
    970   1.1    mrg 	}
    971   1.1    mrg 	mutex_exit(&un->un_lock);
    972   1.1    mrg }
    973   1.1    mrg 
    974   1.1    mrg static void
    975   1.1    mrg usbnet_watchdog(struct ifnet *ifp)
    976   1.1    mrg {
    977   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
    978   1.1    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
    979   1.1    mrg 	usbd_status stat;
    980   1.1    mrg 
    981   1.1    mrg 	ifp->if_oerrors++;
    982   1.1    mrg 	aprint_error_dev(un->un_dev, "watchdog timeout\n");
    983   1.1    mrg 
    984   1.1    mrg 	if (cd->uncd_tx_cnt > 0) {
    985   1.1    mrg 		/*
    986   1.1    mrg 		 * XXX index 0
    987   1.1    mrg 		 */
    988   1.1    mrg 		struct usbnet_chain *c = &un->un_cdata.uncd_tx_chain[0];
    989   1.1    mrg 		usbd_get_xfer_status(c->unc_xfer, NULL, NULL, NULL, &stat);
    990   1.1    mrg 		usbnet_txeof(c->unc_xfer, c, stat);
    991   1.1    mrg 	}
    992   1.1    mrg 
    993   1.1    mrg 	if (!IFQ_IS_EMPTY(&ifp->if_snd))
    994   1.1    mrg 		(*ifp->if_start)(ifp);
    995   1.1    mrg }
    996   1.1    mrg 
    997   1.1    mrg static void
    998   1.1    mrg usbnet_tick_task(void *arg)
    999   1.1    mrg {
   1000   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1001   1.1    mrg 	struct usbnet * const un = arg;
   1002   1.1    mrg 
   1003   1.1    mrg 	mutex_enter(&un->un_lock);
   1004   1.1    mrg 	if (un->un_stopping || un->un_dying) {
   1005   1.1    mrg 		mutex_exit(&un->un_lock);
   1006   1.1    mrg 		return;
   1007   1.1    mrg 	}
   1008   1.1    mrg 
   1009   1.1    mrg 	struct ifnet * const ifp = usbnet_ifp(un);
   1010   1.1    mrg 	struct mii_data * const mii = usbnet_mii(un);
   1011   1.1    mrg 
   1012   1.1    mrg 	un->un_refcnt++;
   1013   1.1    mrg 	mutex_exit(&un->un_lock);
   1014   1.1    mrg 
   1015   1.1    mrg 	if (ifp && un->un_timer != 0 && --un->un_timer == 0)
   1016   1.1    mrg 		usbnet_watchdog(ifp);
   1017   1.1    mrg 
   1018   1.1    mrg 	if (mii && ifp) {
   1019   1.1    mrg 		mii_tick(mii);
   1020   1.1    mrg 
   1021   1.1    mrg 		if (!un->un_link)
   1022   1.1    mrg 			(*mii->mii_statchg)(ifp);
   1023   1.1    mrg 	}
   1024   1.1    mrg 
   1025   1.1    mrg 	mutex_enter(&un->un_lock);
   1026   1.1    mrg 	if (--un->un_refcnt < 0)
   1027   1.1    mrg 		cv_broadcast(&un->un_detachcv);
   1028   1.1    mrg 	if (!un->un_stopping && !un->un_dying)
   1029   1.1    mrg 		callout_schedule(&un->un_stat_ch, hz);
   1030   1.1    mrg 	mutex_exit(&un->un_lock);
   1031   1.1    mrg }
   1032   1.1    mrg 
   1033   1.1    mrg static int
   1034   1.1    mrg usbnet_init(struct ifnet *ifp)
   1035   1.1    mrg {
   1036   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1037   1.1    mrg 	struct usbnet * const un = ifp->if_softc;
   1038   1.1    mrg 
   1039  1.10    mrg 	return uno_init(un, ifp);
   1040   1.1    mrg }
   1041   1.1    mrg 
   1042   1.1    mrg /* Autoconf management. */
   1043   1.1    mrg 
   1044   1.5    mrg static bool
   1045   1.5    mrg usbnet_empty_eaddr(struct usbnet *un)
   1046   1.5    mrg {
   1047   1.5    mrg 	return (un->un_eaddr[0] == 0 && un->un_eaddr[1] == 0 &&
   1048   1.5    mrg 		un->un_eaddr[2] == 0 && un->un_eaddr[3] == 0 &&
   1049   1.5    mrg 		un->un_eaddr[4] == 0 && un->un_eaddr[5] == 0);
   1050   1.5    mrg }
   1051   1.5    mrg 
   1052   1.1    mrg /*
   1053   1.1    mrg  * usbnet_attach() and usbnet_attach_ifp() perform setup of the relevant
   1054   1.1    mrg  * 'usbnet'.  The first is enough to enable device access (eg, endpoints
   1055   1.1    mrg  * are connected and commands can be sent), and the second connects the
   1056   1.1    mrg  * device to the system networking.
   1057   1.1    mrg  *
   1058   1.1    mrg  * Always call usbnet_detach(), even if usbnet_attach_ifp() is skippped.
   1059   1.1    mrg  * Also usable as driver detach directly.
   1060   1.5    mrg  *
   1061   1.5    mrg  * To skip ethernet configuration (eg, point-to-point), make sure that
   1062   1.5    mrg  * the un_eaddr[] is fully zero.
   1063   1.1    mrg  */
   1064   1.1    mrg void
   1065   1.1    mrg usbnet_attach(struct usbnet *un,
   1066   1.1    mrg 	      const char *detname,	/* detach cv name */
   1067   1.1    mrg 	      unsigned rx_list_cnt,	/* size of rx chain list */
   1068  1.10    mrg 	      unsigned tx_list_cnt,	/* size of tx chain list */
   1069  1.10    mrg 	      unsigned rx_flags,	/* flags for rx xfer */
   1070  1.10    mrg 	      unsigned tx_flags,	/* flags for tx xfer */
   1071  1.10    mrg 	      unsigned rx_bufsz,	/* size of rx buffers */
   1072  1.10    mrg 	      unsigned tx_bufsz)	/* size of tx buffers */
   1073   1.1    mrg {
   1074   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1075  1.10    mrg 	struct usbnet_cdata *cd = &un->un_cdata;
   1076   1.1    mrg 
   1077  1.10    mrg 	/* Required inputs.  */
   1078  1.10    mrg 	KASSERT(un->un_ops->uno_tx_prepare);
   1079  1.10    mrg 	KASSERT(un->un_ops->uno_rx_loop);
   1080  1.10    mrg 	KASSERT(un->un_ops->uno_init);
   1081  1.10    mrg 	KASSERT(rx_bufsz);
   1082  1.10    mrg 	KASSERT(tx_bufsz);
   1083   1.1    mrg 	KASSERT(rx_list_cnt);
   1084   1.1    mrg 	KASSERT(tx_list_cnt);
   1085   1.1    mrg 
   1086  1.10    mrg 	cd->uncd_rx_xfer_flags = rx_flags;
   1087  1.10    mrg 	cd->uncd_tx_xfer_flags = tx_flags;
   1088  1.10    mrg 	cd->uncd_rx_list_cnt = rx_list_cnt;
   1089  1.10    mrg 	cd->uncd_tx_list_cnt = tx_list_cnt;
   1090  1.10    mrg 	cd->uncd_rx_bufsz = rx_bufsz;
   1091  1.10    mrg 	cd->uncd_tx_bufsz = tx_bufsz;
   1092  1.10    mrg 
   1093   1.1    mrg 	ether_set_ifflags_cb(&un->un_ec, usbnet_ifflags_cb);
   1094   1.1    mrg 
   1095   1.1    mrg 	usb_init_task(&un->un_ticktask, usbnet_tick_task, un, USB_TASKQ_MPSAFE);
   1096   1.3  skrll 	callout_init(&un->un_stat_ch, CALLOUT_MPSAFE);
   1097   1.1    mrg 	callout_setfunc(&un->un_stat_ch, usbnet_tick, un);
   1098   1.1    mrg 
   1099   1.1    mrg 	mutex_init(&un->un_miilock, MUTEX_DEFAULT, IPL_NONE);
   1100   1.1    mrg 	mutex_init(&un->un_txlock, MUTEX_DEFAULT, IPL_SOFTUSB);
   1101   1.1    mrg 	mutex_init(&un->un_rxlock, MUTEX_DEFAULT, IPL_SOFTUSB);
   1102   1.1    mrg 	mutex_init(&un->un_lock, MUTEX_DEFAULT, IPL_NONE);
   1103   1.1    mrg 	cv_init(&un->un_detachcv, detname);
   1104   1.1    mrg 
   1105   1.1    mrg 	rnd_attach_source(&un->un_rndsrc, device_xname(un->un_dev),
   1106   1.1    mrg 	    RND_TYPE_NET, RND_FLAG_DEFAULT);
   1107   1.1    mrg 
   1108  1.10    mrg 	usbnet_rx_list_alloc(un);
   1109  1.10    mrg 	usbnet_tx_list_alloc(un);
   1110   1.1    mrg 
   1111   1.1    mrg 	un->un_attached = true;
   1112   1.1    mrg }
   1113   1.1    mrg 
   1114   1.1    mrg static void
   1115   1.2    mrg usbnet_attach_mii(struct usbnet *un, int mii_flags)
   1116   1.1    mrg {
   1117   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1118   1.1    mrg 	struct mii_data * const mii = &un->un_mii;
   1119   1.1    mrg 	struct ifnet *ifp = usbnet_ifp(un);
   1120   1.1    mrg 
   1121  1.10    mrg 	KASSERT(un->un_ops->uno_read_reg);
   1122  1.10    mrg 	KASSERT(un->un_ops->uno_write_reg);
   1123  1.10    mrg 	KASSERT(un->un_ops->uno_statchg);
   1124  1.10    mrg 
   1125   1.1    mrg 	mii->mii_ifp = ifp;
   1126  1.10    mrg 	mii->mii_readreg = usbnet_mii_readreg;
   1127  1.10    mrg 	mii->mii_writereg = usbnet_mii_writereg;
   1128  1.10    mrg 	mii->mii_statchg = usbnet_mii_statchg;
   1129   1.1    mrg 	mii->mii_flags = MIIF_AUTOTSLEEP;
   1130   1.1    mrg 
   1131   1.1    mrg 	un->un_ec.ec_mii = mii;
   1132   1.1    mrg 	ifmedia_init(&mii->mii_media, 0, usbnet_media_upd, ether_mediastatus);
   1133   1.1    mrg 	mii_attach(un->un_dev, mii, 0xffffffff, MII_PHY_ANY,
   1134   1.2    mrg 		   MII_OFFSET_ANY, mii_flags);
   1135   1.1    mrg 
   1136   1.1    mrg 	if (LIST_FIRST(&mii->mii_phys) == NULL) {
   1137   1.1    mrg 		ifmedia_add(&mii->mii_media, IFM_ETHER | IFM_NONE, 0, NULL);
   1138   1.1    mrg 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_NONE);
   1139   1.1    mrg 	} else
   1140   1.1    mrg 		ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO);
   1141   1.1    mrg }
   1142   1.1    mrg 
   1143   1.1    mrg void
   1144   1.1    mrg usbnet_attach_ifp(struct usbnet *un,
   1145   1.1    mrg 		  bool have_mii,		/* setup MII */
   1146   1.1    mrg 		  unsigned if_flags,		/* additional if_flags */
   1147   1.2    mrg 		  unsigned if_extflags,		/* additional if_extflags */
   1148   1.2    mrg 		  int mii_flags)		/* additional mii_attach flags */
   1149   1.1    mrg {
   1150   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1151   1.1    mrg 	struct ifnet *ifp = usbnet_ifp(un);
   1152   1.1    mrg 
   1153   1.1    mrg 	KASSERT(un->un_attached);
   1154   1.1    mrg 
   1155   1.1    mrg 	IFQ_SET_READY(&ifp->if_snd);
   1156   1.1    mrg 
   1157   1.1    mrg 	ifp->if_softc = un;
   1158   1.1    mrg 	strlcpy(ifp->if_xname, device_xname(un->un_dev), IFNAMSIZ);
   1159   1.1    mrg 	ifp->if_flags = if_flags;
   1160   1.1    mrg 	ifp->if_extflags = IFEF_MPSAFE | if_extflags;
   1161   1.1    mrg 	ifp->if_ioctl = usbnet_ioctl;
   1162   1.1    mrg 	ifp->if_start = usbnet_start;
   1163   1.1    mrg 	ifp->if_init = usbnet_init;
   1164   1.1    mrg 	ifp->if_stop = usbnet_stop_ifp;
   1165   1.1    mrg 
   1166   1.1    mrg 	IFQ_SET_READY(&ifp->if_snd);
   1167   1.1    mrg 
   1168   1.1    mrg 	if (have_mii)
   1169   1.2    mrg 		usbnet_attach_mii(un, mii_flags);
   1170   1.4    mrg 	else
   1171   1.4    mrg 		un->un_link = true;
   1172   1.1    mrg 
   1173   1.1    mrg 	/* Attach the interface. */
   1174   1.1    mrg 	if_attach(ifp);
   1175   1.5    mrg 
   1176   1.5    mrg 	/*
   1177   1.5    mrg 	 * If ethernet address is all zero, skip ether_ifattach() and
   1178   1.5    mrg 	 * instead attach bpf here..
   1179   1.5    mrg 	 */
   1180   1.5    mrg 	if (!usbnet_empty_eaddr(un)) {
   1181   1.6    mrg 		aprint_normal_dev(un->un_dev, "Ethernet address %s\n",
   1182   1.6    mrg 		    ether_sprintf(un->un_eaddr));
   1183   1.5    mrg 		ether_ifattach(ifp, un->un_eaddr);
   1184   1.5    mrg 	} else {
   1185   1.5    mrg 		if_alloc_sadl(ifp);
   1186   1.5    mrg 		bpf_attach(ifp, DLT_RAW, 0);
   1187   1.5    mrg 	}
   1188   1.8    mrg 
   1189   1.8    mrg 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, un->un_udev, un->un_dev);
   1190   1.8    mrg 
   1191   1.8    mrg 	if (!pmf_device_register(un->un_dev, NULL, NULL))
   1192   1.8    mrg 		aprint_error_dev(un->un_dev, "couldn't establish power handler\n");
   1193   1.1    mrg }
   1194   1.1    mrg 
   1195   1.1    mrg int
   1196   1.1    mrg usbnet_detach(device_t self, int flags)
   1197   1.1    mrg {
   1198   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1199   1.1    mrg 	struct usbnet * const un = device_private(self);
   1200   1.1    mrg 	struct ifnet *ifp = usbnet_ifp(un);
   1201   1.1    mrg 	struct mii_data *mii = usbnet_mii(un);
   1202   1.1    mrg 
   1203   1.1    mrg 	mutex_enter(&un->un_lock);
   1204   1.1    mrg 	un->un_dying = true;
   1205   1.1    mrg 	mutex_exit(&un->un_lock);
   1206   1.1    mrg 
   1207   1.1    mrg 	/* Detached before attached finished, so just bail out. */
   1208   1.1    mrg 	if (!un->un_attached)
   1209   1.1    mrg 		return 0;
   1210   1.1    mrg 
   1211   1.1    mrg 	callout_halt(&un->un_stat_ch, NULL);
   1212   1.1    mrg 	usb_rem_task_wait(un->un_udev, &un->un_ticktask, USB_TASKQ_DRIVER, NULL);
   1213   1.1    mrg 
   1214   1.1    mrg 	if (ifp->if_flags & IFF_RUNNING) {
   1215   1.1    mrg 		IFNET_LOCK(ifp);
   1216   1.1    mrg 		usbnet_stop_ifp(ifp, 1);
   1217   1.1    mrg 		IFNET_UNLOCK(ifp);
   1218   1.1    mrg 	}
   1219   1.1    mrg 
   1220   1.1    mrg 	mutex_enter(&un->un_lock);
   1221   1.1    mrg 	un->un_refcnt--;
   1222   1.1    mrg 	while (un->un_refcnt > 0) {
   1223   1.1    mrg 		/* Wait for processes to go away */
   1224   1.1    mrg 		cv_wait(&un->un_detachcv, &un->un_lock);
   1225   1.1    mrg 	}
   1226   1.1    mrg 	mutex_exit(&un->un_lock);
   1227   1.1    mrg 
   1228   1.1    mrg 	usbnet_rx_list_free(un);
   1229   1.1    mrg 	usbnet_tx_list_free(un);
   1230   1.1    mrg 
   1231   1.1    mrg 	callout_destroy(&un->un_stat_ch);
   1232   1.1    mrg 	rnd_detach_source(&un->un_rndsrc);
   1233   1.1    mrg 
   1234   1.1    mrg 	if (mii) {
   1235   1.1    mrg 		mii_detach(mii, MII_PHY_ANY, MII_OFFSET_ANY);
   1236   1.1    mrg 		ifmedia_delete_instance(&mii->mii_media, IFM_INST_ANY);
   1237   1.1    mrg 	}
   1238   1.1    mrg 	if (ifp->if_softc) {
   1239   1.5    mrg 		if (!usbnet_empty_eaddr(un))
   1240   1.5    mrg 			ether_ifdetach(ifp);
   1241   1.5    mrg 		else
   1242   1.5    mrg 			bpf_detach(ifp);
   1243   1.1    mrg 		if_detach(ifp);
   1244   1.1    mrg 	}
   1245   1.1    mrg 
   1246   1.1    mrg 	cv_destroy(&un->un_detachcv);
   1247   1.1    mrg 	mutex_destroy(&un->un_lock);
   1248   1.1    mrg 	mutex_destroy(&un->un_rxlock);
   1249   1.1    mrg 	mutex_destroy(&un->un_txlock);
   1250   1.1    mrg 	mutex_destroy(&un->un_miilock);
   1251   1.1    mrg 
   1252   1.1    mrg 	pmf_device_deregister(un->un_dev);
   1253   1.1    mrg 
   1254   1.1    mrg 	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, un->un_udev, un->un_dev);
   1255   1.1    mrg 
   1256   1.1    mrg 	return 0;
   1257   1.1    mrg }
   1258   1.1    mrg 
   1259   1.1    mrg int
   1260   1.1    mrg usbnet_activate(device_t self, devact_t act)
   1261   1.1    mrg {
   1262   1.4    mrg 	USBNETHIST_FUNC(); USBNETHIST_CALLED();
   1263   1.1    mrg 	struct usbnet * const un = device_private(self);
   1264   1.1    mrg 	struct ifnet * const ifp = usbnet_ifp(un);
   1265   1.1    mrg 
   1266   1.1    mrg 	switch (act) {
   1267   1.1    mrg 	case DVACT_DEACTIVATE:
   1268   1.1    mrg 		if_deactivate(ifp);
   1269   1.1    mrg 
   1270   1.1    mrg 		mutex_enter(&un->un_lock);
   1271   1.1    mrg 		un->un_dying = true;
   1272   1.1    mrg 		mutex_exit(&un->un_lock);
   1273   1.1    mrg 
   1274   1.1    mrg 		mutex_enter(&un->un_rxlock);
   1275   1.1    mrg 		mutex_enter(&un->un_txlock);
   1276   1.1    mrg 		un->un_stopping = true;
   1277   1.1    mrg 		mutex_exit(&un->un_txlock);
   1278   1.1    mrg 		mutex_exit(&un->un_rxlock);
   1279   1.1    mrg 
   1280   1.1    mrg 		return 0;
   1281   1.1    mrg 	default:
   1282   1.1    mrg 		return EOPNOTSUPP;
   1283   1.1    mrg 	}
   1284   1.1    mrg }
   1285   1.1    mrg 
   1286   1.1    mrg MODULE(MODULE_CLASS_MISC, usbnet, NULL);
   1287   1.1    mrg 
   1288   1.1    mrg static int
   1289   1.1    mrg usbnet_modcmd(modcmd_t cmd, void *arg)
   1290   1.1    mrg {
   1291   1.1    mrg 	switch (cmd) {
   1292   1.1    mrg 	case MODULE_CMD_INIT:
   1293   1.4    mrg 		return 0;
   1294   1.1    mrg 	case MODULE_CMD_FINI:
   1295   1.1    mrg 		return 0;
   1296   1.1    mrg 	case MODULE_CMD_STAT:
   1297   1.1    mrg 	case MODULE_CMD_AUTOUNLOAD:
   1298   1.1    mrg 	default:
   1299   1.1    mrg 		return ENOTTY;
   1300   1.1    mrg 	}
   1301   1.1    mrg }
   1302