Apparently, the probe routine in if_ndis_usb.c can be called twice
for a given device in some circumstances, so move the PDO creation to the attach routine so we don't end up creating two PDOs. Also, when we skip the call to ndis_convert_res() in if_ndis.c:ndis_attach(), initialize sc->ndis_block->nmb_rlist to NULL. We don't explicitly zero the miniport block, so this will make sure ndis_unload_driver() does the right thing.
This commit is contained in:
parent
b5521d6df7
commit
9ad2b03bb5
@ -508,6 +508,8 @@ ndis_attach(dev)
|
|||||||
/* Do resource conversion. */
|
/* Do resource conversion. */
|
||||||
if (sc->ndis_iftype == PCMCIABus || sc->ndis_iftype == PCIBus)
|
if (sc->ndis_iftype == PCMCIABus || sc->ndis_iftype == PCIBus)
|
||||||
ndis_convert_res(sc);
|
ndis_convert_res(sc);
|
||||||
|
else
|
||||||
|
sc->ndis_block->nmb_rlist = NULL;
|
||||||
|
|
||||||
/* Install our RX and TX interrupt handlers. */
|
/* Install our RX and TX interrupt handlers. */
|
||||||
sc->ndis_block->nmb_senddone_func = ndis_txeof_wrap;
|
sc->ndis_block->nmb_senddone_func = ndis_txeof_wrap;
|
||||||
|
@ -129,18 +129,10 @@ DRIVER_MODULE(ndis, uhub, ndis_driver, ndis_devclass, ndisdrv_modevent, 0);
|
|||||||
USB_MATCH(ndisusb)
|
USB_MATCH(ndisusb)
|
||||||
{
|
{
|
||||||
USB_MATCH_START(ndisusb, uaa);
|
USB_MATCH_START(ndisusb, uaa);
|
||||||
driver_object *drv;
|
|
||||||
|
|
||||||
drv = windrv_lookup(NULL, "USB Bus");
|
if (windrv_lookup(NULL, "USB Bus") == NULL)
|
||||||
if (drv == NULL)
|
|
||||||
return(UMATCH_NONE);
|
return(UMATCH_NONE);
|
||||||
|
|
||||||
if (0) {
|
|
||||||
/* Create PDO for this device instance */
|
|
||||||
windrv_create_pdo(drv, self);
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uaa->iface != NULL)
|
if (uaa->iface != NULL)
|
||||||
return(UMATCH_NONE);
|
return(UMATCH_NONE);
|
||||||
|
|
||||||
@ -151,11 +143,17 @@ USB_ATTACH(ndisusb)
|
|||||||
{
|
{
|
||||||
USB_ATTACH_START(ndisusb, dummy, uaa);
|
USB_ATTACH_START(ndisusb, dummy, uaa);
|
||||||
struct ndis_softc *sc;
|
struct ndis_softc *sc;
|
||||||
|
driver_object *drv;
|
||||||
|
|
||||||
sc = (struct ndis_softc *)dummy;
|
sc = (struct ndis_softc *)dummy;
|
||||||
|
|
||||||
sc->ndis_dev = self;
|
sc->ndis_dev = self;
|
||||||
|
|
||||||
|
/* Create PDO for this device instance */
|
||||||
|
|
||||||
|
drv = windrv_lookup(NULL, "USB Bus");
|
||||||
|
windrv_create_pdo(drv, self);
|
||||||
|
|
||||||
if (ndis_attach(self) != 0)
|
if (ndis_attach(self) != 0)
|
||||||
USB_ATTACH_ERROR_RETURN;
|
USB_ATTACH_ERROR_RETURN;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user