Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/ic works, tested without privacy, wep and wpa. Soft ...



details:   https://anonhg.NetBSD.org/src/rev/2ceb6bf94f26
branches:  trunk
changeset: 818122:2ceb6bf94f26
user:      christos <christos%NetBSD.org@localhost>
date:      Tue Sep 27 20:16:35 2016 +0000

description:
works, tested without privacy, wep and wpa. Soft crypto only for now.

diffstat:

 sys/dev/ic/rt2860.c |  79 ++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 54 insertions(+), 25 deletions(-)

diffs (227 lines):

diff -r 7bc4cf4d89be -r 2ceb6bf94f26 sys/dev/ic/rt2860.c
--- a/sys/dev/ic/rt2860.c       Tue Sep 27 19:26:06 2016 +0000
+++ b/sys/dev/ic/rt2860.c       Tue Sep 27 20:16:35 2016 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rt2860.c,v 1.21 2016/07/13 00:01:27 christos Exp $     */
+/*     $NetBSD: rt2860.c,v 1.22 2016/09/27 20:16:35 christos Exp $     */
 /*     $OpenBSD: rt2860.c,v 1.90 2016/04/13 10:49:26 mpi Exp $ */
 /*     $FreeBSD: head/sys/dev/ral/rt2860.c 297793 2016-04-10 23:07:00Z pfg $ */
 
@@ -25,7 +25,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.21 2016/07/13 00:01:27 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rt2860.c,v 1.22 2016/09/27 20:16:35 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/sockio.h>
@@ -340,10 +340,14 @@
            IEEE80211_C_APPMGT |        /* HostAP power management */
 #endif
 #endif
+           IEEE80211_C_WDS |           /* 4-address traffic works */
+           IEEE80211_C_WME |           /* 802.11e */
            IEEE80211_C_SHPREAMBLE |    /* short preamble supported */
            IEEE80211_C_SHSLOT |        /* short slot time supported */
