aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/usb
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2007-07-09 16:58:07 +0000
committerWarner Losh <imp@FreeBSD.org>2007-07-09 16:58:07 +0000
commitf129c7fd08db0dd4aff6b3a41bdf4b21bc410f50 (patch)
treeff02e52f127891d8730cf47817b91744777dae26 /sys/dev/usb
parent80e9f71ab5ca810b40711c6a4a78f4579ae14427 (diff)
Notes
Diffstat (limited to 'sys/dev/usb')
-rw-r--r--sys/dev/usb/if_rue.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/sys/dev/usb/if_rue.c b/sys/dev/usb/if_rue.c
index 6f4b2679267cc..4449f7d60d9ca 100644
--- a/sys/dev/usb/if_rue.c
+++ b/sys/dev/usb/if_rue.c
@@ -142,6 +142,7 @@ static void rue_intr(usbd_xfer_handle, usbd_private_handle, usbd_status);
static void rue_rxeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
static void rue_txeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
static void rue_tick(void *);
+static void rue_tick_task(void *);
static void rue_rxstart(struct ifnet *);
static void rue_start(struct ifnet *);
static int rue_ioctl(struct ifnet *, u_long, caddr_t);
@@ -594,6 +595,8 @@ rue_attach(device_t self)
goto error;
}
+ usb_init_task(&sc->rue_tick_task, rue_tick_task, sc);
+
err = usbd_device2interface_handle(uaa->device, RUE_IFACE_IDX, &iface);
if (err) {
device_printf(sc->rue_dev, "getting interface handle failed\n");
@@ -704,6 +707,7 @@ rue_detach(device_t dev)
sc->rue_dying = 1;
untimeout(rue_tick, sc, sc->rue_stat_ch);
+ usb_rem_task(sc->rue_udev, &sc->rue_tick_task);
ether_ifdetach(ifp);
if_free(ifp);
@@ -916,6 +920,20 @@ rue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
static void
rue_tick(void *xsc)
{
+ struct rue_softc *sc = xsc;
+
+ if (sc == NULL)
+ return;
+ if (sc->rue_dying)
+ return;
+
+ /* Perform periodic stuff in process context */
+ usb_add_task(sc->rue_udev, &sc->rue_tick_task, USB_TASKQ_DRIVER);
+}
+
+static void
+rue_tick_task(void *xsc)
+{
struct rue_softc *sc = xsc;
struct ifnet *ifp;
struct mii_data *mii;