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 More converted for iwi(4).



details:   https://anonhg.NetBSD.org/src-all/rev/2c849754287e
branches:  trunk
changeset: 377944:2c849754287e
user:      Nathanial Sloss <nat%netbsd.org@localhost>
date:      Tue Dec 21 13:03:21 2021 +1100

description:
More converted for iwi(4).

It does not compile as yet.  A few errors are remaining.

diffstat:

 sys/dev/pci/if_iwi.c    |  109 +++++++++++++++++++++++++++++++----------------
 sys/dev/pci/if_iwivar.h |    2 +
 2 files changed, 74 insertions(+), 37 deletions(-)

diffs (truncated from 308 to 300 lines):

diff -r fbeecb30b6a8 -r 2c849754287e sys/dev/pci/if_iwi.c
--- a/sys/dev/pci/if_iwi.c      Sun Dec 19 08:23:10 2021 +1100
+++ b/sys/dev/pci/if_iwi.c      Tue Dec 21 13:03:21 2021 +1100
@@ -106,8 +106,8 @@ static struct       ieee80211_node *iwi_node_a
 static void    iwi_node_free(struct ieee80211_node *);
 
 static int     iwi_cvtrate(int);
-static int     iwi_media_change(struct ifnet *);
-static void    iwi_media_status(struct ifnet *, struct ifmediareq *);
+//static int   iwi_media_change(struct ifnet *);
+//static void  iwi_media_status(struct ifnet *, struct ifmediareq *);
 static int     iwi_wme_update(struct ieee80211com *);
 static void    iwi_scan_start(struct ieee80211com *);
 static void    iwi_set_chan(struct ieee80211com *);
@@ -129,8 +129,6 @@ static int  iwi_intr(void *);
 static void    iwi_softintr(void *);
 static int     iwi_cmd(struct iwi_softc *, uint8_t, void *, uint8_t, int);
 static void    iwi_write_ibssnode(struct iwi_softc *, const struct iwi_node *);
-static int     iwi_tx_start(struct ifnet *, struct mbuf *, struct ieee80211_node *,
-    int);
 static void    iwi_start(struct ifnet *);
 static void    iwi_watchdog(struct ifnet *);
 
