aboutsummaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorBill Paul <wpaul@FreeBSD.org>2005-02-16 05:41:18 +0000
committerBill Paul <wpaul@FreeBSD.org>2005-02-16 05:41:18 +0000
commitd8f2dda739fad2bc47249f365a8d5f9de292b965 (patch)
treef3934335c485d66f4991e7d9fc75b2e17460984c /sys/dev
parent5cc540d471f885e245faf92b690fc50d61d16d17 (diff)
Notes
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/if_ndis/if_ndis.c66
-rw-r--r--sys/dev/if_ndis/if_ndisvar.h3
2 files changed, 52 insertions, 17 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index 9f94daff46dcd..836a844c74b90 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -101,6 +101,13 @@ static __stdcall void ndis_linksts (ndis_handle,
ndis_status, void *, uint32_t);
static __stdcall void ndis_linksts_done (ndis_handle);
+/* We need to wrap these functions for amd64. */
+
+static funcptr ndis_txeof_wrap;
+static funcptr ndis_rxeof_wrap;
+static funcptr ndis_linksts_wrap;
+static funcptr ndis_linksts_done_wrap;
+
static void ndis_intr (void *);
static void ndis_intrtask (void *);
static void ndis_tick (void *);
@@ -151,14 +158,27 @@ ndisdrv_modevent(mod, cmd, arg)
if (ndisdrv_loaded > 1)
break;
windrv_load(mod, (vm_offset_t)drv_data, 0);
+ windrv_wrap((funcptr)ndis_rxeof, &ndis_rxeof_wrap);
+ windrv_wrap((funcptr)ndis_txeof, &ndis_txeof_wrap);
+ windrv_wrap((funcptr)ndis_linksts, &ndis_linksts_wrap);
+ windrv_wrap((funcptr)ndis_linksts_done,
+ &ndis_linksts_done_wrap);
break;
case MOD_UNLOAD:
ndisdrv_loaded--;
if (ndisdrv_loaded > 0)
break;
windrv_unload(mod, (vm_offset_t)drv_data, 0);
+ windrv_unwrap(ndis_rxeof_wrap);
+ windrv_unwrap(ndis_txeof_wrap);
+ windrv_unwrap(ndis_linksts_wrap);
+ windrv_unwrap(ndis_linksts_done_wrap);
break;
case MOD_SHUTDOWN:
+ windrv_unwrap(ndis_rxeof_wrap);
+ windrv_unwrap(ndis_txeof_wrap);
+ windrv_unwrap(ndis_linksts_wrap);
+ windrv_unwrap(ndis_linksts_done_wrap);
break;
default:
error = EINVAL;
@@ -418,8 +438,6 @@ ndis_attach(dev)
mtx_init(&sc->ndis_mtx, "ndis softc lock",
MTX_NETWORK_LOCK, MTX_DEF);
- mtx_init(&sc->ndis_intrmtx,
- "ndis irq lock", MTX_NETWORK_LOCK, MTX_DEF);
/*
* Hook interrupt early, since calling the driver's
@@ -476,8 +494,8 @@ ndis_attach(dev)
ndis_convert_res(sc);
/* Install our RX and TX interrupt handlers. */
- sc->ndis_block->nmb_senddone_func = ndis_txeof;
- sc->ndis_block->nmb_pktind_func = ndis_rxeof;
+ sc->ndis_block->nmb_senddone_func = ndis_txeof_wrap;
+ sc->ndis_block->nmb_pktind_func = ndis_rxeof_wrap;
/* Call driver's init routine. */
if (ndis_init_nic(sc)) {
@@ -511,6 +529,18 @@ ndis_attach(dev)
sc->ndis_txarray = malloc(sizeof(ndis_packet *) *
sc->ndis_maxpkts, M_DEVBUF, M_NOWAIT|M_ZERO);
+ /* Allocate a pool of ndis_packets for TX encapsulation. */
+
+ NdisAllocatePacketPool(&i, &sc->ndis_txpool,
+ sc->ndis_maxpkts, PROTOCOL_RESERVED_SIZE_IN_PACKET);
+
+ if (i != NDIS_STATUS_SUCCESS) {
+ sc->ndis_txpool = NULL;
+ device_printf(dev, "failed to allocate TX packet pool");
+ error = ENOMEM;
+ goto fail;
+ }
+
sc->ndis_txpending = sc->ndis_maxpkts;
sc->ndis_oidcnt = 0;
@@ -748,8 +778,8 @@ nonettypes:
}
/* Override the status handler so we can detect link changes. */
- sc->ndis_block->nmb_status_func = ndis_linksts;
- sc->ndis_block->nmb_statusdone_func = ndis_linksts_done;
+ sc->ndis_block->nmb_status_func = ndis_linksts_wrap;
+ sc->ndis_block->nmb_statusdone_func = ndis_linksts_done_wrap;
fail:
if (error)
ndis_detach(dev);
@@ -778,8 +808,6 @@ ndis_detach(dev)
sc = device_get_softc(dev);
KASSERT(mtx_initialized(&sc->ndis_mtx),
("ndis mutex not initialized"));
- KASSERT(mtx_initialized(&sc->ndis_intrmtx),
- ("ndis interrupt mutex not initialized"));
NDIS_LOCK(sc);
ifp = &sc->arpcom.ac_if;
ifp->if_flags &= ~IFF_UP;
@@ -822,6 +850,9 @@ ndis_detach(dev)
if (!sc->ndis_80211)
ifmedia_removeall(&sc->ifmedia);
+ if (sc->ndis_txpool != NULL)
+ NdisFreePacketPool(sc->ndis_txpool);
+
ndis_unload_driver(sc);
/* Destroy the PDO for this device. */
@@ -839,7 +870,6 @@ ndis_detach(dev)
#endif
mtx_destroy(&sc->ndis_mtx);
- mtx_destroy(&sc->ndis_intrmtx);
return(0);
}
@@ -1083,9 +1113,8 @@ ndis_intrtask(arg)
irql = KeRaiseIrql(DISPATCH_LEVEL);
ndis_intrhand(sc);
KeLowerIrql(irql);
- mtx_lock(&sc->ndis_intrmtx);
+
ndis_enable_intr(sc);
- mtx_unlock(&sc->ndis_intrmtx);
return;
}
@@ -1098,21 +1127,24 @@ ndis_intr(arg)
struct ifnet *ifp;
int is_our_intr = 0;
int call_isr = 0;
+ uint8_t irql;
+ ndis_miniport_interrupt *intr;
sc = arg;
ifp = &sc->arpcom.ac_if;
+ intr = sc->ndis_block->nmb_interrupt;
if (sc->ndis_block->nmb_miniportadapterctx == NULL)
return;
- mtx_lock(&sc->ndis_intrmtx);
+ KeAcquireSpinLock(&intr->ni_dpccountlock, &irql);
if (sc->ndis_block->nmb_interrupt->ni_isrreq == TRUE)
ndis_isr(sc, &is_our_intr, &call_isr);
else {
ndis_disable_intr(sc);
call_isr = 1;
}
- mtx_unlock(&sc->ndis_intrmtx);
+ KeReleaseSpinLock(&intr->ni_dpccountlock, irql);
if ((is_our_intr || call_isr))
ndis_sched(ndis_intrtask, ifp->if_softc, NDIS_SWI);
@@ -1258,7 +1290,7 @@ ndis_start(ifp)
struct mbuf *m = NULL;
ndis_packet **p0 = NULL, *p = NULL;
ndis_tcpip_csum *csum;
- int pcnt = 0;
+ int pcnt = 0, status;
sc = ifp->if_softc;
@@ -1280,7 +1312,11 @@ ndis_start(ifp)
if (m == NULL)
break;
- sc->ndis_txarray[sc->ndis_txidx] = NULL;
+ NdisAllocatePacket(&status,
+ &sc->ndis_txarray[sc->ndis_txidx], sc->ndis_txpool);
+
+ if (status != NDIS_STATUS_SUCCESS)
+ break;
if (ndis_mtop(m, &sc->ndis_txarray[sc->ndis_txidx])) {
#if __FreeBSD_version >= 502114
diff --git a/sys/dev/if_ndis/if_ndisvar.h b/sys/dev/if_ndis/if_ndisvar.h
index 6736024a67228..0936aaf7fc23a 100644
--- a/sys/dev/if_ndis/if_ndisvar.h
+++ b/sys/dev/if_ndis/if_ndisvar.h
@@ -94,7 +94,6 @@ struct ndis_softc {
struct resource_list ndis_rl;
int ndis_rescnt;
struct mtx ndis_mtx;
- struct mtx ndis_intrmtx;
device_t ndis_dev;
int ndis_unit;
ndis_miniport_block *ndis_block;
@@ -107,6 +106,7 @@ struct ndis_softc {
int ndis_txidx;
int ndis_txpending;
ndis_packet **ndis_txarray;
+ ndis_handle ndis_txpool;
int ndis_sc;
ndis_cfg *ndis_regvals;
struct nch ndis_cfglist_head;
@@ -130,7 +130,6 @@ struct ndis_softc {
bus_dmamap_t *ndis_mmaps;
bus_dmamap_t *ndis_tmaps;
int ndis_mmapcnt;
- device_object *ndis_pdo;
};
#define NDIS_LOCK(_sc) mtx_lock(&(_sc)->ndis_mtx)