diff options
author | Lennert Buytenhek <buytenh@wantstofly.org> | 2010-01-12 07:49:41 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-01-12 14:21:18 -0500 |
commit | 06953235f48c696b22c5ed45570680fb070f7277 (patch) | |
tree | fe5a8a485682ade88799d4fb8d862fb3f15729df /drivers/net/wireless/mwl8k.c | |
parent | 42574ea2274ec0a2a9c58ab01be91b65e60a2291 (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.c | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c index 6e8c126aa5e0..382ef4305a3e 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 | ||
1670 | static void mwl8k_set_ht_caps(struct ieee80211_hw *hw, u32 cap) | 1673 | static void |
1674 | mwl8k_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 | ||
1722 | static void | ||
1723 | mwl8k_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 | |||
1719 | static int mwl8k_cmd_get_hw_spec_sta(struct ieee80211_hw *hw) | 1740 | static 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); |