@@ -386,8 +384,6 @@ iwi_attach(device_t parent, device_t sel
 
        /* XXX media locking needs revisiting */
        mutex_init(&sc->sc_media_mtx, MUTEX_DEFAULT, IPL_SOFTNET);
-       ieee80211_media_init_with_lock(ic,
-           iwi_media_change, iwi_media_status, &sc->sc_media_mtx);
 
        /*
         * Allocate rings.
@@ -905,6 +901,7 @@ iwi_node_free(struct ieee80211_node *ni)
        sc->sc_node_free(ni);
 }
 
+#if 0
 static int
 iwi_media_change(struct ifnet *ifp)
 {
@@ -916,6 +913,7 @@ iwi_media_change(struct ifnet *ifp)
 
        return 0;
 }
+#endif
 
 /*
  * Convert h/w rate code to IEEE rate code.
@@ -940,6 +938,7 @@ iwi_cvtrate(int iwirate)
        return 0;
 }
 
+#if 0
 /*
  * The firmware automatically adapts the transmit speed.  We report its current
  * value here.
@@ -979,6 +978,7 @@ iwi_media_status(struct ifnet *ifp, stru
                break;
        }
 }
+#endif
 
 static void
 iwi_newassoc(struct ieee80211_node *ni, int isnew)
@@ -1252,7 +1252,7 @@ iwi_frame_intr(struct iwi_softc *sc, str
     struct iwi_frame *frame)
 {
        struct ieee80211com *ic = &sc->sc_ic;
-       struct ifnet *ifp = ic->ic_ifp;
+       //struct ifnet *ifp = ic->ic_ifp;
        struct mbuf *m, *m_new;
        struct ieee80211_frame *wh;
        struct ieee80211_node *ni;
@@ -1607,7 +1607,7 @@ iwi_softintr(void *arg)
        if (r & IWI_INTR_FATAL_ERROR) {
                aprint_error_dev(sc->sc_dev, "fatal error\n");
                s = splnet();
-               sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
+               //sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
                iwi_stop(sc, 1);
                splx(s);
                return;
@@ -1621,7 +1621,7 @@ iwi_softintr(void *arg)
        if (r & IWI_INTR_RADIO_OFF) {
                DPRINTF(("radio transmitter off\n"));
                s = splnet();
-               sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
+               //sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
                iwi_stop(sc, 1);
                splx(s);
                return;
@@ -1697,20 +1697,22 @@ iwi_write_ibssnode(struct iwi_softc *sc,
 }
 
 static int
-iwi_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni,
-    int ac)
+iwi_raw_xmit(struct ieee80211_node *ni , struct mbuf *m0,
+    const struct ieee80211_bpf_params *bpfp)
 {
-       struct iwi_softc *sc = ifp->if_softc;
-       struct ieee80211com *ic = &sc->sc_ic;
-       struct iwi_node *in = (struct iwi_node *)ni;
+       struct ieee80211vap *vap = ni->ni_vap;
+       struct ieee80211com *ic = ni->ni_ic;
+       struct iwi_softc *sc = ic->ic_softc;
+       struct ifnet *ifp = vap->iv_ifp;
+       struct ether_header *eh;
        struct ieee80211_frame *wh;
        struct ieee80211_key *k;
        const struct chanAccParams *cap;
-       struct iwi_tx_ring *txq = &sc->txq[ac];
+       struct iwi_tx_ring *txq;
        struct iwi_tx_data *data;
        struct iwi_tx_desc *desc;
        struct mbuf *mnew;
-       int error, hdrlen, i, noack = 0;
+       int ac, error, hdrlen, i, noack = 0;
 
        wh = mtod(m0, struct ieee80211_frame *);
 
@@ -1758,6 +1760,11 @@ iwi_tx_start(struct ifnet *ifp, struct m
                bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0, BPF_D_OUT);
        }
 
+       /* No QoS encapsulation for EAPOL frames. */
+       ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
+           M_WME_GETAC(m0) : WME_AC_BE;
+       txq = &sc->txq[ac];
+
        data = &txq->data[txq->cur];
        desc = &txq->desc[txq->cur];
 
@@ -1864,6 +1871,34 @@ iwi_tx_start(struct ifnet *ifp, struct m
        return 0;
 }
 
+static int
+iwi_transmit(struct ieee80211com *ic, struct mbuf *m)
+{
+       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+       //struct iwi_softc *sc = vap->iv_ic->ic_softc;
+       int s;
+
+       size_t pktlen = m->m_pkthdr.len;
+        bool mcast = (m->m_flags & M_MCAST) != 0;
+
+       DPRINTFN(DBG_FN, ("%s: %s\n",vap->iv_ic->ic_name, __func__));
+
+       s = splnet();
+
+       IF_ENQUEUE(&vap->iv_ifp->if_snd, m);
+        if_statadd(vap->iv_ifp, if_obytes, pktlen);
+        if (mcast)
+                if_statinc(vap->iv_ifp, if_omcasts);
+
+        if ((vap->iv_ifp->if_flags & IFF_OACTIVE) == 0)
+                if_start_lock(vap->iv_ifp);
+        splx(s);
+
+       iwi_start(vap->iv_ifp);
+
+        return 0;
+}
+
 static void
 iwi_start(struct ifnet *ifp)
 {
@@ -1923,9 +1958,9 @@ iwi_start(struct ifnet *ifp)
                        continue;
                }
 
-               bpf_mtap3(ic->ic_rawbpf, m0, BPF_D_OUT);
-
-               if (iwi_tx_start(ifp, m0, ni, ac) != 0) {
+               bpf_mtap3(vap->iv_rawbpf, m0, BPF_D_OUT);
+
+               if (iwi_raw_xmit(ni, m0, NULL) != 0) {
                        ieee80211_free_node(ni);
                        if_statinc(ifp, if_oerrors);
                        break;
@@ -2429,6 +2464,7 @@ static int
 iwi_config(struct iwi_softc *sc)
 {
        struct ieee80211com *ic = &sc->sc_ic;
+       struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
        struct ifnet *ifp = &sc->sc_if;
        struct iwi_configuration config;
        struct iwi_rateset rs;
@@ -2465,7 +2501,7 @@ iwi_config(struct iwi_softc *sc)
        if (error != 0)
                return error;
 
-       data = htole32(ic->ic_rtsthreshold);
+       data = htole32(vap->iv_rtsthreshold);
        DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
        error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data, 0);
        if (error != 0)
@@ -2535,23 +2571,21 @@ iwi_config(struct iwi_softc *sc)
        if (error != 0)
                return error;
 
-#if 0  /* XXX: how to handle this */
        /* if we have a desired ESSID, set it now */
-       if (ic->ic_des_esslen != 0) {
+       if (sc->sc_des_esslen != 0) {
 #ifdef IWI_DEBUG
                if (iwi_debug > 0) {
                        printf("Setting desired ESSID to ");
-                       ieee80211_print_essid(ic->ic_des_essid,
-                           ic->ic_des_esslen);
+                       ieee80211_print_essid(sc->sc_des_essid,
+                           sc->sc_des_esslen);
                        printf("\n");
                }
 #endif
-               error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ic->ic_des_essid,
-                   ic->ic_des_esslen, 0);
+               error = iwi_cmd(sc, IWI_CMD_SET_ESSID, sc->sc_des_essid,
+                   sc->sc_des_esslen, 0);
                if (error != 0)
                        return error;
        }
-#endif
 
        cprng_fast(&data, sizeof(data));
        data = htole32(data);
@@ -2621,25 +2655,22 @@ iwi_scan_start(struct ieee80211com *ic)
        scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BDIRECT] =
            htole16(sc->dwelltime);
 
-#if 0
-       /* XXX: how to handle this */
        /* tell the firmware about the desired essid */
-       if (ic->ic_des_esslen) {
+       if (sc->sc_des_esslen) {
                int error;
 
                DPRINTF(("%s: Setting adapter desired ESSID to %s\n",
-                   __func__, ic->ic_des_essid));
+                   __func__, sc->sc_des_essid));
 
                error = iwi_cmd(sc, IWI_CMD_SET_ESSID,
-                   ic->ic_des_essid, ic->ic_des_esslen, 1);
+                   sc->sc_des_essid, sc->sc_des_esslen, 1);
                if (error)
                        return;
 
                type = IWI_SCAN_TYPE_ACTIVE_BDIRECT;
        } else {
-#endif
                type = IWI_SCAN_TYPE_ACTIVE_BROADCAST;
-//     }
+       }
 
        p = &scan.channels[0];
        count = idx = 0;
