Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src-draft/trunk]: src/sys/dev/usb Merge Nat's changes



details:   https://anonhg.NetBSD.org/src-all/rev/a276291b607a
branches:  trunk
changeset: 942257:a276291b607a
user:      Martin Husemann <martin%NetBSD.org@localhost>
date:      Thu Jul 09 19:25:25 2020 +0200

description:
Merge Nat's changes

diffstat:

 sys/dev/pci/if_iwn.c   |  124 ++++++++++++++++++++++++------------------------
 sys/dev/usb/if_urtwn.c |  104 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 160 insertions(+), 68 deletions(-)

diffs (truncated from 907 to 300 lines):

diff -r 145d26bdf2e2 -r a276291b607a sys/dev/pci/if_iwn.c
--- a/sys/dev/pci/if_iwn.c      Thu Jul 09 19:12:43 2020 +0200
+++ b/sys/dev/pci/if_iwn.c      Thu Jul 09 19:25:25 2020 +0200
@@ -221,7 +221,7 @@
 #ifdef notyet
 static void    iwn5000_reset_sched(struct iwn_softc *, int, int);
 #endif
-static int     iwn_tx(struct iwn_softc *, struct mbuf *,
+static int     iwn_tx(struct ieee80211vap *, struct mbuf *,
                    struct ieee80211_node *, int);
 static void    iwn_start(struct ifnet *);
 static void    iwn_watchdog(struct ifnet *);
@@ -648,6 +648,10 @@
 
        ic->ic_txstream = sc->ntxchains;
        ic->ic_rxstream = sc->nrxchains;
+       if (ic->ic_rxstream > 2)
+               ic->ic_rxstream = 2;
+       if (ic->ic_txstream > 2)
+               ic->ic_txstream = 2;
 
        ic->ic_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
 
@@ -757,9 +761,7 @@
 static int
 iwn_reset(struct ieee80211vap *vap, u_long arg)
 {
-       struct ifnet *ifp = vap->iv_ifp;
-       struct iwn_softc *sc = ifp->if_softc;
-       struct ieee80211com *ic = &sc->sc_ic;
+       struct ieee80211com *ic = vap->iv_ic;
 
        if (ic->ic_opmode != IEEE80211_M_MONITOR)
                return ENETRESET;
@@ -807,6 +809,10 @@
        
        ieee80211_scan_done(vap);
 
+       IEEE80211_LOCK(ic);
+       ieee80211_cancel_scan(vap);
+       IEEE80211_UNLOCK(ic);
+
        if (vap->iv_state == IEEE80211_S_RUN) {
                /* Set link LED to ON status if we are associated */
                iwn_set_led(sc, IWN_LED_LINK, 0, 1);
@@ -846,6 +852,8 @@
        struct ieee80211com *ic = vap->iv_ic;
        int error;
 
+       ss->ss_flags |= IEEE80211_SCAN_ONCE;
+
        error = iwn_scan(ic, ss);
        if (error != 0) {
                IEEE80211_LOCK(ic);
@@ -2148,7 +2156,7 @@
 {
        struct ieee80211com *ic = vap->iv_ic;
        struct iwn_softc *sc = ic->ic_softc;
-       //struct ifnet *ifp = vap->iv_ifp;
+       struct ifnet *ifp = vap->iv_ifp;
        int error;
 
        enum ieee80211_state ostate = vap->iv_state;
@@ -2156,7 +2164,9 @@
        callout_stop(&sc->scan_to);
        callout_stop(&sc->calib_to);
 
+#ifdef IEEE80211_DEBUG
        vap->iv_debug = ieee80211_debug;
+#endif
        switch (nstate) {
        case IEEE80211_S_SCAN:
 #if 0
@@ -2237,11 +2247,11 @@
                sc->sc_flags &= ~IWN_FLAG_SCANNING;
                sc->calib.state = IWN_CALIB_STATE_INIT;
                break;
-#if 0
                /*
                 * Purge the xmit queue so we don't have old frames
                 * during a new association attempt.
                 */
+               iwn_stop(ifp, 0);
                error = iwn_init(ifp);
                if (error)
                        return error;
@@ -2249,7 +2259,6 @@
                ifp->if_flags &= ~IFF_OACTIVE;
                iwn_start(ifp);
                break;
-#endif
        }
 
        error = (*sc->sc_newstate)(vap, nstate, arg);
@@ -2503,7 +2512,7 @@
                }
                /* push the frame up to the 802.11 stack */
                /* NNN Convert rssi to -10 to 110 ? for 802.11 layer */
-               ieee80211_input(ni, m, rssi, 0);
+               ieee80211_input(ni, m, rssi + 116, 0);
 
                /* Node is no longer needed. */
                ieee80211_free_node(ni);
@@ -2511,10 +2520,8 @@
        } else {
 
                /* No node found ... process differently. */
-               (void) ieee80211_input_all(ic, m, rssi, 0);
-       }
-
-       m_free(m);
+               (void) ieee80211_input_all(ic, m, rssi + 116, 0);
+       }
        splx(s);
 }
 
@@ -3255,10 +3262,10 @@
        KASSERT(sc != NULL);
        KASSERT(m != NULL);
 
-#if 0
        if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
                return 0;
 
+#if 0
        if (vap->iv_state != IEEE80211_S_RUN)
                return ENXIO;
 #endif
@@ -3269,7 +3276,14 @@
                        return EIO;
        }
        eh = mtod(m, struct ether_header *);
