Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src-draft/trunk]: src/sys/dev/pci Modify function for ipw_transmit and raw_x...
details: https://anonhg.NetBSD.org/src-all/rev/c56360e2e060
branches: trunk
changeset: 375764:c56360e2e060
user: Nathanial Sloss <nat%netbsd.org@localhost>
date: Mon Mar 07 17:01:45 2022 +1100
description:
Modify function for ipw_transmit and raw_xmit.
diffstat:
sys/dev/pci/if_ipw.c | 69 +++++++++++++++++++++++++++++++++------------------
1 files changed, 44 insertions(+), 25 deletions(-)
diffs (146 lines):
diff -r 9a41694a2a21 -r c56360e2e060 sys/dev/pci/if_ipw.c
--- a/sys/dev/pci/if_ipw.c Sat Mar 05 19:50:41 2022 +0100
+++ b/sys/dev/pci/if_ipw.c Mon Mar 07 17:01:45 2022 +1100
@@ -112,8 +112,9 @@ static void ipw_tx_intr(struct ipw_softc
static int ipw_intr(void *);
static void ipw_softintr(void *);
static int ipw_cmd(struct ipw_softc *, uint32_t, void *, uint32_t);
-static int ipw_tx_start(struct ifnet *, struct mbuf *,
- struct ieee80211_node *);
+static int ipw_transmit(struct ieee80211com *, struct mbuf *);
+static int ipw_raw_xmit(struct ieee80211node *, struct mbuf *,
+ const struct ieee80211_bpf_params *);
static void ipw_start(struct ifnet *);
static void ipw_watchdog(struct ifnet *);
static int ipw_get_table1(struct ipw_softc *, uint32_t *);
@@ -333,6 +334,8 @@ ipw_attach(device_t parent, device_t sel
ic->ic_vap_delete = ipw_vap_delete;
ic->ic_getradiocaps = ipw_get_radiocaps;
ic->ic_parent = ipw_parent;
+ ic->ic_transmit = ipw_transmit;
+ ic->ic_raw_xmit = ipw_raw_xmit;
ieee80211_media_init(ic, ipw_media_change, ipw_media_status);
@@ -1451,10 +1454,27 @@ ipw_cmd(struct ipw_softc *sc, uint32_t t
}
static int
-ipw_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni)
+ipw_transmit(struct ieee80211com *ic, struct mbuf *m)
{
- struct ipw_softc *sc = ifp->if_softc;
- struct ieee80211com *ic = &sc->sc_ic;
+ struct ipw_softc *sc = ic->ic_softc;
+ int s;
+
+ s = splnet();
+ IF_ENQUEUE(&sc->sc_sendq, m);
+ splx(s);
+
+ if (!(sc->sc_flags & IPW_FLAG_TX_RUNNING))
+ ipw_start(sc);
+
+ return 0;
+}
+
+static int
+ipw_raw_xmit(struct ieee80211node *ni, struct mbuf *m0,
+ const struct ieee80211_bpf_params *bpfp);
+{
+ struct ieee80211com *ic = ni->ni_ic;
+ struct ipw_softc *sc = ic->ic_softc;
struct ieee80211_frame *wh;
struct ipw_soft_bd *sbd;
struct ipw_soft_hdr *shdr;
@@ -1465,8 +1485,8 @@ ipw_tx_start(struct ifnet *ifp, struct m
wh = mtod(m0, struct ieee80211_frame *);
- if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
- k = ieee80211_crypto_encap(ic, ni, m0);
+ if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
+ k = ieee80211_crypto_encap(ni, m0);
if (k == NULL) {
m_freem(m0);
return ENOBUFS;
@@ -1476,12 +1496,6 @@ ipw_tx_start(struct ifnet *ifp, struct m
wh = mtod(m0, struct ieee80211_frame *);
}
- if (sc->sc_drvbpf != NULL) {
- struct ipw_tx_radiotap_header *tap = &sc->sc_txtap;
-
- bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0, BPF_D_OUT);
- }
-
shdr = TAILQ_FIRST(&sc->sc_free_shdr);
sbuf = TAILQ_FIRST(&sc->sc_free_sbuf);
KASSERT(shdr != NULL && sbuf != NULL);
@@ -1614,38 +1628,42 @@ ipw_tx_start(struct ifnet *ifp, struct m
}
static void
-ipw_start(struct ifnet *ifp)
+ipw_start(struct ipw_softc *sc)
{
- struct ipw_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
+ struct ieee80211vap *vap;
struct mbuf *m0;
struct ether_header *eh;
struct ieee80211_node *ni;
- if (ic->ic_state != IEEE80211_S_RUN)
+ if (sc->sc_flags & IPW_FLAG_TX_RUNNING)
return;
for (;;) {
- IF_POLL(&ifp->if_snd, m0);
+ /* Encapsulate and send data frames. */
+ IFQ_POLL(&sc->sc_sendq, m0);
if (m0 == NULL)
break;
+ ni = M_GETCTX(m0, struct ieee80211_node *);
+ M_CLEARCTX(m0);
+ vap = ni->ni_vap;
+
if (sc->txfree < 1 + IPW_MAX_NSEG) {
- ifp->if_flags |= IFF_OACTIVE;
+ vap->iv_flags |= IFF_OACTIVE;
break;
}
- IF_DEQUEUE(&ifp->if_snd, m0);
+ IF_DEQUEUE(&sc->sc_sendq, m0);
KASSERT(m0->m_len >= sizeof(struct ether_header));
eh = mtod(m0, struct ether_header *);
- ni = ieee80211_find_txnode(ic, eh->ether_dhost);
if (ni == NULL) {
m_freem(m0);
continue;
}
- bpf_mtap(ifp, m0, BPF_D_OUT);
+ bpf_mtap(vap->iv_ifp, m0, BPF_D_OUT);
m0 = ieee80211_encap(ic, m0, ni);
if (m0 == NULL) {
@@ -1655,10 +1673,11 @@ ipw_start(struct ifnet *ifp)
bpf_mtap3(ic->ic_rawbpf, m0, BPF_D_OUT);
- if (ipw_tx_start(ifp, m0, ni) != 0) {
- ieee80211_free_node(ni);
- if_statinc(ifp, if_oerrors);
- break;
+ if (ipw_raw_xmit(ni, m0, NULL) != 0) {
+ ieee80211_tx_complete(ni, m0, 1);
+ if (vap != NULL)
+ if_statinc(vap->iv_ifp, if_oerrors);
+ continue;
}
/* start watchdog timer */
Home |
Main Index |
Thread Index |
Old Index