mark this driver MPSAFE for usb tasks and pipes, if(4), and callouts.
remove remaining redundant spl calls.
This commit is contained in:
parent
1a12b22735
commit
7c1f464615
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: if_axen.c,v 1.46 2019/06/22 08:09:08 mrg Exp $ */
|
||||
/* $NetBSD: if_axen.c,v 1.47 2019/06/22 09:53:56 mrg 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.46 2019/06/22 08:09:08 mrg Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.47 2019/06/22 09:53:56 mrg Exp $");
|
||||
|
||||
#ifdef _KERNEL_OPT
|
||||
#include "opt_inet.h"
|
||||
|
@ -784,7 +784,7 @@ axen_attach(device_t parent, device_t self, void *aux)
|
|||
char *devinfop;
|
||||
const char *devname = device_xname(self);
|
||||
struct ifnet *ifp;
|
||||
int i, s;
|
||||
int i;
|
||||
|
||||
aprint_naive("\n");
|
||||
aprint_normal("\n");
|
||||
|
@ -805,7 +805,7 @@ axen_attach(device_t parent, device_t self, void *aux)
|
|||
|
||||
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) {
|
||||
|
@ -861,8 +861,6 @@ axen_attach(device_t parent, device_t self, void *aux)
|
|||
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));
|
||||
|
||||
|
@ -897,6 +895,7 @@ axen_attach(device_t parent, device_t self, void *aux)
|
|||
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;
|
||||
|
@ -938,11 +937,10 @@ axen_attach(device_t parent, device_t self, void *aux)
|
|||
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);
|
||||
|
||||
|
@ -955,7 +953,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;
|
||||
|
@ -973,8 +970,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);
|
||||
|
||||
|
@ -1003,8 +998,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);
|
||||
|
@ -1136,7 +1129,6 @@ axen_rxeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
|
|||
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__));
|
||||
|
||||
|
@ -1252,9 +1244,7 @@ axen_rxeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
|
|||
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) {
|
||||
|
@ -1341,7 +1331,6 @@ axen_txeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
|
|||
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) {
|
||||
|
@ -1349,8 +1338,6 @@ axen_txeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
|
|||
return;
|
||||
}
|
||||
|
||||
s = splnet();
|
||||
|
||||
KASSERT(cd->axen_tx_cnt > 0);
|
||||
cd->axen_tx_cnt--;
|
||||
|
||||
|
@ -1363,12 +1350,12 @@ axen_txeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
|
|||
break;
|
||||
|
||||
case USBD_NORMAL_COMPLETION:
|
||||
ifp->if_opackets++;
|
||||
if (!IFQ_IS_EMPTY(&ifp->if_snd))
|
||||
axen_start_locked(ifp);
|
||||
break;
|
||||
|
||||
default:
|
||||
ifp->if_opackets++;
|
||||
|
||||
ifp->if_oerrors++;
|
||||
if (usbd_ratecheck(&sc->axen_tx_notice))
|
||||
|
@ -1379,7 +1366,6 @@ axen_txeof(struct usbd_xfer *xfer, void * priv, usbd_status status)
|
|||
break;
|
||||
}
|
||||
|
||||
splx(s);
|
||||
mutex_exit(&sc->axen_txlock);
|
||||
}
|
||||
|
||||
|
@ -1391,18 +1377,13 @@ axen_tick(void *xsc)
|
|||
if (sc == NULL)
|
||||
return;
|
||||
|
||||
mutex_enter(&sc->axen_lock);
|
||||
|
||||
DPRINTFN(0xff,("%s: %s: enter\n", device_xname(sc->axen_dev),__func__));
|
||||
|
||||
if (sc->axen_stopping || sc->axen_dying) {
|
||||
mutex_exit(&sc->axen_lock);
|
||||
return;
|
||||
mutex_enter(&sc->axen_lock);
|
||||
if (!sc->axen_stopping && !sc->axen_dying) {
|
||||
/* Perform periodic stuff in process context */
|
||||
usb_add_task(sc->axen_udev, &sc->axen_tick_task, USB_TASKQ_DRIVER);
|
||||
}
|
||||
|
||||
/* Perform periodic stuff in process context */
|
||||
usb_add_task(sc->axen_udev, &sc->axen_tick_task, USB_TASKQ_DRIVER);
|
||||
|
||||
mutex_exit(&sc->axen_lock);
|
||||
}
|
||||
|
||||
|
@ -1412,7 +1393,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;
|
||||
|
@ -1431,8 +1411,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);
|
||||
|
||||
|
@ -1447,8 +1425,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
|
||||
|
@ -1576,7 +1552,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;
|
||||
|
@ -1586,8 +1562,6 @@ axen_init_locked(struct ifnet *ifp)
|
|||
if (sc->axen_dying)
|
||||
return EIO;
|
||||
|
||||
s = splnet();
|
||||
|
||||
/* Cancel pending I/O */
|
||||
axen_stop_locked(ifp, 1);
|
||||
|
||||
|
@ -1617,34 +1591,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;
|
||||
}
|
||||
|
||||
|
@ -1668,8 +1638,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;
|
||||
}
|
||||
|
@ -1690,11 +1658,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)
|
||||
|
@ -1746,7 +1711,6 @@ axen_ioctl(struct ifnet *ifp, u_long cmd, void *data)
|
|||
}
|
||||
break;
|
||||
}
|
||||
splx(s);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -1757,20 +1721,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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in New Issue