+
 #if 0
+       if ((m = ieee80211_encap(vap, ni, m)) == NULL) {
+               ieee80211_free_node(ni);
+               if_statinc(ifp, if_oerrors);
+               return ENOMEM;
+       }
+
        /* classify mbuf so we can find which tx ring to use */
        if (ieee80211_classify(ni, m) != 0) {
                m_freem(m);
@@ -3285,16 +3299,7 @@
 
         bpf_mtap3(vap->iv_rawbpf, m, BPF_D_OUT);
 
-#if 0
-       if ((m = ieee80211_encap(vap, ni, m)) == NULL) {
-               ieee80211_free_node(ni);
-               if_statinc(ifp, if_oerrors);
-               return ENOMEM;
-       }
-#endif
-
-
-       if (iwn_tx(sc, m, ni, ac) != 0) {
+       if (iwn_tx(vap, m, ni, ac) != 0) {
                ieee80211_free_node(ni);
                if_statinc(ifp, if_oerrors);
                        return ENXIO;
@@ -3312,10 +3317,10 @@
 }
 
 static int
-iwn_tx(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int ac)
-{
-       struct ieee80211com *ic = &sc->sc_ic;
-       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+iwn_tx(struct ieee80211vap *vap, struct mbuf *m, struct ieee80211_node *ni, int ac)
+{
+       struct ieee80211com *ic = vap->iv_ic;
+       struct iwn_softc *sc = ic->ic_softc;
        //struct iwn_node *wn = (void *)ni;
        struct iwn_tx_ring *ring;
        struct iwn_tx_desc *desc;
@@ -3375,24 +3380,6 @@
                ridx = wn->ridx[ni->ni_txrate];
        rinfo = &iwn_rates[ridx];
 
-       /* Encrypt the frame if need be. */
-       /*
-        * XXX For now, NetBSD swaps the encryption and bpf sections
-        * in order to match old code and other drivers. Tests with
-        * tcpdump indicates that the order is irrelevant, however,
-        * as bpf produces unencrypted data for both ordering choices.
-        */
-       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
-               k = ieee80211_crypto_encap(ni, m);
-               if (k == NULL) {
-                       m_freem(m);
-                       return ENOBUFS;
-               }
-               /* Packet header may have moved, reset our local pointer. */
-               wh = mtod(m, struct ieee80211_frame *);
-       }
-       totlen = m->m_pkthdr.len;
-
        if (sc->sc_drvbpf != NULL) {
                struct iwn_tx_radiotap_header *tap = &sc->sc_txtap;
 
@@ -3407,6 +3394,18 @@
                bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m, BPF_D_OUT);
        }
 
+       /* Encrypt the frame if need be. */
+       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
+               k = ieee80211_crypto_encap(ni, m);
+               if (k == NULL) {
+                       m_freem(m);
+                       return ENOBUFS;
+               }
+               /* Packet header may have moved, reset our local pointer. */
+               wh = mtod(m, struct ieee80211_frame *);
+       }
+       totlen = m->m_pkthdr.len;
+
        /* Prepare TX firmware command. */
        cmd = &ring->cmd[ring->cur];
        cmd->code = IWN_CMD_TX_DATA;
@@ -3655,6 +3654,14 @@
                        if_statinc(ifp, if_oerrors);
                        continue;
                }
