aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2009-09-17 13:43:51 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-10-07 16:39:35 -0400
commit2f748deceee10bac563df0e859830cc628d1a841 (patch)
tree5eff6c8dbe0a464af077207dd45ddcc3e2501839 /drivers
parente3949d62861b3fdef19e80080d670aa1153a23c4 (diff)
iwlwifi: send cmd to uCode to configure valid tx antenna
In order for uCode to select the valid antennas for transmit, driver need to configure the allowed tx antennas through host command. The TX_ANT_CONFIGURATION_CMD should be used for 5000 series and up Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com> Signed-off-by: Reinette Chatre <reinette.chatre@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c19
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h1
4 files changed, 35 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index 75fa55db330e..68d97f50fd00 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -1450,6 +1450,24 @@ int iwl5000_calc_rssi(struct iwl_priv *priv,
1450 return max_rssi - agc - IWL49_RSSI_OFFSET; 1450 return max_rssi - agc - IWL49_RSSI_OFFSET;
1451} 1451}
1452 1452
1453static int iwl5000_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
1454{
1455 struct iwl_tx_ant_config_cmd tx_ant_cmd = {
1456 .valid = cpu_to_le32(valid_tx_ant),
1457 };
1458
1459 if (IWL_UCODE_API(priv->ucode_ver) > 1) {
1460 IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant);
1461 return iwl_send_cmd_pdu(priv, TX_ANT_CONFIGURATION_CMD,
1462 sizeof(struct iwl_tx_ant_config_cmd),
1463 &tx_ant_cmd);
1464 } else {
1465 IWL_DEBUG_HC(priv, "TX_ANT_CONFIGURATION_CMD not supported\n");
1466 return -EOPNOTSUPP;
1467 }
1468}
1469
1470
1453#define IWL5000_UCODE_GET(item) \ 1471#define IWL5000_UCODE_GET(item) \
1454static u32 iwl5000_ucode_get_##item(const struct iwl_ucode_header *ucode,\ 1472static u32 iwl5000_ucode_get_##item(const struct iwl_ucode_header *ucode,\
1455 u32 api_ver) \ 1473 u32 api_ver) \
@@ -1492,6 +1510,7 @@ struct iwl_hcmd_ops iwl5000_hcmd = {
1492 .rxon_assoc = iwl5000_send_rxon_assoc, 1510 .rxon_assoc = iwl5000_send_rxon_assoc,
1493 .commit_rxon = iwl_commit_rxon, 1511 .commit_rxon = iwl_commit_rxon,
1494 .set_rxon_chain = iwl_set_rxon_chain, 1512 .set_rxon_chain = iwl_set_rxon_chain,
1513 .set_tx_ant = iwl5000_send_tx_ant_config,
1495}; 1514};
1496 1515
1497struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { 1516struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = {
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index cf2b481dca6d..5505878dcaf7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -1762,6 +1762,10 @@ static void iwl_alive_start(struct iwl_priv *priv)
1762 priv->active_rate = priv->rates_mask; 1762 priv->active_rate = priv->rates_mask;
1763 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; 1763 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
1764 1764
1765 /* Configure Tx antenna selection based on H/W config */
1766 if (priv->cfg->ops->hcmd->set_tx_ant)
1767 priv->cfg->ops->hcmd->set_tx_ant(priv, priv->cfg->valid_tx_ant);
1768
1765 if (iwl_is_associated(priv)) { 1769 if (iwl_is_associated(priv)) {
1766 struct iwl_rxon_cmd *active_rxon = 1770 struct iwl_rxon_cmd *active_rxon =
1767 (struct iwl_rxon_cmd *)&priv->active_rxon; 1771 (struct iwl_rxon_cmd *)&priv->active_rxon;
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index 2c5c88fc38f5..e5f40f35dc3f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -148,7 +148,7 @@ enum {
148 QUIET_NOTIFICATION = 0x96, /* not used */ 148 QUIET_NOTIFICATION = 0x96, /* not used */
149 REPLY_TX_PWR_TABLE_CMD = 0x97, 149 REPLY_TX_PWR_TABLE_CMD = 0x97,
150 REPLY_TX_POWER_DBM_CMD_V1 = 0x98, /* old version of API */ 150 REPLY_TX_POWER_DBM_CMD_V1 = 0x98, /* old version of API */
151 TX_ANT_CONFIGURATION_CMD = 0x98, /* not used */ 151 TX_ANT_CONFIGURATION_CMD = 0x98,
152 MEASURE_ABORT_NOTIFICATION = 0x99, /* not used */ 152 MEASURE_ABORT_NOTIFICATION = 0x99, /* not used */
153 153
154 /* Bluetooth device coexistence config command */ 154 /* Bluetooth device coexistence config command */
@@ -411,6 +411,16 @@ struct iwl5000_tx_power_dbm_cmd {
411 u8 reserved; 411 u8 reserved;
412} __attribute__ ((packed)); 412} __attribute__ ((packed));
413 413
414/**
415 * Command TX_ANT_CONFIGURATION_CMD = 0x98
416 * This command is used to configure valid Tx antenna.
417 * By default uCode concludes the valid antenna according to the radio flavor.
418 * This command enables the driver to override/modify this conclusion.
419 */
420struct iwl_tx_ant_config_cmd {
421 __le32 valid;
422} __attribute__ ((packed));
423
414/****************************************************************************** 424/******************************************************************************
415 * (0a) 425 * (0a)
416 * Alive and Error Commands & Responses: 426 * Alive and Error Commands & Responses:
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index c7675c387140..f094cd9de443 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -89,6 +89,7 @@ struct iwl_hcmd_ops {
89 int (*rxon_assoc)(struct iwl_priv *priv); 89 int (*rxon_assoc)(struct iwl_priv *priv);
90 int (*commit_rxon)(struct iwl_priv *priv); 90 int (*commit_rxon)(struct iwl_priv *priv);
91 void (*set_rxon_chain)(struct iwl_priv *priv); 91 void (*set_rxon_chain)(struct iwl_priv *priv);
92 int (*set_tx_ant)(struct iwl_priv *priv, u8 valid_tx_ant);
92}; 93};
93 94
94struct iwl_hcmd_utils_ops { 95struct iwl_hcmd_utils_ops {