For acx111:
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 17 Jun 2006 10:31:59 +0000 (10:31 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Sat, 17 Jun 2006 10:31:59 +0000 (10:31 +0000)
- Rename ACX111_DATAFLOW_SNIFFER to ACX111_DF_NO_RXDECRYPT (after testing every
  bits of acx111_conf_option.dataflow, it turns out: ACX111_DATAFLOW_SNIFFER
  _is_ ACX111_DF_NO_RXDECRYPT :(
- Disable hardware WEP encrypt/decrypt (actually hardware WEP encrypt is used
  only with older firmware)
- Add WPA2 support

# I didn't figure out how to turn off hardware WEP encrypt/decrypt for acx100,
# so it still only has WEP support.

sys/dev/netif/acx/acx100.c
sys/dev/netif/acx/acx111.c
sys/dev/netif/acx/if_acx.c
sys/dev/netif/acx/if_acxvar.h

index a43f49c..fcfd8d2 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/acx/acx100.c,v 1.2 2006/05/18 13:51:45 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/acx/acx100.c,v 1.3 2006/06/17 10:31:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -273,6 +273,7 @@ acx100_set_param(device_t dev)
        sc->chip_mem1_rid = PCIR_BAR(1);
        sc->chip_mem2_rid = PCIR_BAR(2);
        sc->chip_ioreg = acx100_reg;
+       sc->chip_hw_crypt = 1;
        sc->chip_intr_enable = ACX100_INTR_ENABLE;
        sc->chip_intr_disable = ACX100_INTR_DISABLE;
        sc->chip_gpio_pled = ACX100_GPIO_POWER_LED;
index 84549a3..146a19c 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/acx/acx111.c,v 1.2 2006/05/18 13:51:45 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/acx/acx111.c,v 1.3 2006/06/17 10:31:59 sephe Exp $
  */
 
 #include <sys/param.h>
@@ -165,11 +165,11 @@ struct acx111_conf_txpower {
 struct acx111_conf_option {
        struct acx_conf confcom;
        uint32_t        feature;
-       uint32_t        dataflow;       /* see ACX111_DATAFLOW_ */
+       uint32_t        dataflow;       /* see ACX111_DF_ */
 } __packed;
 
-#define ACX111_DATAFLOW_SNIFFER                0x00000080
-#define ACX111_DATAFLOW_NO_TXCRYPT     0x00000001
+#define ACX111_DF_NO_RXDECRYPT 0x00000080
+#define ACX111_DF_NO_TXENCRYPT 0x00000001
 
 struct acx111_wepkey {
        uint8_t         mac_addr[IEEE80211_ADDR_LEN];
@@ -254,16 +254,6 @@ static uint16_t    acx111_rate_map[109] = {
        ACX111_RATE(108)
 };
 
-/*
- * For firmware whose version is listed in the following array,
- * software WEP should be used, since hardware WEP's performance
- * is too poor
- */
-static const uint32_t  acx111_softwep_fwver[] = {
-       0x01020030,
-       0       /* KEEP THIS */
-};
-
 static int     acx111_init(struct acx_softc *);
 static int     acx111_init_memory(struct acx_softc *);
 static void    acx111_init_fw_txring(struct acx_softc *, uint32_t);
@@ -274,9 +264,6 @@ static void acx111_set_fw_txdesc_rate(struct acx_softc *,
                                          struct acx_txbuf *, int);
 static void    acx111_set_bss_join_param(struct acx_softc *, void *, int);
 
-static int     acx111_set_wepkey(struct acx_softc *, struct ieee80211_key *,
-                                 int);
-
 void
 acx111_set_param(device_t dev)
 {
@@ -295,12 +282,12 @@ acx111_set_param(device_t dev)
                              IEEE80211_CHAN_OFDM |
                              IEEE80211_CHAN_DYN |
                              IEEE80211_CHAN_2GHZ;
+       sc->sc_ic.ic_caps = IEEE80211_C_WPA;
        sc->sc_ic.ic_phytype = IEEE80211_T_OFDM;
        sc->sc_ic.ic_sup_rates[IEEE80211_MODE_11B] = acx_rates_11b;
        sc->sc_ic.ic_sup_rates[IEEE80211_MODE_11G] = acx_rates_11g;
 
        sc->chip_init = acx111_init;
-       sc->chip_set_wepkey = acx111_set_wepkey;
        sc->chip_write_config = acx111_write_config;
        sc->chip_set_fw_txdesc_rate = acx111_set_fw_txdesc_rate;
        sc->chip_set_bss_join_param = acx111_set_bss_join_param;
@@ -411,7 +398,6 @@ acx111_write_config(struct acx_softc *sc, struct acx_config *conf)
        struct acx111_conf_txpower tx_power;
        struct acx111_conf_option opt;
        uint32_t dataflow;
-       const uint32_t *fwver;
 
        /* Set TX power */
        tx_power.txpower = ACX111_TXPOWER_VAL;
@@ -422,31 +408,16 @@ acx111_write_config(struct acx_softc *sc, struct acx_config *conf)
        }
 
        /*
-        * Turn off sniffering
-        * Turn on hardware/software WEP
+        * Turn off hardware WEP
         */
        if (acx111_get_option_conf(sc, &opt) != 0) {
                if_printf(&sc->sc_ic.ic_if, "%s can't get option\n", __func__);
                return ENXIO;
        }
 
-       dataflow = le32toh(opt.dataflow) & ~ACX111_DATAFLOW_SNIFFER;
-
-       for (fwver = acx111_softwep_fwver; *fwver != 0; ++fwver) {
-               if (sc->sc_firmware_ver == *fwver)
-                       break;
-       }
-
-       if (*fwver != 0) {
-               DPRINTF((&sc->sc_ic.ic_if, "disable hardware WEP\n"));
-               dataflow |= ACX111_DATAFLOW_NO_TXCRYPT;
-               sc->sc_softwep = 1;
-       } else {
-               DPRINTF((&sc->sc_ic.ic_if, "enable hardware WEP\n"));
-               dataflow &= ~ACX111_DATAFLOW_NO_TXCRYPT;
-               sc->sc_softwep = 0;
-       }
-
+       dataflow = le32toh(opt.dataflow) |
+                  ACX111_DF_NO_TXENCRYPT |
+                  ACX111_DF_NO_RXDECRYPT;
        opt.dataflow = htole32(dataflow);
 
        if (acx111_set_option_conf(sc, &opt) != 0) {
@@ -476,30 +447,3 @@ acx111_set_bss_join_param(struct acx_softc *sc, void *param, int dtim_intvl)
        bj->basic_rates = htole16(ACX111_RATE_ALL);
        bj->dtim_intvl = dtim_intvl;
 }
-
-static int
-acx111_set_wepkey(struct acx_softc *sc, struct ieee80211_key *wk, int wk_idx)
-{
-       struct acx111_wepkey wepkey;
-
-       if (wk->wk_keylen > ACX111_WEPKEY_LEN) {
-               if_printf(&sc->sc_ic.ic_if, "%dth WEP key size beyond %d\n",
-                         wk_idx, ACX111_WEPKEY_LEN);
-               return EINVAL;
-       }
-
-       bzero(&wepkey, sizeof(wepkey));
-       wepkey.action = htole16(ACX111_WEPKEY_ACT_ADD);
-       wepkey.key_type = ACX111_WEPKEY_TYPE_DEFAULT;
-       wepkey.index = 0; /* XXX ignored? */
-       wepkey.key_len = wk->wk_keylen;
-       wepkey.key_idx = wk_idx;
-       bcopy(wk->wk_key, wepkey.key, wk->wk_keylen);
-       if (acx_exec_command(sc, ACXCMD_WEP_MGMT, &wepkey, sizeof(wepkey),
-                            NULL, 0) != 0) {
-               if_printf(&sc->sc_ic.ic_if, "%s set %dth WEP key failed\n",
-                         __func__, wk_idx);
-               return ENXIO;
-       }
-       return 0;
-}
index 975987f..cca1c62 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/acx/if_acx.c,v 1.2 2006/05/18 13:51:45 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/acx/if_acx.c,v 1.3 2006/06/17 10:31:59 sephe Exp $
  */
 
 /*
@@ -141,7 +141,7 @@ static void acx_init_info_reg(struct acx_softc *);
 static int     acx_config(struct acx_softc *);
 static int     acx_read_config(struct acx_softc *, struct acx_config *);
 static int     acx_write_config(struct acx_softc *, struct acx_config *);
-static int     acx_set_wepkeys(struct acx_softc *);
+static int     acx_set_crypt_keys(struct acx_softc *);
 #ifdef foo
 static void    acx_begin_scan(struct acx_softc *);
 #endif
@@ -413,9 +413,12 @@ acx_attach(device_t dev)
        ic->ic_opmode = IEEE80211_M_STA;
        ic->ic_state = IEEE80211_S_INIT;
 
-       ic->ic_caps = IEEE80211_C_WEP |         /* WEP */
-                     IEEE80211_C_IBSS |        /* IBSS modes */
-                     IEEE80211_C_SHPREAMBLE;   /* Short preamble */
+       /*
+        * NOTE: Don't overwrite ic_caps set by chip specific code
+        */
+       ic->ic_caps |= IEEE80211_C_WEP |        /* WEP */
+                      IEEE80211_C_IBSS |       /* IBSS modes */
+                      IEEE80211_C_SHPREAMBLE;  /* Short preamble */
 
        /* Get station id */
        for (i = 0; i < IEEE80211_ADDR_LEN; ++i) {
@@ -629,9 +632,9 @@ acx_init(void *arg)
        if (error)
                goto back;
 
-       /* Setup WEP */
+       /* Setup crypto stuffs */
        if (sc->sc_ic.ic_flags & IEEE80211_F_PRIVACY) {
-               error = acx_set_wepkeys(sc);
+               error = acx_set_crypt_keys(sc);
                if (error)
                        goto back;
                sc->sc_ic.ic_flags &= ~IEEE80211_F_DROPUNENC;
@@ -665,7 +668,7 @@ acx_init_info_reg(struct acx_softc *sc)
 }
 
 static int
-acx_set_wepkeys(struct acx_softc *sc)
+acx_set_crypt_keys(struct acx_softc *sc)
 {
        struct ieee80211com *ic = &sc->sc_ic;
        struct acx_conf_wep_txkey wep_txkey;
@@ -677,16 +680,18 @@ acx_set_wepkeys(struct acx_softc *sc)
                if (wk->wk_keylen == 0)
                        continue;
 
-               error = sc->chip_set_wepkey(sc, wk, i);
-               if (error)
-                       return error;
-
-               if (sc->sc_softwep && (wk->wk_flags & IEEE80211_KEY_XMIT))
+               if (sc->chip_hw_crypt) {
+                       error = sc->chip_set_wepkey(sc, wk, i);
+                       if (error)
+                               return error;
+                       got_wk = 1;
+               } else if (wk->wk_flags & IEEE80211_KEY_XMIT) {
                        wk->wk_flags |= IEEE80211_KEY_SWCRYPT;
-               got_wk = 1;
+               }
        }
 
-       if (!got_wk || ic->ic_def_txkey == IEEE80211_KEYIX_NONE)
+       if (!got_wk || sc->chip_hw_crypt ||
+           ic->ic_def_txkey == IEEE80211_KEYIX_NONE)
                return 0;
 
        /* Set current WEP key index */
@@ -1207,7 +1212,7 @@ acx_start(struct ifnet *ifp)
                }
 
                f = mtod(m, struct ieee80211_frame *);
-               if ((f->i_fc[1] & IEEE80211_FC1_WEP) && sc->sc_softwep) {
+               if ((f->i_fc[1] & IEEE80211_FC1_WEP) && !sc->chip_hw_crypt) {
                        KASSERT(ni != NULL, ("TX node is NULL (WEP)\n"));
                        if (ieee80211_crypto_encap(ic, ni, m) == NULL) {
                                ieee80211_free_node(ni);
@@ -1515,7 +1520,8 @@ acx_rxeof(struct acx_softc *sc)
                                 sc->chip_rxbuf_exhdr);
                        f = mtod(m, struct ieee80211_frame *);
 
-                       if (f->i_fc[1] & IEEE80211_FC1_WEP) {
+                       if ((f->i_fc[1] & IEEE80211_FC1_WEP) &&
+                           sc->chip_hw_crypt) {
                                /* Short circuit software WEP */
                                f->i_fc[1] &= ~IEEE80211_FC1_WEP;
 
index e6900a2..75f57e8 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/dev/netif/acx/if_acxvar.h,v 1.2 2006/05/18 13:51:45 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/acx/if_acxvar.h,v 1.3 2006/06/17 10:31:59 sephe Exp $
  */
 
 #ifndef _IF_ACXVAR_H
@@ -366,6 +366,7 @@ struct acx_softc {
        uint16_t                chip_intr_enable;
        uint16_t                chip_intr_disable;
 
+       int                     chip_hw_crypt;
        uint16_t                chip_gpio_pled; /* power led */
        uint16_t                chip_chan_flags; /* see IEEE80211_CHAN_ */
        uint16_t                chip_txdesc1_len;
@@ -377,7 +378,6 @@ struct acx_softc {
        uint8_t                 sc_eeprom_ver;  /* unused */
        uint8_t                 sc_form_factor; /* unused */
        uint8_t                 sc_radio_type;  /* see ACX_RADIO_TYPE_ */
-       int                     sc_softwep;
 
        struct acx_ring_data    sc_ring_data;
        struct acx_buf_data     sc_buf_data;
@@ -404,7 +404,7 @@ struct acx_softc {
        int                     (*chip_init)            /* non-NULL */
                                (struct acx_softc *);
 
-       int                     (*chip_set_wepkey)      /* non-NULL */
+       int                     (*chip_set_wepkey)
                                (struct acx_softc *,
                                 struct ieee80211_key *, int);