Index: if_axen.c =================================================================== RCS file: /cvsroot/src/sys/dev/usb/if_axen.c,v retrieving revision 1.44 diff -p -u -r1.44 if_axen.c --- if_axen.c 21 Jun 2019 14:19:46 -0000 1.44 +++ if_axen.c 22 Jun 2019 02:34:27 -0000 @@ -785,7 +785,7 @@ axen_attach(device_t parent, device_t se char *devinfop; const char *devname = device_xname(self); struct ifnet *ifp; - int i, s; + int i; aprint_naive("\n"); aprint_normal("\n"); @@ -806,7 +806,7 @@ axen_attach(device_t parent, device_t se sc->axen_flags = axen_lookup(uaa->uaa_vendor, uaa->uaa_product)->axen_flags; - usb_init_task(&sc->axen_tick_task, axen_tick_task, sc, 0); + usb_init_task(&sc->axen_tick_task, axen_tick_task, sc, USB_TASKQ_MPSAFE); err = usbd_device2interface_handle(dev, AXEN_IFACE_IDX,&sc->axen_iface); if (err) { @@ -862,8 +862,6 @@ axen_attach(device_t parent, device_t se mutex_init(&sc->axen_lock, MUTEX_DEFAULT, IPL_NONE); cv_init(&sc->axen_detachcv, "axendet"); - s = splnet(); - sc->axen_phyno = AXEN_PHY_ID; DPRINTF(("%s: phyno %d\n", device_xname(self), sc->axen_phyno)); @@ -898,6 +896,7 @@ axen_attach(device_t parent, device_t se ifp->if_softc = sc; strlcpy(ifp->if_xname, devname, IFNAMSIZ); ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; + ifp->if_extflags = IFEF_MPSAFE; ifp->if_ioctl = axen_ioctl; ifp->if_start = axen_start; ifp->if_init = axen_init; @@ -939,11 +938,10 @@ axen_attach(device_t parent, device_t se rnd_attach_source(&sc->rnd_source, device_xname(sc->axen_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); - callout_init(&sc->axen_stat_ch, 0); + callout_init(&sc->axen_stat_ch, CALLOUT_MPSAFE); callout_setfunc(&sc->axen_stat_ch, axen_tick, sc); sc->axen_attached = true; - splx(s); usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->axen_udev,sc->axen_dev); @@ -956,7 +954,6 @@ axen_detach(device_t self, int flags) { struct axen_softc * const sc = device_private(self); struct ifnet *ifp = GET_IFP(sc); - int s; mutex_enter(&sc->axen_lock); sc->axen_dying = true; @@ -974,8 +971,6 @@ axen_detach(device_t self, int flags) usb_rem_task_wait(sc->axen_udev, &sc->axen_tick_task, USB_TASKQ_DRIVER, NULL); - s = splusb(); - if (ifp->if_flags & IFF_RUNNING) axen_stop(ifp, 1); @@ -1004,8 +999,6 @@ axen_detach(device_t self, int flags) sc->axen_attached = false; - splx(s); - usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->axen_udev,sc->axen_dev); cv_destroy(&sc->axen_detachcv); @@ -1137,7 +1130,6 @@ axen_rxeof(struct usbd_xfer *xfer, void uint16_t hdr_offset, pkt_count; size_t pkt_len; size_t temp; - int s; DPRINTFN(10,("%s: %s: enter\n", device_xname(sc->axen_dev), __func__)); @@ -1253,9 +1245,7 @@ axen_rxeof(struct usbd_xfer *xfer, void mutex_exit(&sc->axen_rxlock); /* push the packet up */ - s = splnet(); if_percpuq_enqueue((ifp)->if_percpuq, (m)); - splx(s); mutex_enter(&sc->axen_rxlock); if (sc->axen_stopping) { @@ -1342,7 +1332,6 @@ axen_txeof(struct usbd_xfer *xfer, void struct axen_softc * const sc = c->axen_sc; struct axen_cdata *cd = &sc->axen_cdata; struct ifnet *ifp = GET_IFP(sc); - int s; mutex_enter(&sc->axen_txlock); if (sc->axen_stopping || sc->axen_dying) { @@ -1350,8 +1339,6 @@ axen_txeof(struct usbd_xfer *xfer, void return; } - s = splnet(); - KASSERT(cd->axen_tx_cnt > 0); cd->axen_tx_cnt--; @@ -1380,7 +1367,6 @@ axen_txeof(struct usbd_xfer *xfer, void break; } - splx(s); mutex_exit(&sc->axen_txlock); } @@ -1413,7 +1399,6 @@ axen_tick_task(void *xsc) struct axen_softc * const sc = xsc; struct ifnet *ifp; struct mii_data *mii; - int s; if (sc == NULL) return; @@ -1432,8 +1417,6 @@ axen_tick_task(void *xsc) sc->axen_refcnt++; mutex_exit(&sc->axen_lock); - s = splnet(); - if (sc->axen_timer != 0 && --sc->axen_timer == 0) axen_watchdog(ifp); @@ -1448,8 +1431,6 @@ axen_tick_task(void *xsc) if (sc->axen_stopping || sc->axen_dying) callout_schedule(&sc->axen_stat_ch, hz); mutex_exit(&sc->axen_lock); - - splx(s); } static int @@ -1577,7 +1558,7 @@ axen_init_locked(struct ifnet *ifp) struct axen_softc * const sc = ifp->if_softc; struct axen_chain *c; usbd_status err; - int i, s; + int i; uint16_t rxmode; uint16_t wval; uint8_t bval; @@ -1587,8 +1568,6 @@ axen_init_locked(struct ifnet *ifp) if (sc->axen_dying) return EIO; - s = splnet(); - /* Cancel pending I/O */ axen_stop_locked(ifp, 1); @@ -1618,34 +1597,30 @@ axen_init_locked(struct ifnet *ifp) /* Open RX and TX pipes. */ err = usbd_open_pipe(sc->axen_iface, sc->axen_ed[AXEN_ENDPT_RX], - USBD_EXCLUSIVE_USE, &sc->axen_ep[AXEN_ENDPT_RX]); + USBD_EXCLUSIVE_USE | USBD_MPSAFE, &sc->axen_ep[AXEN_ENDPT_RX]); if (err) { aprint_error_dev(sc->axen_dev, "open rx pipe failed: %s\n", usbd_errstr(err)); - splx(s); return EIO; } err = usbd_open_pipe(sc->axen_iface, sc->axen_ed[AXEN_ENDPT_TX], - USBD_EXCLUSIVE_USE, &sc->axen_ep[AXEN_ENDPT_TX]); + USBD_EXCLUSIVE_USE | USBD_MPSAFE, &sc->axen_ep[AXEN_ENDPT_TX]); if (err) { aprint_error_dev(sc->axen_dev, "open tx pipe failed: %s\n", usbd_errstr(err)); - splx(s); return EIO; } /* Init RX ring. */ if (axen_rx_list_init(sc)) { aprint_error_dev(sc->axen_dev, "rx list init failed\n"); - splx(s); return ENOBUFS; } /* Init TX ring. */ if (axen_tx_list_init(sc)) { aprint_error_dev(sc->axen_dev, "tx list init failed\n"); - splx(s); return ENOBUFS; } @@ -1669,8 +1644,6 @@ axen_init_locked(struct ifnet *ifp) ifp->if_flags |= IFF_RUNNING; ifp->if_flags &= ~IFF_OACTIVE; - splx(s); - callout_schedule(&sc->axen_stat_ch, hz); return 0; } @@ -1691,11 +1664,8 @@ static int axen_ioctl(struct ifnet *ifp, u_long cmd, void *data) { struct axen_softc * const sc = ifp->if_softc; - int s; int error = 0; - s = splnet(); - switch (cmd) { case SIOCSIFFLAGS: if ((error = ifioctl_common(ifp, cmd, data)) != 0) @@ -1747,7 +1717,6 @@ axen_ioctl(struct ifnet *ifp, u_long cmd } break; } - splx(s); return error; } @@ -1758,20 +1727,16 @@ axen_watchdog(struct ifnet *ifp) struct axen_softc * const sc = ifp->if_softc; struct axen_chain *c; usbd_status stat; - int s; ifp->if_oerrors++; aprint_error_dev(sc->axen_dev, "watchdog timeout\n"); - s = splusb(); - c = &sc->axen_cdata.axen_tx_chain[0]; usbd_get_xfer_status(c->axen_xfer, NULL, NULL, NULL, &stat); axen_txeof(c->axen_xfer, c, stat); if (!IFQ_IS_EMPTY(&ifp->if_snd)) axen_start(ifp); - splx(s); } /*