+
+#if 0
+               if ((m = ieee80211_encap(vap, ni, m)) == NULL) {
+                       ieee80211_free_node(ni);
+                       if_statinc(ifp, if_oerrors);
+                       continue;
+               }
+
                /* classify mbuf so we can find which tx ring to use */
                if (ieee80211_classify(ni, m) != 0) {
                        m_freem(m);
@@ -3662,6 +3669,7 @@
                        if_statinc(ifp, if_oerrors);
                        continue;
                }
+#endif
 
                /* No QoS encapsulation for EAPOL frames. */
                ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
@@ -3669,19 +3677,13 @@
 
                if (sc->sc_beacon_wait == 0)
                        bpf_mtap(ifp, m, BPF_D_OUT);
-
-               if ((m = ieee80211_encap(vap, ni, m)) == NULL) {
-                       ieee80211_free_node(ni);
-                       if_statinc(ifp, if_oerrors);
-                       continue;
-               }
 sendit:
                if (sc->sc_beacon_wait)
                        continue;
 
                //bpf_mtap3(ic->ic_rawbpf, m, BPF_D_OUT);
 
-               if (iwn_tx(sc, m, ni, ac) != 0) {
+               if (iwn_tx(vap, m, ni, ac) != 0) {
                        ieee80211_free_node(ni);
                        if_statinc(ifp, if_oerrors);
                        continue;
@@ -3768,7 +3770,7 @@
                error = 0;
                if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
                    (IFF_UP | IFF_RUNNING)) {
-//                     iwn_stop(ifp, 0);
+                       iwn_stop(ifp, 0);
                        iwn_init(ifp);
                }
                error = 0;
@@ -6884,11 +6886,6 @@
        ifp->if_flags &= ~IFF_OACTIVE;
        ifp->if_flags |= IFF_RUNNING;
 
-       if (ic->ic_opmode == IEEE80211_M_MONITOR)
-               ieee80211_new_state(vap, IEEE80211_S_RUN, -1);
-       else if (vap->iv_roaming != IEEE80211_ROAMING_MANUAL)
-               ieee80211_new_state(vap, IEEE80211_S_SCAN, -1);
-
        iwn_init_channels(ic);
        ieee80211_chan_init(ic);
        ieee80211_media_status(ifp, &imr);
@@ -6899,7 +6896,12 @@
        sc->sc_flags |= IWN_FLAG_HW_INITED;
 out:
        mutex_exit(&sc->sc_mtx);
-       ieee80211_init(ifp);
+
+       if (ic->ic_opmode == IEEE80211_M_MONITOR)
+               ieee80211_new_state(vap, IEEE80211_S_RUN, -1);
+       else if (vap->iv_roaming != IEEE80211_ROAMING_MANUAL)
+               ieee80211_new_state(vap, IEEE80211_S_SCAN, -1);
+
        return 0;
 
 fail:  mutex_exit(&sc->sc_mtx);
@@ -6920,13 +6922,13 @@



Home | Main Index | Thread Index | Old Index