summaryrefslogtreecommitdiffstats
path: root/sys/dev/usb/if_kue.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/usb/if_kue.c')
-rw-r--r--sys/dev/usb/if_kue.c93
1 files changed, 55 insertions, 38 deletions
diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c
index 0b5f9fb..d0e27df 100644
--- a/sys/dev/usb/if_kue.c
+++ b/sys/dev/usb/if_kue.c
@@ -203,14 +203,13 @@ Static usbd_status kue_setword(sc, breq, word)
usbd_device_handle dev;
usb_device_request_t req;
usbd_status err;
- int s;
if (sc->kue_gone)
return(USBD_NORMAL_COMPLETION);
dev = sc->kue_udev;
- s = splusb();
+ KUE_LOCK(sc);
req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
@@ -221,7 +220,7 @@ Static usbd_status kue_setword(sc, breq, word)
err = kue_do_request(dev, &req, NULL);
- splx(s);
+ KUE_UNLOCK(sc);
return(err);
}
@@ -237,14 +236,13 @@ Static usbd_status kue_ctl(sc, rw, breq, val, data, len)
usbd_device_handle dev;
usb_device_request_t req;
usbd_status err;
- int s;
dev = sc->kue_udev;
if (sc->kue_gone)
return(USBD_NORMAL_COMPLETION);
- s = splusb();
+ KUE_LOCK(sc);
if (rw == KUE_CTL_WRITE)
req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
@@ -258,7 +256,7 @@ Static usbd_status kue_ctl(sc, rw, breq, val, data, len)
err = kue_do_request(dev, &req, data);
- splx(s);
+ KUE_UNLOCK(sc);
return(err);
}
@@ -415,15 +413,12 @@ USB_ATTACH(kue)
{
USB_ATTACH_START(kue, sc, uaa);
char devinfo[1024];
- int s;
struct ifnet *ifp;
usbd_status err;
usb_interface_descriptor_t *id;
usb_endpoint_descriptor_t *ed;
int i;
- s = splimp();
-
bzero(sc, sizeof(struct kue_softc));
sc->kue_iface = uaa->iface;
sc->kue_udev = uaa->device;
@@ -441,7 +436,6 @@ USB_ATTACH(kue)
if (!ed) {
printf("kue%d: couldn't get ep %d\n",
sc->kue_unit, i);
- splx(s);
USB_ATTACH_ERROR_RETURN;
}
if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN &&
@@ -456,9 +450,13 @@ USB_ATTACH(kue)
}
}
+ mtx_init(&sc->kue_mtx, device_get_nameunit(self), MTX_DEF);
+ KUE_LOCK(sc);
+
/* Load the firmware into the NIC. */
if (kue_load_fw(sc)) {
- splx(s);
+ KUE_UNLOCK(sc);
+ mtx_destroy(&sc->kue_mtx);
USB_ATTACH_ERROR_RETURN;
}
@@ -505,7 +503,8 @@ USB_ATTACH(kue)
usb_register_netisr();
sc->kue_gone = 0;
- splx(s);
+ KUE_UNLOCK(sc);
+
USB_ATTACH_SUCCESS_RETURN;
}
@@ -514,11 +513,9 @@ Static int kue_detach(dev)
{
struct kue_softc *sc;
struct ifnet *ifp;
- int s;
-
- s = splusb();
sc = device_get_softc(dev);
+ KUE_LOCK(sc);
ifp = &sc->arpcom.ac_if;
sc->kue_gone = 1;
@@ -536,7 +533,8 @@ Static int kue_detach(dev)
if (sc->kue_mcfilters != NULL)
free(sc->kue_mcfilters, M_USBDEV);
- splx(s);
+ KUE_UNLOCK(sc);
+ mtx_destroy(&sc->kue_mtx);
return(0);
}
@@ -635,6 +633,7 @@ Static void kue_rxstart(ifp)
struct kue_chain *c;
sc = ifp->if_softc;
+ KUE_LOCK(sc);
c = &sc->kue_cdata.kue_rx_chain[sc->kue_cdata.kue_rx_prod];
if (kue_newbuf(sc, c, NULL) == ENOBUFS) {
@@ -648,6 +647,8 @@ Static void kue_rxstart(ifp)
USBD_NO_TIMEOUT, kue_rxeof);
usbd_transfer(c->kue_xfer);
+ KUE_UNLOCK(sc);
+
return;
}
@@ -669,14 +670,19 @@ Static void kue_rxeof(xfer, priv, status)
c = priv;
sc = c->kue_sc;
+ KUE_LOCK(sc);
ifp = &sc->arpcom.ac_if;
- if (!(ifp->if_flags & IFF_RUNNING))
+ if (!(ifp->if_flags & IFF_RUNNING)) {
+ KUE_UNLOCK(sc);
return;
+ }
if (status != USBD_NORMAL_COMPLETION) {
- if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
+ if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
+ KUE_UNLOCK(sc);
return;
+ }
printf("kue%d: usb error on rx: %s\n", sc->kue_unit,
usbd_errstr(status));
if (status == USBD_STALLED)
@@ -706,6 +712,7 @@ Static void kue_rxeof(xfer, priv, status)
/* Put the packet on the special USB input queue. */
usb_ether_input(m);
+ KUE_UNLOCK(sc);
return;
done:
@@ -715,6 +722,7 @@ done:
c, mtod(c->kue_mbuf, char *), KUE_BUFSZ, USBD_SHORT_XFER_OK,
USBD_NO_TIMEOUT, kue_rxeof);
usbd_transfer(c->kue_xfer);
+ KUE_UNLOCK(sc);
return;
}
@@ -733,26 +741,25 @@ Static void kue_txeof(xfer, priv, status)
struct kue_chain *c;
struct ifnet *ifp;
usbd_status err;
- int s;
-
- s = splimp();
c = priv;
sc = c->kue_sc;
+ KUE_LOCK(sc);
+
ifp = &sc->arpcom.ac_if;
ifp->if_timer = 0;
ifp->if_flags &= ~IFF_OACTIVE;
if (status != USBD_NORMAL_COMPLETION) {
if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
printf("kue%d: usb error on tx: %s\n", sc->kue_unit,
usbd_errstr(status));
if (status == USBD_STALLED)
usbd_clear_endpoint_stall(sc->kue_ep[KUE_ENDPT_TX]);
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
@@ -769,7 +776,7 @@ Static void kue_txeof(xfer, priv, status)
else
ifp->if_opackets++;
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
@@ -821,17 +828,23 @@ Static void kue_start(ifp)
struct mbuf *m_head = NULL;
sc = ifp->if_softc;
+ KUE_LOCK(sc);
- if (ifp->if_flags & IFF_OACTIVE)
+ if (ifp->if_flags & IFF_OACTIVE) {
+ KUE_UNLOCK(sc);
return;
+ }
IF_DEQUEUE(&ifp->if_snd, m_head);
- if (m_head == NULL)
+ if (m_head == NULL) {
+ KUE_UNLOCK(sc);
return;
+ }
if (kue_encap(sc, m_head, 0)) {
IF_PREPEND(&ifp->if_snd, m_head);
ifp->if_flags |= IFF_OACTIVE;
+ KUE_UNLOCK(sc);
return;
}
@@ -848,6 +861,7 @@ Static void kue_start(ifp)
* Set a timeout in case the chip goes out to lunch.
*/
ifp->if_timer = 5;
+ KUE_UNLOCK(sc);
return;
}
@@ -859,13 +873,13 @@ Static void kue_init(xsc)
struct ifnet *ifp = &sc->arpcom.ac_if;
struct kue_chain *c;
usbd_status err;
- int i, s;
+ int i;
+
+ KUE_LOCK(sc);
if (ifp->if_flags & IFF_RUNNING)
return;
- s = splimp();
-
/* Set MAC address */
kue_ctl(sc, KUE_CTL_WRITE, KUE_CMD_SET_MAC,
0, sc->arpcom.ac_enaddr, ETHER_ADDR_LEN);
@@ -891,14 +905,14 @@ Static void kue_init(xsc)
/* Init TX ring. */
if (kue_tx_list_init(sc) == ENOBUFS) {
printf("kue%d: tx list init failed\n", sc->kue_unit);
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
/* Init RX ring. */
if (kue_rx_list_init(sc) == ENOBUFS) {
printf("kue%d: rx list init failed\n", sc->kue_unit);
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
@@ -911,7 +925,7 @@ Static void kue_init(xsc)
if (err) {
printf("kue%d: open rx pipe failed: %s\n",
sc->kue_unit, usbd_errstr(err));
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
@@ -920,7 +934,7 @@ Static void kue_init(xsc)
if (err) {
printf("kue%d: open tx pipe failed: %s\n",
sc->kue_unit, usbd_errstr(err));
- splx(s);
+ KUE_UNLOCK(sc);
return;
}
@@ -936,7 +950,7 @@ Static void kue_init(xsc)
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
- (void)splx(s);
+ KUE_UNLOCK(sc);
return;
}
@@ -947,9 +961,9 @@ Static int kue_ioctl(ifp, command, data)
caddr_t data;
{
struct kue_softc *sc = ifp->if_softc;
- int s, error = 0;
+ int error = 0;
- s = splimp();
+ KUE_LOCK(sc);
switch(command) {
case SIOCSIFADDR:
@@ -990,7 +1004,7 @@ Static int kue_ioctl(ifp, command, data)
break;
}
- (void)splx(s);
+ KUE_UNLOCK(sc);
return(error);
}
@@ -1003,7 +1017,7 @@ Static void kue_watchdog(ifp)
usbd_status stat;
sc = ifp->if_softc;
-
+ KUE_LOCK(sc);
ifp->if_oerrors++;
printf("kue%d: watchdog timeout\n", sc->kue_unit);
@@ -1013,6 +1027,7 @@ Static void kue_watchdog(ifp)
if (ifp->if_snd.ifq_head != NULL)
kue_start(ifp);
+ KUE_UNLOCK(sc);
return;
}
@@ -1028,6 +1043,7 @@ Static void kue_stop(sc)
struct ifnet *ifp;
int i;
+ KUE_LOCK(sc);
ifp = &sc->arpcom.ac_if;
ifp->if_timer = 0;
@@ -1107,6 +1123,7 @@ Static void kue_stop(sc)
}
ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
+ KUE_UNLOCK(sc);
return;
}
OpenPOWER on IntegriCloud