diff options
author | Weongyo Jeong <weongyo@FreeBSD.org> | 2009-03-07 07:26:22 +0000 |
---|---|---|
committer | Weongyo Jeong <weongyo@FreeBSD.org> | 2009-03-07 07:26:22 +0000 |
commit | 6affafd09862d9c5113b56cfa148353d55dab261 (patch) | |
tree | 2e7363befdd88ff9363f94e0ec33120a942d098f /sys/dev/if_ndis | |
parent | 9d875e6973c5ae95ad82e339fb39da426e24bac0 (diff) | |
download | src-6affafd09862d9c5113b56cfa148353d55dab261.tar.gz src-6affafd09862d9c5113b56cfa148353d55dab261.zip |
o port NDIS USB support from USB1 to the new usb(USB2).
o implement URB_FUNCTION_ABORT_PIPE handling.
o remove unused code related with canceling the timer list for USB
drivers.
o whitespace cleanup and style(9)
Obtained from: hps's original patch
Notes
Notes:
svn path=/head/; revision=189488
Diffstat (limited to 'sys/dev/if_ndis')
-rw-r--r-- | sys/dev/if_ndis/if_ndis.c | 31 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndis_pccard.c | 6 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndis_pci.c | 4 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndis_usb.c | 77 | ||||
-rw-r--r-- | sys/dev/if_ndis/if_ndisvar.h | 63 |
5 files changed, 81 insertions, 100 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c index d20308f0fc5d..d6fc925cb80b 100644 --- a/sys/dev/if_ndis/if_ndis.c +++ b/sys/dev/if_ndis/if_ndis.c @@ -74,8 +74,8 @@ __FBSDID("$FreeBSD$"); #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> -#include <legacy/dev/usb/usb.h> -#include <legacy/dev/usb/usbdi.h> +#include <dev/usb/usb.h> +#include <dev/usb/usb_core.h> #include <compat/ndis/pe_var.h> #include <compat/ndis/cfg_var.h> @@ -557,9 +557,9 @@ ndis_attach(dev) mtx_init(&sc->ndis_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); KeInitializeSpinLock(&sc->ndis_rxlock); - KeInitializeSpinLock(&sc->ndisusb_xferlock); + KeInitializeSpinLock(&sc->ndisusb_xferdonelock); InitializeListHead(&sc->ndis_shlist); - InitializeListHead(&sc->ndisusb_xferlist); + InitializeListHead(&sc->ndisusb_xferdonelist); callout_init(&sc->ndis_stat_callout, CALLOUT_MPSAFE); if (sc->ndis_iftype == PCMCIABus) { @@ -623,7 +623,8 @@ ndis_attach(dev) sc->ndis_startitem = IoAllocateWorkItem(sc->ndis_block->nmb_deviceobj); sc->ndis_resetitem = IoAllocateWorkItem(sc->ndis_block->nmb_deviceobj); sc->ndis_inputitem = IoAllocateWorkItem(sc->ndis_block->nmb_deviceobj); - sc->ndisusb_xferitem = IoAllocateWorkItem(sc->ndis_block->nmb_deviceobj); + sc->ndisusb_xferdoneitem = + IoAllocateWorkItem(sc->ndis_block->nmb_deviceobj); KeInitializeDpc(&sc->ndis_rxdpc, ndis_rxeof_xfr_wrap, sc->ndis_block); /* Call driver's init routine. */ @@ -718,8 +719,6 @@ ndis_attach(dev) if_initname(ifp, device_get_name(dev), device_get_unit(dev)); ifp->if_mtu = ETHERMTU; ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; - if (sc->ndis_iftype == PNPBus) - ifp->if_flags |= IFF_NEEDSGIANT; ifp->if_ioctl = ndis_ioctl; ifp->if_start = ndis_start; ifp->if_init = ndis_init; @@ -966,8 +965,10 @@ fail: if (sc->ndis_iftype == PNPBus && ndisusb_halt == 0) return (error); + DPRINTF(("attach done.\n")); /* We're done talking to the NIC for now; halt it. */ ndis_halt_nic(sc); + DPRINTF(("halting done.\n")); return(error); } @@ -1058,8 +1059,8 @@ ndis_detach(dev) IoFreeWorkItem(sc->ndis_resetitem); if (sc->ndis_inputitem != NULL) IoFreeWorkItem(sc->ndis_inputitem); - if (sc->ndisusb_xferitem != NULL) - IoFreeWorkItem(sc->ndisusb_xferitem); + if (sc->ndisusb_xferdoneitem != NULL) + IoFreeWorkItem(sc->ndisusb_xferdoneitem); bus_generic_detach(dev); ndis_unload_driver(sc); @@ -1569,7 +1570,7 @@ ndis_txeof(adapter, packet, status) ndis_free_packet(packet); m_freem(m); - NDISMTX_LOCK(sc); + NDIS_LOCK(sc); sc->ndis_txarray[idx] = NULL; sc->ndis_txpending++; @@ -1581,7 +1582,7 @@ ndis_txeof(adapter, packet, status) sc->ndis_tx_timer = 0; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; - NDISMTX_UNLOCK(sc); + NDIS_UNLOCK(sc); IoQueueWorkItem(sc->ndis_startitem, (io_workitem_func)ndis_starttask_wrap, @@ -1606,9 +1607,9 @@ ndis_linksts(adapter, status, sbuf, slen) /* Event list is all full up, drop this one. */ - NDISMTX_LOCK(sc); + NDIS_LOCK(sc); if (sc->ndis_evt[sc->ndis_evtpidx].ne_sts) { - NDISMTX_UNLOCK(sc); + NDIS_UNLOCK(sc); return; } @@ -1618,7 +1619,7 @@ ndis_linksts(adapter, status, sbuf, slen) sc->ndis_evt[sc->ndis_evtpidx].ne_buf = malloc(slen, M_TEMP, M_NOWAIT); if (sc->ndis_evt[sc->ndis_evtpidx].ne_buf == NULL) { - NDISMTX_UNLOCK(sc); + NDIS_UNLOCK(sc); return; } bcopy((char *)sbuf, @@ -1627,7 +1628,7 @@ ndis_linksts(adapter, status, sbuf, slen) sc->ndis_evt[sc->ndis_evtpidx].ne_sts = status; sc->ndis_evt[sc->ndis_evtpidx].ne_len = slen; NDIS_EVTINC(sc->ndis_evtpidx); - NDISMTX_UNLOCK(sc); + NDIS_UNLOCK(sc); return; } diff --git a/sys/dev/if_ndis/if_ndis_pccard.c b/sys/dev/if_ndis/if_ndis_pccard.c index d84550a81531..70c57a393974 100644 --- a/sys/dev/if_ndis/if_ndis_pccard.c +++ b/sys/dev/if_ndis/if_ndis_pccard.c @@ -51,10 +51,10 @@ __FBSDID("$FreeBSD$"); #include <sys/bus.h> #include <sys/rman.h> -#include <net80211/ieee80211_var.h> +#include <dev/usb/usb.h> +#include <dev/usb/usb_core.h> -#include <legacy/dev/usb/usb.h> -#include <legacy/dev/usb/usbdi.h> +#include <net80211/ieee80211_var.h> #include <compat/ndis/pe_var.h> #include <compat/ndis/cfg_var.h> diff --git a/sys/dev/if_ndis/if_ndis_pci.c b/sys/dev/if_ndis/if_ndis_pci.c index afadd8ab27c4..371471867ada 100644 --- a/sys/dev/if_ndis/if_ndis_pci.c +++ b/sys/dev/if_ndis/if_ndis_pci.c @@ -54,8 +54,8 @@ __FBSDID("$FreeBSD$"); #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> -#include <legacy/dev/usb/usb.h> -#include <legacy/dev/usb/usbdi.h> +#include <dev/usb/usb.h> +#include <dev/usb/usb_core.h> #include <compat/ndis/pe_var.h> #include <compat/ndis/cfg_var.h> diff --git a/sys/dev/if_ndis/if_ndis_usb.c b/sys/dev/if_ndis/if_ndis_usb.c index 1de308db48e2..79f104f2723e 100644 --- a/sys/dev/if_ndis/if_ndis_usb.c +++ b/sys/dev/if_ndis/if_ndis_usb.c @@ -52,11 +52,8 @@ __FBSDID("$FreeBSD$"); #include <sys/bus.h> #include <machine/bus.h> -#include <legacy/dev/usb/usb.h> -#include <legacy/dev/usb/usbdi.h> -#include <legacy/dev/usb/usbdi_util.h> -#include <legacy/dev/usb/usbdivar.h> -#include "usbdevs.h" +#include <dev/usb/usb.h> +#include <dev/usb/usb_core.h> #include <net80211/ieee80211_var.h> @@ -114,7 +111,7 @@ DRIVER_MODULE(ndis, uhub, ndis_driver, ndis_devclass, ndisdrv_modevent, 0); static int ndisusb_devcompare(interface_type bustype, struct ndis_usb_type *t, device_t dev) { - struct usb_attach_arg *uaa; + struct usb2_attach_arg *uaa; if (bustype != PNPBus) return (FALSE); @@ -122,8 +119,8 @@ ndisusb_devcompare(interface_type bustype, struct ndis_usb_type *t, device_t dev uaa = device_get_ivars(dev); while (t->ndis_name != NULL) { - if ((uaa->vendor == t->ndis_vid) && - (uaa->product == t->ndis_did)) { + if ((uaa->info.idVendor == t->ndis_vid) && + (uaa->info.idProduct == t->ndis_did)) { device_set_desc(dev, t->ndis_name); return (TRUE); } @@ -137,65 +134,57 @@ static int ndisusb_match(device_t self) { struct drvdb_ent *db; - struct usb_attach_arg *uaa = device_get_ivars(self); + struct usb2_attach_arg *uaa = device_get_ivars(self); - if (windrv_lookup(0, "USB Bus") == NULL) - return (UMATCH_NONE); + if (uaa->usb2_mode != USB_MODE_HOST) + return (ENXIO); + if (uaa->info.bConfigIndex != NDISUSB_CONFIG_NO) + return (ENXIO); + if (uaa->info.bIfaceIndex != NDISUSB_IFACE_INDEX) + return (ENXIO); - if (uaa->iface != NULL) - return (UMATCH_NONE); + if (windrv_lookup(0, "USB Bus") == NULL) + return (ENXIO); db = windrv_match((matchfuncptr)ndisusb_devcompare, self); if (db == NULL) - return (UMATCH_NONE); + return (ENXIO); + uaa->driver_info = db; - return (UMATCH_VENDOR_PRODUCT); + return (0); } static int ndisusb_attach(device_t self) { - struct drvdb_ent *db; + const struct drvdb_ent *db; struct ndisusb_softc *dummy = device_get_softc(self); - struct usb_attach_arg *uaa = device_get_ivars(self); + struct usb2_attach_arg *uaa = device_get_ivars(self); struct ndis_softc *sc; struct ndis_usb_type *t; driver_object *drv; int devidx = 0; - usbd_status status; + db = uaa->driver_info; sc = (struct ndis_softc *)dummy; - - if (uaa->device == NULL) - return ENXIO; - - db = windrv_match((matchfuncptr)ndisusb_devcompare, self); - if (db == NULL) - return (ENXIO); - sc->ndis_dev = self; sc->ndis_dobj = db->windrv_object; sc->ndis_regvals = db->windrv_regvals; sc->ndis_iftype = PNPBus; + sc->ndisusb_dev = uaa->device; /* Create PDO for this device instance */ drv = windrv_lookup(0, "USB Bus"); windrv_create_pdo(drv, self); - status = usbd_set_config_no(uaa->device, NDISUSB_CONFIG_NO, 0); - if (status != USBD_NORMAL_COMPLETION) { - device_printf(self, "setting config no failed\n"); - return (ENXIO); - } - /* Figure out exactly which device we matched. */ t = db->windrv_devlist; while (t->ndis_name != NULL) { - if ((uaa->vendor == t->ndis_vid) && - (uaa->product == t->ndis_did)) { + if ((uaa->info.idVendor == t->ndis_vid) && + (uaa->info.idProduct == t->ndis_did)) { sc->ndis_devidx = devidx; break; } @@ -206,8 +195,6 @@ ndisusb_attach(device_t self) if (ndis_attach(self) != 0) return ENXIO; - usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, uaa->device, self); - return 0; } @@ -216,28 +203,16 @@ ndisusb_detach(device_t self) { int i; struct ndis_softc *sc = device_get_softc(self); - struct usb_attach_arg *uaa = device_get_ivars(self); + struct ndisusb_ep *ne;; sc->ndisusb_status |= NDISUSB_STATUS_DETACH; for (i = 0; i < NDISUSB_ENDPT_MAX; i++) { - if (sc->ndisusb_ep[i] == NULL) - continue; - - usbd_abort_pipe(sc->ndisusb_ep[i]); - usbd_close_pipe(sc->ndisusb_ep[i]); - sc->ndisusb_ep[i] = NULL; - } - - if (sc->ndisusb_iin_buf != NULL) { - free(sc->ndisusb_iin_buf, M_USBDEV); - sc->ndisusb_iin_buf = NULL; + ne = &sc->ndisusb_ep[i]; + usb2_transfer_unsetup(ne->ne_xfer, 1); } ndis_pnpevent_nic(self, NDIS_PNP_EVENT_SURPRISE_REMOVED); - ndis_cancel_timerlist(); - - usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, uaa->device, self); return ndis_detach(self); } diff --git a/sys/dev/if_ndis/if_ndisvar.h b/sys/dev/if_ndis/if_ndisvar.h index 6b6a450bd544..c661491c4b4d 100644 --- a/sys/dev/if_ndis/if_ndisvar.h +++ b/sys/dev/if_ndis/if_ndisvar.h @@ -113,15 +113,33 @@ struct ndis_vap { }; #define NDIS_VAP(vap) ((struct ndis_vap *)(vap)) -#define NDISUSB_CONFIG_NO 1 +#define NDISUSB_CONFIG_NO 0 #define NDISUSB_IFACE_INDEX 0 +/* XXX at USB2 there's no USBD_NO_TIMEOUT macro anymore */ +#define NDISUSB_NO_TIMEOUT 0 #define NDISUSB_INTR_TIMEOUT 1000 #define NDISUSB_TX_TIMEOUT 10000 +struct ndisusb_xfer; +struct ndisusb_ep { + struct usb2_xfer *ne_xfer[1]; + list_entry ne_active; + list_entry ne_pending; + kspin_lock ne_lock; + uint8_t ne_dirin; +}; struct ndisusb_xfer { - usbd_xfer_handle nx_xfer; - usbd_private_handle nx_priv; - usbd_status nx_status; - list_entry nx_xferlist; + struct ndisusb_ep *nx_ep; + void *nx_priv; + uint8_t *nx_urbbuf; + uint32_t nx_urbactlen; + uint32_t nx_urblen; + uint8_t nx_shortxfer; + list_entry nx_next; +}; +struct ndisusb_xferdone { + struct ndisusb_xfer *nd_xfer; + usb2_error_t nd_status; + list_entry nd_donelist; }; struct ndis_softc { @@ -201,31 +219,18 @@ struct ndis_softc { int ndis_tx_timer; int ndis_hang_timer; - io_workitem *ndisusb_xferitem; - list_entry ndisusb_xferlist; - kspin_lock ndisusb_xferlock; -#define NDISUSB_ENDPT_BOUT 0 -#define NDISUSB_ENDPT_BIN 1 -#define NDISUSB_ENDPT_IIN 2 -#define NDISUSB_ENDPT_IOUT 3 -#define NDISUSB_ENDPT_MAX 4 - usbd_pipe_handle ndisusb_ep[NDISUSB_ENDPT_MAX]; - char *ndisusb_iin_buf; + struct usb2_device *ndisusb_dev; +#define NDISUSB_GET_ENDPT(addr) \ + ((UE_GET_DIR(addr) >> 7) | (UE_GET_ADDR(addr) << 1)) +#define NDISUSB_ENDPT_MAX ((UE_ADDR + 1) * 2) + struct ndisusb_ep ndisusb_ep[NDISUSB_ENDPT_MAX]; + io_workitem *ndisusb_xferdoneitem; + list_entry ndisusb_xferdonelist; + kspin_lock ndisusb_xferdonelock; int ndisusb_status; #define NDISUSB_STATUS_DETACH 0x1 }; -#define NDISMTX_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx) -#define NDISMTX_UNLOCK(_sc) mtx_unlock(&(_sc)->ndis_mtx) -#define NDISUSB_LOCK(_sc) mtx_lock(&Giant) -#define NDISUSB_UNLOCK(_sc) mtx_unlock(&Giant) -#define NDIS_LOCK(_sc) do { \ - if ((_sc)->ndis_iftype == PNPBus) \ - NDISUSB_LOCK(_sc); \ - NDISMTX_LOCK(_sc); \ -} while (0) -#define NDIS_UNLOCK(_sc) do { \ - if ((_sc)->ndis_iftype == PNPBus) \ - NDISUSB_UNLOCK(_sc); \ - NDISMTX_UNLOCK(_sc); \ -} while (0) +#define NDIS_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx) +#define NDIS_UNLOCK(_sc) mtx_unlock(&(_sc)->ndis_mtx) +#define NDIS_LOCK_ASSERT(_sc, t) mtx_assert(&(_sc)->ndis_mtx, t) |