|
@@ -132,6 +132,7 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
|
|
|
struct iwl_host_cmd cmd = {
|
|
|
.id = REPLY_TX_BEACON,
|
|
|
};
|
|
|
+ struct ieee80211_tx_info *info;
|
|
|
u32 frame_size;
|
|
|
u32 rate_flags;
|
|
|
u32 rate;
|
|
@@ -172,14 +173,31 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
|
|
|
frame_size);
|
|
|
|
|
|
/* Set up packet rate and flags */
|
|
|
- rate = iwl_rate_get_lowest_plcp(priv, priv->beacon_ctx);
|
|
|
+ info = IEEE80211_SKB_CB(priv->beacon_skb);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Let's set up the rate at least somewhat correctly;
|
|
|
+ * it will currently not actually be used by the uCode,
|
|
|
+ * it uses the broadcast station's rate instead.
|
|
|
+ */
|
|
|
+ if (info->control.rates[0].idx < 0 ||
|
|
|
+ info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
|
|
|
+ rate = 0;
|
|
|
+ else
|
|
|
+ rate = info->control.rates[0].idx;
|
|
|
+
|
|
|
priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
|
|
|
priv->hw_params.valid_tx_ant);
|
|
|
rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
|
|
|
- if ((rate >= IWL_FIRST_CCK_RATE) && (rate <= IWL_LAST_CCK_RATE))
|
|
|
+
|
|
|
+ /* In mac80211, rates for 5 GHz start at 0 */
|
|
|
+ if (info->band == IEEE80211_BAND_5GHZ)
|
|
|
+ rate += IWL_FIRST_OFDM_RATE;
|
|
|
+ else if (rate >= IWL_FIRST_CCK_RATE && rate <= IWL_LAST_CCK_RATE)
|
|
|
rate_flags |= RATE_MCS_CCK_MSK;
|
|
|
- tx_beacon_cmd->tx.rate_n_flags = iwl_hw_set_rate_n_flags(rate,
|
|
|
- rate_flags);
|
|
|
+
|
|
|
+ tx_beacon_cmd->tx.rate_n_flags =
|
|
|
+ iwl_hw_set_rate_n_flags(rate, rate_flags);
|
|
|
|
|
|
/* Submit command */
|
|
|
cmd.len[0] = sizeof(*tx_beacon_cmd);
|