aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/mwl8k.c
diff options
context:
space:
mode:
authorLennert Buytenhek <buytenh@wantstofly.org>2010-01-12 07:49:41 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-01-12 14:21:18 -0500
commit06953235f48c696b22c5ed45570680fb070f7277 (patch)
treefe5a8a485682ade88799d4fb8d862fb3f15729df /drivers/net/wireless/mwl8k.c
parent42574ea2274ec0a2a9c58ab01be91b65e60a2291 (diff)
mwl8k: use firmware capability field to decide which bands to register
Make the decision about whether to register the 2.4 and 5 GHz bands with mac80211 by looking at the capability field in GET_HW_SPEC (STA firmware only for now). This enables 5 GHz STA operation. Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/mwl8k.c')
-rw-r--r--drivers/net/wireless/mwl8k.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 6e8c126aa5e..382ef4305a3 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -1666,11 +1666,14 @@ struct mwl8k_cmd_get_hw_spec_sta {
1666#define MWL8K_CAP_DELAY_BA 0x00003000 1666#define MWL8K_CAP_DELAY_BA 0x00003000
1667#define MWL8K_CAP_MIMO 0x00000200 1667#define MWL8K_CAP_MIMO 0x00000200
1668#define MWL8K_CAP_40MHZ 0x00000100 1668#define MWL8K_CAP_40MHZ 0x00000100
1669#define MWL8K_CAP_BAND_MASK 0x00000007
1670#define MWL8K_CAP_5GHZ 0x00000004
1671#define MWL8K_CAP_2GHZ4 0x00000001
1669 1672
1670static void mwl8k_set_ht_caps(struct ieee80211_hw *hw, u32 cap) 1673static void
1674mwl8k_set_ht_caps(struct ieee80211_hw *hw,
1675 struct ieee80211_supported_band *band, u32 cap)
1671{ 1676{
1672 struct mwl8k_priv *priv = hw->priv;
1673 struct ieee80211_supported_band *band = &priv->band_24;
1674 int rx_streams; 1677 int rx_streams;
1675 int tx_streams; 1678 int tx_streams;
1676 1679
@@ -1716,6 +1719,24 @@ static void mwl8k_set_ht_caps(struct ieee80211_hw *hw, u32 cap)
1716 } 1719 }
1717} 1720}
1718 1721
1722static void
1723mwl8k_set_caps(struct ieee80211_hw *hw, u32 caps)
1724{
1725 struct mwl8k_priv *priv = hw->priv;
1726
1727 if ((caps & MWL8K_CAP_2GHZ4) || !(caps & MWL8K_CAP_BAND_MASK)) {
1728 mwl8k_setup_2ghz_band(hw);
1729 if (caps & MWL8K_CAP_MIMO)
1730 mwl8k_set_ht_caps(hw, &priv->band_24, caps);
1731 }
1732
1733 if (caps & MWL8K_CAP_5GHZ) {
1734 mwl8k_setup_5ghz_band(hw);
1735 if (caps & MWL8K_CAP_MIMO)
1736 mwl8k_set_ht_caps(hw, &priv->band_50, caps);
1737 }
1738}
1739
1719static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw) 1740static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)
1720{ 1741{
1721 struct mwl8k_priv *priv = hw->priv; 1742 struct mwl8k_priv *priv = hw->priv;
@@ -1746,9 +1767,7 @@ static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw)
1746 priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs); 1767 priv->num_mcaddrs = le16_to_cpu(cmd->num_mcaddrs);
1747 priv->fw_rev = le32_to_cpu(cmd->fw_rev); 1768 priv->fw_rev = le32_to_cpu(cmd->fw_rev);
1748 priv->hw_rev = cmd->hw_rev; 1769 priv->hw_rev = cmd->hw_rev;
1749 mwl8k_setup_2ghz_band(hw); 1770 mwl8k_set_caps(hw, le32_to_cpu(cmd->caps));
1750 if (cmd->caps & cpu_to_le32(MWL8K_CAP_MIMO))
1751 mwl8k_set_ht_caps(hw, le32_to_cpu(cmd->caps));
1752 } 1771 }
1753 1772
1754 kfree(cmd); 1773 kfree(cmd);