summaryrefslogtreecommitdiffstats
path: root/sys/dev/if_ndis
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/if_ndis')
-rw-r--r--sys/dev/if_ndis/if_ndis.c126
1 files changed, 19 insertions, 107 deletions
diff --git a/sys/dev/if_ndis/if_ndis.c b/sys/dev/if_ndis/if_ndis.c
index f7467d9..11ddac1 100644
--- a/sys/dev/if_ndis/if_ndis.c
+++ b/sys/dev/if_ndis/if_ndis.c
@@ -87,14 +87,12 @@ int ndis_suspend (device_t);
int ndis_resume (device_t);
void ndis_shutdown (device_t);
-static void ndis_serial_input (void *);
+static void ndis_input (void *);
static __stdcall void ndis_txeof (ndis_handle,
ndis_packet *, ndis_status);
static __stdcall void ndis_rxeof (ndis_handle,
ndis_packet **, uint32_t);
-static __stdcall void ndis_rxeof_serial (ndis_handle,
- ndis_packet **, uint32_t);
static __stdcall void ndis_linksts (ndis_handle,
ndis_status, void *, uint32_t);
static __stdcall void ndis_linksts_done (ndis_handle);
@@ -421,14 +419,6 @@ ndis_attach(dev)
}
/*
- * Check to see if this driver is deserialized or
- * not. If not, we need to do use a special serialized
- * receive handler.
- */
- if (!(sc->ndis_block.nmb_flags & NDIS_ATTRIBUTE_DESERIALIZE))
- sc->ndis_block.nmb_pktind_func = ndis_rxeof_serial;
-
- /*
* Get station address from the driver.
*/
len = sizeof(eaddr);
@@ -783,6 +773,20 @@ ndis_resume(dev)
return(0);
}
+static void
+ndis_input(arg)
+ void *arg;
+{
+ struct mbuf *m;
+ struct ifnet *ifp;
+
+ m = arg;
+ ifp = m->m_pkthdr.rcvif;
+ (*ifp->if_input)(ifp, m);
+
+ return;
+}
+
/*
* A frame has been uploaded: pass the resulting mbuf chain up to
* the higher level protocols.
@@ -801,107 +805,15 @@ ndis_resume(dev)
* wants to maintain ownership of the packet. In this case, we have to
* copy the packet data into local storage and let the driver keep the
* packet.
- */
-__stdcall static void
-ndis_rxeof(adapter, packets, pktcnt)
- ndis_handle adapter;
- ndis_packet **packets;
- uint32_t pktcnt;
-{
- struct ndis_softc *sc;
- ndis_miniport_block *block;
- ndis_packet *p;
- uint32_t s;
- ndis_tcpip_csum *csum;
- struct ifnet *ifp;
- struct mbuf *m0, *m;
- int i;
-
- block = (ndis_miniport_block *)adapter;
- sc = (struct ndis_softc *)(block->nmb_ifp);
- ifp = block->nmb_ifp;
-
- for (i = 0; i < pktcnt; i++) {
- p = packets[i];
- /* Stash the softc here so ptom can use it. */
- p->np_softc = sc;
- if (ndis_ptom(&m0, p)) {
- device_printf (sc->ndis_dev, "ptom failed\n");
- if (p->np_oob.npo_status == NDIS_STATUS_SUCCESS)
- ndis_return_packet(sc, p);
- } else {
- if (p->np_oob.npo_status == NDIS_STATUS_RESOURCES) {
- m = m_dup(m0, M_DONTWAIT);
- /*
- * NOTE: we want to destroy the mbuf here, but
- * we don't actually want to return it to the
- * driver via the return packet handler. By
- * bumping np_refcnt, we can prevent the
- * ndis_return_packet() routine from actually
- * doing anything.
- */
- p->np_refcnt++;
- m_freem(m0);
- if (m == NULL)
- ifp->if_ierrors++;
- else
- m0 = m;
- } else
- p->np_oob.npo_status = NDIS_STATUS_PENDING;
- m0->m_pkthdr.rcvif = ifp;
- ifp->if_ipackets++;
-
- /* Deal with checksum offload. */
-
- if (ifp->if_capenable & IFCAP_RXCSUM &&
- p->np_ext.npe_info[ndis_tcpipcsum_info] != NULL) {
- s = (uintptr_t)
- p->np_ext.npe_info[ndis_tcpipcsum_info];
- csum = (ndis_tcpip_csum *)&s;
- if (csum->u.ntc_rxflags &
- NDIS_RXCSUM_IP_PASSED)
- m0->m_pkthdr.csum_flags |=
- CSUM_IP_CHECKED|CSUM_IP_VALID;
- if (csum->u.ntc_rxflags &
- (NDIS_RXCSUM_TCP_PASSED |
- NDIS_RXCSUM_UDP_PASSED)) {
- m0->m_pkthdr.csum_flags |=
- CSUM_DATA_VALID|CSUM_PSEUDO_HDR;
- m0->m_pkthdr.csum_data = 0xFFFF;
- }
- }
-
- (*ifp->if_input)(ifp, m0);
- }
- }
-
- return;
-}
-
-static void
-ndis_serial_input(arg)
- void *arg;
-{
- struct mbuf *m;
- struct ifnet *ifp;
-
- m = arg;
- ifp = m->m_pkthdr.rcvif;
- (*ifp->if_input)(ifp, m);
-
- return;
-}
-
-/*
- * Special receive handler for serialized miniports. To really serialize
- * things, we have to make sure not to try and return packets to the driver
+ *
+ * We have to make sure not to try and return packets to the driver
* until after this routine returns. The best way to do that is put the
* call to (*ifp->if_input)() on the ndis swi work queue. In theory,
* we could also copy the packet. I'm not sure which is faster.
*/
__stdcall static void
-ndis_rxeof_serial(adapter, packets, pktcnt)
+ndis_rxeof(adapter, packets, pktcnt)
ndis_handle adapter;
ndis_packet **packets;
uint32_t pktcnt;
@@ -968,7 +880,7 @@ ndis_rxeof_serial(adapter, packets, pktcnt)
}
}
- if (ndis_sched(ndis_serial_input, m0, NDIS_SWI)) {
+ if (ndis_sched(ndis_input, m0, NDIS_SWI)) {
p->np_refcnt++;
m_freem(m0);
ifp->if_ierrors++;
OpenPOWER on IntegriCloud