diff options
author | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-05-03 21:05:13 -0400 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-05-13 15:02:20 -0400 |
commit | 6489854b9cbc2faa6709532e61c3ea221cf8583b (patch) | |
tree | c9f57e5e04531569556c2cc70ec999a288138b5a /drivers/net | |
parent | 4babc358c0a1bced6bed2c9d6c77fc8803b8a22f (diff) |
iwlagn: add testmode set fixed rate command
Add support in testmode for setting fixed rate
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-rs.c | 58 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-sv-open.c | 11 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-testmode.h | 7 |
4 files changed, 57 insertions, 21 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index dbe6295bbf23..432f839700dd 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -335,6 +335,32 @@ static u8 rs_tl_add_packet(struct iwl_lq_sta *lq_data, | |||
335 | return tid; | 335 | return tid; |
336 | } | 336 | } |
337 | 337 | ||
338 | #if defined(CONFIG_MAC80211_DEBUGFS) || defined(CONFIG_IWLWIFI_DEVICE_SVTOOL) | ||
339 | static void rs_program_fix_rate(struct iwl_priv *priv, | ||
340 | struct iwl_lq_sta *lq_sta) | ||
341 | { | ||
342 | struct iwl_station_priv *sta_priv = | ||
343 | container_of(lq_sta, struct iwl_station_priv, lq_sta); | ||
344 | struct iwl_rxon_context *ctx = sta_priv->common.ctx; | ||
345 | |||
346 | lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */ | ||
347 | lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ | ||
348 | lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ | ||
349 | lq_sta->active_mimo3_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ | ||
350 | |||
351 | lq_sta->dbg_fixed_rate = priv->dbg_fixed_rate; | ||
352 | |||
353 | IWL_DEBUG_RATE(priv, "sta_id %d rate 0x%X\n", | ||
354 | lq_sta->lq.sta_id, priv->dbg_fixed_rate); | ||
355 | |||
356 | if (priv->dbg_fixed_rate) { | ||
357 | rs_fill_link_cmd(NULL, lq_sta, priv->dbg_fixed_rate); | ||
358 | iwl_send_lq_cmd(lq_sta->drv, ctx, &lq_sta->lq, CMD_ASYNC, | ||
359 | false); | ||
360 | } | ||
361 | } | ||
362 | #endif | ||
363 | |||
338 | /* | 364 | /* |
339 | get the traffic load value for tid | 365 | get the traffic load value for tid |
340 | */ | 366 | */ |
@@ -1046,7 +1072,10 @@ done: | |||
1046 | /* See if there's a better rate or modulation mode to try. */ | 1072 | /* See if there's a better rate or modulation mode to try. */ |
1047 | if (sta && sta->supp_rates[sband->band]) | 1073 | if (sta && sta->supp_rates[sband->band]) |
1048 | rs_rate_scale_perform(priv, skb, sta, lq_sta); | 1074 | rs_rate_scale_perform(priv, skb, sta, lq_sta); |
1049 | 1075 | #ifdef CONFIG_IWLWIFI_DEVICE_SVTOOL | |
1076 | if (priv->dbg_fixed_rate != lq_sta->dbg_fixed_rate) | ||
1077 | rs_program_fix_rate(priv, lq_sta); | ||
1078 | #endif | ||
1050 | if (priv->cfg->bt_params && priv->cfg->bt_params->advanced_bt_coexist) | 1079 | if (priv->cfg->bt_params && priv->cfg->bt_params->advanced_bt_coexist) |
1051 | rs_bt_update_lq(priv, ctx, lq_sta); | 1080 | rs_bt_update_lq(priv, ctx, lq_sta); |
1052 | } | 1081 | } |
@@ -2871,6 +2900,7 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i | |||
2871 | lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE; | 2900 | lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE; |
2872 | lq_sta->is_agg = 0; | 2901 | lq_sta->is_agg = 0; |
2873 | 2902 | ||
2903 | priv->dbg_fixed_rate = 0; | ||
2874 | #ifdef CONFIG_MAC80211_DEBUGFS | 2904 | #ifdef CONFIG_MAC80211_DEBUGFS |
2875 | lq_sta->dbg_fixed_rate = 0; | 2905 | lq_sta->dbg_fixed_rate = 0; |
2876 | #endif | 2906 | #endif |
@@ -3045,7 +3075,6 @@ static void rs_free_sta(void *priv_r, struct ieee80211_sta *sta, | |||
3045 | IWL_DEBUG_RATE(priv, "leave\n"); | 3075 | IWL_DEBUG_RATE(priv, "leave\n"); |
3046 | } | 3076 | } |
3047 | 3077 | ||
3048 | |||
3049 | #ifdef CONFIG_MAC80211_DEBUGFS | 3078 | #ifdef CONFIG_MAC80211_DEBUGFS |
3050 | static int open_file_generic(struct inode *inode, struct file *file) | 3079 | static int open_file_generic(struct inode *inode, struct file *file) |
3051 | { | 3080 | { |
@@ -3070,6 +3099,7 @@ static void rs_dbgfs_set_mcs(struct iwl_lq_sta *lq_sta, | |||
3070 | IWL_DEBUG_RATE(priv, "Fixed rate ON\n"); | 3099 | IWL_DEBUG_RATE(priv, "Fixed rate ON\n"); |
3071 | } else { | 3100 | } else { |
3072 | lq_sta->dbg_fixed_rate = 0; | 3101 | lq_sta->dbg_fixed_rate = 0; |
3102 | priv->dbg_fixed_rate = 0; | ||
3073 | IWL_ERR(priv, | 3103 | IWL_ERR(priv, |
3074 | "Invalid antenna selection 0x%X, Valid is 0x%X\n", | 3104 | "Invalid antenna selection 0x%X, Valid is 0x%X\n", |
3075 | ant_sel_tx, valid_tx_ant); | 3105 | ant_sel_tx, valid_tx_ant); |
@@ -3088,9 +3118,7 @@ static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file, | |||
3088 | char buf[64]; | 3118 | char buf[64]; |
3089 | int buf_size; | 3119 | int buf_size; |
3090 | u32 parsed_rate; | 3120 | u32 parsed_rate; |
3091 | struct iwl_station_priv *sta_priv = | 3121 | |
3092 | container_of(lq_sta, struct iwl_station_priv, lq_sta); | ||
3093 | struct iwl_rxon_context *ctx = sta_priv->common.ctx; | ||
3094 | 3122 | ||
3095 | priv = lq_sta->drv; | 3123 | priv = lq_sta->drv; |
3096 | memset(buf, 0, sizeof(buf)); | 3124 | memset(buf, 0, sizeof(buf)); |
@@ -3099,23 +3127,11 @@ static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file, | |||
3099 | return -EFAULT; | 3127 | return -EFAULT; |
3100 | 3128 | ||
3101 | if (sscanf(buf, "%x", &parsed_rate) == 1) | 3129 | if (sscanf(buf, "%x", &parsed_rate) == 1) |
3102 | lq_sta->dbg_fixed_rate = parsed_rate; | 3130 | priv->dbg_fixed_rate = lq_sta->dbg_fixed_rate = parsed_rate; |
3103 | else | 3131 | else |
3104 | lq_sta->dbg_fixed_rate = 0; | 3132 | priv->dbg_fixed_rate = lq_sta->dbg_fixed_rate = 0; |
3105 | |||
3106 | lq_sta->active_legacy_rate = 0x0FFF; /* 1 - 54 MBits, includes CCK */ | ||
3107 | lq_sta->active_siso_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ | ||
3108 | lq_sta->active_mimo2_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ | ||
3109 | lq_sta->active_mimo3_rate = 0x1FD0; /* 6 - 60 MBits, no 9, no CCK */ | ||
3110 | |||
3111 | IWL_DEBUG_RATE(priv, "sta_id %d rate 0x%X\n", | ||
3112 | lq_sta->lq.sta_id, lq_sta->dbg_fixed_rate); | ||
3113 | 3133 | ||
3114 | if (lq_sta->dbg_fixed_rate) { | 3134 | rs_program_fix_rate(priv, lq_sta); |
3115 | rs_fill_link_cmd(NULL, lq_sta, lq_sta->dbg_fixed_rate); | ||
3116 | iwl_send_lq_cmd(lq_sta->drv, ctx, &lq_sta->lq, CMD_ASYNC, | ||
3117 | false); | ||
3118 | } | ||
3119 | 3135 | ||
3120 | return count; | 3136 | return count; |
3121 | } | 3137 | } |
@@ -3143,7 +3159,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
3143 | lq_sta->total_failed, lq_sta->total_success, | 3159 | lq_sta->total_failed, lq_sta->total_success, |
3144 | lq_sta->active_legacy_rate); | 3160 | lq_sta->active_legacy_rate); |
3145 | desc += sprintf(buff+desc, "fixed rate 0x%X\n", | 3161 | desc += sprintf(buff+desc, "fixed rate 0x%X\n", |
3146 | lq_sta->dbg_fixed_rate); | 3162 | priv->dbg_fixed_rate); |
3147 | desc += sprintf(buff+desc, "valid_tx_ant %s%s%s\n", | 3163 | desc += sprintf(buff+desc, "valid_tx_ant %s%s%s\n", |
3148 | (priv->hw_params.valid_tx_ant & ANT_A) ? "ANT_A," : "", | 3164 | (priv->hw_params.valid_tx_ant & ANT_A) ? "ANT_A," : "", |
3149 | (priv->hw_params.valid_tx_ant & ANT_B) ? "ANT_B," : "", | 3165 | (priv->hw_params.valid_tx_ant & ANT_B) ? "ANT_B," : "", |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 12fb2f4ca0b1..ab29ab52edd0 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -1521,6 +1521,8 @@ struct iwl_priv { | |||
1521 | #ifdef CONFIG_IWLWIFI_DEVICE_SVTOOL | 1521 | #ifdef CONFIG_IWLWIFI_DEVICE_SVTOOL |
1522 | struct iwl_testmode_trace testmode_trace; | 1522 | struct iwl_testmode_trace testmode_trace; |
1523 | #endif | 1523 | #endif |
1524 | u32 dbg_fixed_rate; | ||
1525 | |||
1524 | }; /*iwl_priv */ | 1526 | }; /*iwl_priv */ |
1525 | 1527 | ||
1526 | static inline void iwl_txq_ctx_activate(struct iwl_priv *priv, int txq_id) | 1528 | static inline void iwl_txq_ctx_activate(struct iwl_priv *priv, int txq_id) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sv-open.c b/drivers/net/wireless/iwlwifi/iwl-sv-open.c index e77ccaaf54ba..69b7e6bf2d6f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sv-open.c +++ b/drivers/net/wireless/iwlwifi/iwl-sv-open.c | |||
@@ -103,6 +103,7 @@ struct nla_policy iwl_testmode_gnl_msg_policy[IWL_TM_ATTR_MAX] = { | |||
103 | [IWL_TM_ATTR_TRACE_ADDR] = { .type = NLA_UNSPEC, }, | 103 | [IWL_TM_ATTR_TRACE_ADDR] = { .type = NLA_UNSPEC, }, |
104 | [IWL_TM_ATTR_TRACE_DATA] = { .type = NLA_UNSPEC, }, | 104 | [IWL_TM_ATTR_TRACE_DATA] = { .type = NLA_UNSPEC, }, |
105 | 105 | ||
106 | [IWL_TM_ATTR_FIXRATE] = { .type = NLA_U32, }, | ||
106 | }; | 107 | }; |
107 | 108 | ||
108 | /* | 109 | /* |
@@ -443,6 +444,15 @@ static int iwl_testmode_driver(struct ieee80211_hw *hw, struct nlattr **tb) | |||
443 | return -EFAULT; | 444 | return -EFAULT; |
444 | break; | 445 | break; |
445 | 446 | ||
447 | case IWL_TM_CMD_APP2DEV_FIXRATE_REQ: | ||
448 | if (!tb[IWL_TM_ATTR_FIXRATE]) { | ||
449 | IWL_DEBUG_INFO(priv, | ||
450 | "Error finding fixrate setting\n"); | ||
451 | return -ENOMSG; | ||
452 | } | ||
453 | priv->dbg_fixed_rate = nla_get_u32(tb[IWL_TM_ATTR_FIXRATE]); | ||
454 | break; | ||
455 | |||
446 | default: | 456 | default: |
447 | IWL_DEBUG_INFO(priv, "Unknown testmode driver command ID\n"); | 457 | IWL_DEBUG_INFO(priv, "Unknown testmode driver command ID\n"); |
448 | return -ENOSYS; | 458 | return -ENOSYS; |
@@ -607,6 +617,7 @@ int iwl_testmode_cmd(struct ieee80211_hw *hw, void *data, int len) | |||
607 | case IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB: | 617 | case IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB: |
608 | case IWL_TM_CMD_APP2DEV_LOAD_RUNTIME_FW: | 618 | case IWL_TM_CMD_APP2DEV_LOAD_RUNTIME_FW: |
609 | case IWL_TM_CMD_APP2DEV_GET_EEPROM: | 619 | case IWL_TM_CMD_APP2DEV_GET_EEPROM: |
620 | case IWL_TM_CMD_APP2DEV_FIXRATE_REQ: | ||
610 | IWL_DEBUG_INFO(priv, "testmode cmd to driver\n"); | 621 | IWL_DEBUG_INFO(priv, "testmode cmd to driver\n"); |
611 | result = iwl_testmode_driver(hw, tb); | 622 | result = iwl_testmode_driver(hw, tb); |
612 | break; | 623 | break; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-testmode.h b/drivers/net/wireless/iwlwifi/iwl-testmode.h index 4171d2963828..a88085e9b361 100644 --- a/drivers/net/wireless/iwlwifi/iwl-testmode.h +++ b/drivers/net/wireless/iwlwifi/iwl-testmode.h | |||
@@ -89,6 +89,7 @@ enum iwl_tm_cmd_t { | |||
89 | IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB, | 89 | IWL_TM_CMD_APP2DEV_CFG_INIT_CALIB, |
90 | IWL_TM_CMD_APP2DEV_LOAD_RUNTIME_FW, | 90 | IWL_TM_CMD_APP2DEV_LOAD_RUNTIME_FW, |
91 | IWL_TM_CMD_APP2DEV_GET_EEPROM, | 91 | IWL_TM_CMD_APP2DEV_GET_EEPROM, |
92 | IWL_TM_CMD_APP2DEV_FIXRATE_REQ, | ||
92 | /* if there is other new command for the driver layer operation, | 93 | /* if there is other new command for the driver layer operation, |
93 | * append them here */ | 94 | * append them here */ |
94 | 95 | ||
@@ -167,6 +168,12 @@ enum iwl_tm_attr_t { | |||
167 | IWL_TM_ATTR_TRACE_ADDR, | 168 | IWL_TM_ATTR_TRACE_ADDR, |
168 | IWL_TM_ATTR_TRACE_DATA, | 169 | IWL_TM_ATTR_TRACE_DATA, |
169 | 170 | ||
171 | /* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_FIXRATE_REQ, | ||
172 | * The mandatory fields are: | ||
173 | * IWL_TM_ATTR_FIXRATE for the fixed rate | ||
174 | */ | ||
175 | IWL_TM_ATTR_FIXRATE, | ||
176 | |||
170 | IWL_TM_ATTR_MAX, | 177 | IWL_TM_ATTR_MAX, |
171 | }; | 178 | }; |
172 | 179 | ||