summaryrefslogtreecommitdiffstats
path: root/sys/dev/if_ndis
diff options
context:
space:
mode:
authorweongyo <weongyo@FreeBSD.org>2009-03-07 07:26:22 +0000
committerweongyo <weongyo@FreeBSD.org>2009-03-07 07:26:22 +0000
commit6d523cd42af824d128b343edb51f35a859902554 (patch)
tree2e7363befdd88ff9363f94e0ec33120a942d098f /sys/dev/if_ndis
parent75dde6e038bfb963bde327a29d4eb13ee9f8f294 (diff)
downloadFreeBSD-src-6d523cd42af824d128b343edb51f35a859902554.zip
FreeBSD-src-6d523cd42af824d128b343edb51f35a859902554.tar.gz
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
Diffstat (limited to 'sys/dev/if_ndis')
-rw-r--r--sys/dev/if_ndis/if_ndis.c31
-rw-r--r--sys/dev/if_ndis/if_ndis_pccard.c6
-rw-r--r--sys/dev/if_ndis/if_ndis_pci.c4
-rw-r--r--sys/dev/if_ndis/if_ndis_usb.c77
-rw-r--r--sys/dev/if_ndis/if_ndisvar.h63
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 d20308f..d6fc925 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 d84550a..70c57a3 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 afadd8a..3714718 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 1de308d..79f104f 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 6b6a450..c661491 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)
OpenPOWER on IntegriCloud