summaryrefslogtreecommitdiffstats
path: root/sys/dev/if_ndis/if_ndis.c
diff options
context:
space:
mode:
authorwpaul <wpaul@FreeBSD.org>2003-12-31 04:12:57 +0000
committerwpaul <wpaul@FreeBSD.org>2003-12-31 04:12:57 +0000
commitb56a5ed44ae3babdfb15e99f87f9c85eaf3b2115 (patch)
tree0844aefe084cd0b3cd16bb60fbf890354e23e4f3 /sys/dev/if_ndis/if_ndis.c
parente11aa2c75c2d358949bc563948b3a2525e933560 (diff)
downloadFreeBSD-src-b56a5ed44ae3babdfb15e99f87f9c85eaf3b2115.zip
FreeBSD-src-b56a5ed44ae3babdfb15e99f87f9c85eaf3b2115.tar.gz
- subr_ntoskrnl.c: improve the _fastcall hack based on suggestions from
peter and jhb: use __volatile__ to prevent gcc from possibly reordering code, use a null inline instruction instead of a no-op movl (I would have done this myself if I knew it was allowed) and combine two register assignments into a single asm statement. - if_ndis.c: set the NDIS_STATUS_PENDING flag on all outgoing packets in ndis_start(), make the resource allocation code a little smarter about how it selects the altmem range, correct a lock order reversal in ndis_tick().
Diffstat (limited to 'sys/dev/if_ndis/if_ndis.c')
-rw-r--r--sys/dev/if_ndis/if_ndis.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index fec6034..be89d35 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -247,35 +247,36 @@ ndis_attach(dev)
}
break;
case SYS_RES_MEMORY:
- if (sc->ndis_res_altmem != NULL) {
+ if (sc->ndis_res_altmem != NULL &&
+ sc->ndis_res_mem != NULL) {
printf ("ndis%d: too many memory "
"resources", sc->ndis_unit);
error = ENXIO;
goto fail;
}
- if (sc->ndis_res_mem == NULL) {
- sc->ndis_mem_rid = rle->rid;
- sc->ndis_res_mem =
+ if (rle->rid == PCIR_BAR(2)) {
+ sc->ndis_altmem_rid = rle->rid;
+ sc->ndis_res_altmem =
bus_alloc_resource(dev,
SYS_RES_MEMORY,
- &sc->ndis_mem_rid,
+ &sc->ndis_altmem_rid,
0, ~0, 1, RF_ACTIVE);
- if (sc->ndis_res_mem == NULL) {
+ if (sc->ndis_res_altmem == NULL) {
printf("ndis%d: couldn't map "
- "memory\n", unit);
+ "alt memory\n", unit);
error = ENXIO;
goto fail;
}
} else {
- sc->ndis_altmem_rid = rle->rid;
- sc->ndis_res_altmem =
+ sc->ndis_mem_rid = rle->rid;
+ sc->ndis_res_mem =
bus_alloc_resource(dev,
SYS_RES_MEMORY,
- &sc->ndis_altmem_rid,
+ &sc->ndis_mem_rid,
0, ~0, 1, RF_ACTIVE);
- if (sc->ndis_res_altmem == NULL) {
+ if (sc->ndis_res_mem == NULL) {
printf("ndis%d: couldn't map "
- "alt memory\n", unit);
+ "memory\n", unit);
error = ENXIO;
goto fail;
}
@@ -841,12 +842,13 @@ ndis_tick(xsc)
int error, len;
sc = xsc;
- NDIS_LOCK(sc);
len = sizeof(linkstate);
error = ndis_get_info(sc, OID_GEN_MEDIA_CONNECT_STATUS,
(void *)&linkstate, &len);
+ NDIS_LOCK(sc);
+
if (linkstate == nmc_connected)
sc->ndis_link = 1;
@@ -944,14 +946,15 @@ ndis_start(ifp)
* so we can free it later.
*/
- (sc->ndis_txarray[sc->ndis_txidx])->np_txidx = sc->ndis_txidx;
- (sc->ndis_txarray[sc->ndis_txidx])->np_m0 = m;
+ p = sc->ndis_txarray[sc->ndis_txidx];
+ p->np_txidx = sc->ndis_txidx;
+ p->np_m0 = m;
+ p->np_oob.npo_status = NDIS_STATUS_PENDING;
/*
* Do scatter/gather processing, if driver requested it.
*/
if (sc->ndis_sc) {
- p = sc->ndis_txarray[sc->ndis_txidx];
bus_dmamap_load_mbuf(sc->ndis_ttag,
sc->ndis_tmaps[sc->ndis_txidx], m,
ndis_map_sclist, &p->np_sclist, BUS_DMA_NOWAIT);
OpenPOWER on IntegriCloud