diff options
author | wpaul <wpaul@FreeBSD.org> | 2003-12-31 04:12:57 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 2003-12-31 04:12:57 +0000 |
commit | b56a5ed44ae3babdfb15e99f87f9c85eaf3b2115 (patch) | |
tree | 0844aefe084cd0b3cd16bb60fbf890354e23e4f3 /sys/dev/if_ndis/if_ndis.c | |
parent | e11aa2c75c2d358949bc563948b3a2525e933560 (diff) | |
download | FreeBSD-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.c | 35 |
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); |