ath9k: Allow AP mode to be enabled
authorJouni Malinen <jouni.malinen@atheros.com>
Mon, 11 Aug 2008 11:01:47 +0000 (14:01 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 29 Aug 2008 20:24:02 +0000 (16:24 -0400)
Signed-off-by: Jouni Malinen <jouni.malinen@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath9k/core.c
drivers/net/wireless/ath9k/main.c

index 0d953f9fdeeb2fb059c6066e59e8aebbad1ce9a3..9737775aad3c814cac8158ca7f73fa50ef9116cd 100644 (file)
@@ -549,9 +549,15 @@ int ath_vap_listen(struct ath_softc *sc, int if_id)
         * XXXX
         * Disable BMISS interrupt when we're not associated
         */
-       ath9k_hw_set_interrupts(ah,
-               sc->sc_imask & ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS));
-       sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
+       if (sc->sc_ah->ah_opmode == ATH9K_M_HOSTAP) {
+               ath9k_hw_set_interrupts(ah, sc->sc_imask & ~ATH9K_INT_BMISS);
+               sc->sc_imask &= ~ATH9K_INT_BMISS;
+       } else {
+               ath9k_hw_set_interrupts(
+                       ah,
+                       sc->sc_imask & ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS));
+               sc->sc_imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
+       }
        /* need to reconfigure the beacons when it moves to RUN */
        sc->sc_flags &= ~SC_OP_BEACONS;
 
index 7fb57ee4c436c74c34514ddf6ca4db1bda4a7780..183c76e1187db560fdbdaef981d3820aa8a0d76d 100644 (file)
@@ -426,10 +426,13 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
        case IEEE80211_IF_TYPE_IBSS:
                ic_opmode = ATH9K_M_IBSS;
                break;
+       case IEEE80211_IF_TYPE_AP:
+               ic_opmode = ATH9K_M_HOSTAP;
+               break;
        default:
                DPRINTF(sc, ATH_DBG_FATAL,
-                       "%s: Only STA and IBSS are supported currently\n",
-                       __func__);
+                       "%s: Interface type %d not yet supported\n",
+                       __func__, conf->type);
                return -EOPNOTSUPP;
        }
 
@@ -530,6 +533,7 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
                                  struct ieee80211_if_conf *conf)
 {
        struct ath_softc *sc = hw->priv;
+       struct ath_hal *ah = sc->sc_ah;
        struct ath_vap *avp;
        u32 rfilt = 0;
        int error, i;
@@ -542,6 +546,17 @@ static int ath9k_config_interface(struct ieee80211_hw *hw,
                return -EINVAL;
        }
 
+       /* TODO: Need to decide which hw opmode to use for multi-interface
+        * cases */
+       if (vif->type == IEEE80211_IF_TYPE_AP &&
+           ah->ah_opmode != ATH9K_M_HOSTAP) {
+               ah->ah_opmode = ATH9K_M_HOSTAP;
+               ath9k_hw_setopmode(ah);
+               ath9k_hw_write_associd(ah, sc->sc_myaddr, 0);
+               /* Request full reset to get hw opmode changed properly */
+               sc->sc_flags |= SC_OP_FULL_RESET;
+       }
+
        if ((conf->changed & IEEE80211_IFCC_BSSID) &&
            !is_zero_ether_addr(conf->bssid)) {
                switch (vif->type) {