mwl8k: don't overwrite regulatory settings on fw reload
authorJonas Gorski <jogo@openwrt.org>
Mon, 11 Mar 2013 16:44:21 +0000 (17:44 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 11 Mar 2013 19:06:14 +0000 (15:06 -0400)
Currently the caps are parsed on every firmware reload, causing any
channel flags to be cleared.
When there is a firmware to interface mode mismatch, the triggered
firmware reload causes a reset of the regulatory settings, causing all
channels to become available:

root@openrouter:/# iw phy phy0 info
Wiphy phy0
        Band 1:
(...)
                Frequencies:
                        * 2412 MHz [1] (0.0 dBm)
                        * 2417 MHz [2] (0.0 dBm)
                        * 2422 MHz [3] (0.0 dBm)
                        * 2427 MHz [4] (0.0 dBm)
                        * 2432 MHz [5] (0.0 dBm)
                        * 2437 MHz [6] (0.0 dBm)
                        * 2442 MHz [7] (0.0 dBm)
                        * 2447 MHz [8] (0.0 dBm)
                        * 2452 MHz [9] (0.0 dBm)
                        * 2457 MHz [10] (0.0 dBm)
                        * 2462 MHz [11] (0.0 dBm)
                        * 2467 MHz [12] (0.0 dBm)
                        * 2472 MHz [13] (0.0 dBm)
                        * 2484 MHz [14] (0.0 dBm)
(...)

To prevent this, only parse the caps on the first firmware load during
hardware probe, and store them locally to know we have already parsed
them.

Signed-off-by: Jonas Gorski <jogo@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwl8k.c

index aaaf10d48f7dec1b5b8f17dd2ccfbbe58415ad71..0640e7d7f0c2c06c0bee29b7009ebe472dd62095 100644 (file)
@@ -232,6 +232,7 @@ struct mwl8k_priv {
        u16 num_mcaddrs;
        u8 hw_rev;
        u32 fw_rev;
        u16 num_mcaddrs;
        u8 hw_rev;
        u32 fw_rev;
+       u32 caps;
 
        /*
         * Running count of TX packets in flight, to avoid
 
        /*
         * Running count of TX packets in flight, to avoid
@@ -2410,6 +2411,9 @@ mwl8k_set_caps(struct ieee80211_hw *hw, u32 caps)
 {
        struct mwl8k_priv *priv = hw->priv;
 
 {
        struct mwl8k_priv *priv = hw->priv;
 
+       if (priv->caps)
+               return;
+
        if ((caps & MWL8K_CAP_2GHZ4) || !(caps & MWL8K_CAP_BAND_MASK)) {
                mwl8k_setup_2ghz_band(hw);
                if (caps & MWL8K_CAP_MIMO)
        if ((caps & MWL8K_CAP_2GHZ4) || !(caps & MWL8K_CAP_BAND_MASK)) {
                mwl8k_setup_2ghz_band(hw);
                if (caps & MWL8K_CAP_MIMO)
@@ -2421,6 +2425,8 @@ mwl8k_set_caps(struct ieee80211_hw *hw, u32 caps)
                if (caps & MWL8K_CAP_MIMO)
                        mwl8k_set_ht_caps(hw, &priv->band_50, caps);
        }
                if (caps & MWL8K_CAP_MIMO)
                        mwl8k_set_ht_caps(hw, &priv->band_50, caps);
        }
+
+       priv->caps = caps;
 }
 
 static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)
 }
 
 static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)