aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennert Buytenhek <buytenh@wantstofly.org>2009-10-22 14:21:33 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-11-06 16:54:38 -0500
commit08b063477e45cb366df7204cbcdc79ff86513ef9 (patch)
tree37839c036dcd785381624dbf8f4798555b17a0e1
parent42fba21d56df644887488a29b158cc8916b9ba99 (diff)
mwl8k: implement AP firmware antenna configuration
Signed-off-by: Lennert Buytenhek <buytenh@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/mwl8k.c44
1 files changed, 42 insertions, 2 deletions
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 9b9ce7005da0..59219fdb342d 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -280,6 +280,7 @@ static const struct ieee80211_rate mwl8k_rates[] = {
280#define MWL8K_CMD_GET_STAT 0x0014 280#define MWL8K_CMD_GET_STAT 0x0014
281#define MWL8K_CMD_RADIO_CONTROL 0x001c 281#define MWL8K_CMD_RADIO_CONTROL 0x001c
282#define MWL8K_CMD_RF_TX_POWER 0x001e 282#define MWL8K_CMD_RF_TX_POWER 0x001e
283#define MWL8K_CMD_RF_ANTENNA 0x0020
283#define MWL8K_CMD_SET_PRE_SCAN 0x0107 284#define MWL8K_CMD_SET_PRE_SCAN 0x0107
284#define MWL8K_CMD_SET_POST_SCAN 0x0108 285#define MWL8K_CMD_SET_POST_SCAN 0x0108
285#define MWL8K_CMD_SET_RF_CHANNEL 0x010a 286#define MWL8K_CMD_SET_RF_CHANNEL 0x010a
@@ -311,6 +312,7 @@ static const char *mwl8k_cmd_name(u16 cmd, char *buf, int bufsize)
311 MWL8K_CMDNAME(GET_STAT); 312 MWL8K_CMDNAME(GET_STAT);
312 MWL8K_CMDNAME(RADIO_CONTROL); 313 MWL8K_CMDNAME(RADIO_CONTROL);
313 MWL8K_CMDNAME(RF_TX_POWER); 314 MWL8K_CMDNAME(RF_TX_POWER);
315 MWL8K_CMDNAME(RF_ANTENNA);
314 MWL8K_CMDNAME(SET_PRE_SCAN); 316 MWL8K_CMDNAME(SET_PRE_SCAN);
315 MWL8K_CMDNAME(SET_POST_SCAN); 317 MWL8K_CMDNAME(SET_POST_SCAN);
316 MWL8K_CMDNAME(SET_RF_CHANNEL); 318 MWL8K_CMDNAME(SET_RF_CHANNEL);
@@ -1919,6 +1921,39 @@ static int mwl8k_cmd_802_11_rf_tx_power(struct ieee80211_hw *hw, int dBm)
1919} 1921}
1920 1922
1921/* 1923/*
1924 * CMD_RF_ANTENNA.
1925 */
1926struct mwl8k_cmd_rf_antenna {
1927 struct mwl8k_cmd_pkt header;
1928 __le16 antenna;
1929 __le16 mode;
1930} __attribute__((packed));
1931
1932#define MWL8K_RF_ANTENNA_RX 1
1933#define MWL8K_RF_ANTENNA_TX 2
1934
1935static int
1936mwl8k_cmd_rf_antenna(struct ieee80211_hw *hw, int antenna, int mask)
1937{
1938 struct mwl8k_cmd_rf_antenna *cmd;
1939 int rc;
1940
1941 cmd = kzalloc(sizeof(*cmd), GFP_KERNEL);
1942 if (cmd == NULL)
1943 return -ENOMEM;
1944
1945 cmd->header.code = cpu_to_le16(MWL8K_CMD_RF_ANTENNA);
1946 cmd->header.length = cpu_to_le16(sizeof(*cmd));
1947 cmd->antenna = cpu_to_le16(antenna);
1948 cmd->mode = cpu_to_le16(mask);
1949
1950 rc = mwl8k_post_cmd(hw, &cmd->header);
1951 kfree(cmd);
1952
1953 return rc;
1954}
1955
1956/*
1922 * CMD_SET_PRE_SCAN. 1957 * CMD_SET_PRE_SCAN.
1923 */ 1958 */
1924struct mwl8k_cmd_set_pre_scan { 1959struct mwl8k_cmd_set_pre_scan {
@@ -2832,8 +2867,13 @@ static int mwl8k_config(struct ieee80211_hw *hw, u32 changed)
2832 if (rc) 2867 if (rc)
2833 goto out; 2868 goto out;
2834 2869
2835 if (mwl8k_cmd_mimo_config(hw, 0x7, 0x7)) 2870 if (priv->ap_fw) {
2836 rc = -EINVAL; 2871 rc = mwl8k_cmd_rf_antenna(hw, MWL8K_RF_ANTENNA_RX, 0x7);
2872 if (!rc)
2873 rc = mwl8k_cmd_rf_antenna(hw, MWL8K_RF_ANTENNA_TX, 0x7);
2874 } else {
2875 rc = mwl8k_cmd_mimo_config(hw, 0x7, 0x7);
2876 }
2837 2877
2838out: 2878out:
2839 mwl8k_fw_unlock(hw); 2879 mwl8k_fw_unlock(hw);