@@ -2681,7 +2712,7 @@ iwi_auth_and_assoc(struct iwi_softc *sc)
        struct ieee80211com *ic = &sc->sc_ic;
        struct ieee80211_node *ni = ic->ic_bss;
        struct ifnet *ifp = &sc->sc_if;
-       struct ieee80211_wme_info wme;
+       //struct ieee80211_wme_info wme;
        struct iwi_configuration config;
        struct iwi_associate assoc;
        struct iwi_rateset rs;
@@ -2734,7 +2765,8 @@ iwi_auth_and_assoc(struct iwi_softc *sc)
        if (error != 0)
                return error;
 
-       if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL) {
+#if 0
+       if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme != NULL) {
                wme.wme_id = IEEE80211_ELEMID_VENDOR;
                wme.wme_len = sizeof (struct ieee80211_wme_info) - 2;
                wme.wme_oui[0] = 0x00;
@@ -2758,6 +2790,7 @@ iwi_auth_and_assoc(struct iwi_softc *sc)
                if (error != 0)
                        return error;
        }
+#endif
        data = 0; //htole32(ni->ni_rssi);
        DPRINTF(("Setting sensitivity to %d\n", (int8_t)ni->ni_rssi));
        error = iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &data, sizeof data, 1);
@@ -2780,8 +2813,10 @@ iwi_auth_and_assoc(struct iwi_softc *sc)
        if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
                assoc.plen = IWI_ASSOC_SHPREAMBLE;
 
-       if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL)
+#if 0
+       if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme != NULL)
                assoc.policy |= htole16(IWI_POLICY_WME);
+#endif
        if (ic->ic_flags & IEEE80211_F_WPA)
                assoc.policy |= htole16(IWI_POLICY_WPA);
        if (ic->ic_opmode == IEEE80211_M_IBSS && ni->ni_tstamp.tsf == 0)
diff -r fbeecb30b6a8 -r 2c849754287e sys/dev/pci/if_iwivar.h
--- a/sys/dev/pci/if_iwivar.h   Sun Dec 19 08:23:10 2021 +1100
+++ b/sys/dev/pci/if_iwivar.h   Tue Dec 21 13:03:21 2021 +1100
@@ -174,6 +174,8 @@ struct iwi_softc {



Home | Main Index | Thread Index | Old Index