-           IEEE80211_C_WEP |           /* s/w WEP */
-           IEEE80211_C_WPA;            /* WPA/RSN */
+#ifdef HW_CRYPTO
+           IEEE80211_C_WEP |           /* WEP */
+#endif
+           IEEE80211_C_WPA;            /* 802.11i */
 
        if (sc->rf_rev == RT2860_RF_2750 || sc->rf_rev == RT2860_RF_2850) {
                /* set supported .11a rates */
@@ -1227,6 +1231,7 @@
        rt2860_drain_stats_fifo(sc);
 
        hw = RAL_READ(sc, RT2860_TX_DTX_IDX(qid));
+       DPRINTF(("%s: rx mbuf %#x\n", __func__, hw));
        while (ring->next != hw) {
                struct rt2860_tx_data *data = ring->data[ring->next];
 
@@ -1235,7 +1240,7 @@
                            data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
                        bus_dmamap_unload(sc->sc_dmat, data->map);
                        m_freem(data->m);
-                       data->m= NULL;
+                       data->m = NULL;
                        ieee80211_free_node(data->ni);
                        data->ni = NULL;
 
@@ -1288,7 +1293,7 @@
        uint16_t phy;
 
        hw = RAL_READ(sc, RT2860_FS_DRX_IDX) & 0xfff;
-       DPRINTF(("rx mbuf %#x\n", hw));
+       DPRINTF(("%s: rx mbuf %#x\n", __func__, hw));
        while (sc->rxq.cur != hw) {
                struct rt2860_rx_data *data = &sc->rxq.data[sc->rxq.cur];
                struct rt2860_rxd *rxd = &sc->rxq.rxd[sc->rxq.cur];
@@ -1375,11 +1380,12 @@
 
                /* HW may insert 2 padding bytes after 802.11 header */
                if (rxd->flags & htole32(RT2860_RX_L2PAD)) {
-                       u_int hdrlen = ieee80211_hdrspace(ic, wh);
+                       u_int hdrlen = ieee80211_hdrsize(wh);
                        memmove((char *)wh + 2, wh, hdrlen);
                        m->m_data += 2;
                        wh = mtod(m, struct ieee80211_frame *);
                }
+               printf("%s wh=%p\n", __func__, wh);
 
 #ifdef HW_CRYPTO
                if (__predict_false(rxd->flags & htole32(RT2860_RX_MICERR))) {
@@ -1431,7 +1437,6 @@
                }
                bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
 skipbpf:
-               wh = mtod(m, struct ieee80211_frame *);
                /* grab a reference to the source node */
                ni = ieee80211_find_rxnode(ic,
                    (struct ieee80211_frame_min *)wh);
@@ -1574,8 +1579,8 @@
        data = SLIST_FIRST(&sc->data_pool);
 
        wh = mtod(m, struct ieee80211_frame *);
-#if 0
-       if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
+#ifndef HW_CRYPTO
+       if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
                struct ieee80211_key *k = ieee80211_crypto_encap(ic, ni, m);
                if (k == NULL) {
                        m_freem(m);
@@ -1587,7 +1592,7 @@
        }
 #endif
 
-       hdrlen = ieee80211_hdrspace(ic, wh);
+       hdrlen = ieee80211_anyhdrsize(wh);
        type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
 
        if ((hasqos = ieee80211_has_qos(wh))) {
@@ -1719,8 +1724,7 @@
        /* first segment is TXWI + 802.11 header */
        txd = &ring->txd[ring->cur];
        txd->sdp0 = htole32(data->paddr);
-       int pad = (hdrlen + 3) & ~3;
-       txd->sdl0 = htole16(sizeof (struct rt2860_txwi) + pad);
+       txd->sdl0 = htole16(sizeof (struct rt2860_txwi) + hdrlen);
        txd->flags = qsel;
 
        /* setup payload segments */
@@ -1788,6 +1792,7 @@
 
        for (;;) {
                if (SLIST_EMPTY(&sc->data_pool) || sc->qfullmsk != 0) {
+                       DPRINTF(("%s: stuffup\n", __func__));
                        ifp->if_flags |= IFF_OACTIVE;
                        break;
                }
@@ -1796,32 +1801,42 @@
                if (m != NULL) {
                        ni = M_GETCTX(m, struct ieee80211_node *);
                        M_CLEARCTX(m);
+                       DPRINTF(("%s: send management\n", __func__));
                        goto sendit;
                }
-               if (ic->ic_state != IEEE80211_S_RUN)
+               if (ic->ic_state != IEEE80211_S_RUN) {
+                       DPRINTF(("%s: not running %d\n", __func__,
+                           ic->ic_state));
                        break;
+               }
 
                /* encapsulate and send data frames */
                IFQ_DEQUEUE(&ifp->if_snd, m);
-               if (m == NULL)
+               if (m == NULL) {
+                       DPRINTF(("%s: nothing to send\n", __func__));
                        break;
+               }
                if (m->m_len < (int)sizeof(*eh) &&
                    (m = m_pullup(m, sizeof(*eh))) == NULL) {
+                       DPRINTF(("%s: nothing to send\n", __func__));
+                       ifp->if_oerrors++;
+                       continue;
+               }
+
+               eh = mtod(m, struct ether_header *);
+
+               ni = ieee80211_find_txnode(ic, eh->ether_dhost);
+               if (ni == NULL) {
+                       DPRINTF(("%s: can't find tx node\n", __func__));
+                       m_freem(m);
                        ifp->if_oerrors++;
                        continue;
                }
 
                bpf_mtap(ifp, m);
 
-               eh = mtod(m, struct ether_header *);
-               ni = ieee80211_find_txnode(ic, eh->ether_dhost);
-               if (ni == NULL) {
-                       m_freem(m);
-                       ifp->if_oerrors++;
-                       continue;
-               }
-
                if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
+                       DPRINTF(("%s: can't encap\n", __func__));
                        ieee80211_free_node(ni);
                        ifp->if_oerrors++;
                        continue;
@@ -1830,6 +1845,7 @@
                bpf_mtap3(ic->ic_rawbpf, m);
 
                if (rt2860_tx(sc, m, ni) != 0) {
+                       DPRINTF(("%s: can't tx\n", __func__));
                        m_freem(m);
                        ieee80211_free_node(ni);
                        ifp->if_oerrors++;
@@ -2182,6 +2198,9 @@
        uint32_t tmp;
        uint8_t agc;
 
+       /* Wait for BBP to settle */
+       DELAY(1000);
+
        rt2860_mcu_bbp_write(sc, 62, 0x37 - sc->lna[group]);
        rt2860_mcu_bbp_write(sc, 63, 0x37 - sc->lna[group]);
        rt2860_mcu_bbp_write(sc, 64, 0x37 - sc->lna[group]);
@@ -3024,6 +3043,14 @@
        uint8_t mode, wcid, iv[8];
        struct ieee80211_key *k = __UNCONST(ck); /* XXX */
 
+       DPRINTF(("%s: cipher %d\n", __func__, k->wk_cipher->ic_cipher));
+       /* defer setting of WEP keys until interface is brought up */
+       if ((ic->ic_ifp->if_flags & (IFF_UP | IFF_RUNNING)) !=
+           (IFF_UP | IFF_RUNNING)) {
+               DPRINTF(("%s: not running %d\n", __func__,
+                   k->wk_cipher->ic_cipher));
+               return 1;
+       }
        /* map net80211 cipher to RT2860 security mode */
        switch (k->wk_cipher->ic_cipher) {
        case IEEE80211_CIPHER_WEP:
@@ -3040,7 +3067,8 @@
                mode = RT2860_MODE_AES_CCMP;
                break;
        default:
-               return EINVAL;
+               DPRINTF(("%s: bad\n", __func__));
+               return 0;
        }
 
        if (k->wk_flags & IEEE80211_KEY_GROUP) {
@@ -3110,7 +3138,8 @@
                attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
                RAL_WRITE(sc, RT2860_WCID_ATTR(wcid), attr);
        }
-       return 0;
+       DPRINTF(("%s: ok\n", __func__));
+       return 1;
 }
 
 static int



Home | Main Index | Thread Index | Old Index