Switch the antenna used for management tx only if previous tx failed.
If previous tx succeeded, there is no reason to switch antennas.
Signed-off-by: Avraham Stern <avraham.stern@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
        tx->tx_flags = cpu_to_le32(tx_flags);
 
        if (!fw_has_capa(&mvm->fw->ucode_capa,
-                        IWL_UCODE_TLV_CAPA_BEACON_ANT_SELECTION)) {
-               mvm->mgmt_last_antenna_idx =
-                       iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm),
-                                            mvm->mgmt_last_antenna_idx);
-       }
+                        IWL_UCODE_TLV_CAPA_BEACON_ANT_SELECTION))
+               iwl_mvm_toggle_tx_ant(mvm, &mvm->mgmt_last_antenna_idx);
 
        tx->rate_n_flags =
                cpu_to_le32(BIT(mvm->mgmt_last_antenna_idx) <<
 
               mvm->fw->valid_rx_ant;
 }
 
+static inline void iwl_mvm_toggle_tx_ant(struct iwl_mvm *mvm, u8 *ant)
+{
+       *ant = iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm), *ant);
+}
+
 static inline u32 iwl_mvm_get_phy_config(struct iwl_mvm *mvm)
 {
        u32 phy_config = ~(FW_PHY_CFG_TX_CHAIN |
 
 
        iwl_mvm_tof_init(mvm);
 
+       iwl_mvm_toggle_tx_ant(mvm, &mvm->mgmt_last_antenna_idx);
+
        return op_mode;
 
  out_unregister:
 
 {
        u32 tx_ant;
 
-       mvm->scan_last_antenna_idx =
-               iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm),
-                                    mvm->scan_last_antenna_idx);
+       iwl_mvm_toggle_tx_ant(mvm, &mvm->scan_last_antenna_idx);
        tx_ant = BIT(mvm->scan_last_antenna_idx) << RATE_MCS_ANT_POS;
 
        if (band == NL80211_BAND_2GHZ && !no_cck)
 
                        cpu_to_le32(TX_CMD_FLG_ACK | TX_CMD_FLG_BAR);
        }
 
-       mvm->mgmt_last_antenna_idx =
-               iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm),
-                                    mvm->mgmt_last_antenna_idx);
-
        /* Set the rate in the TX cmd */
        tx_cmd->rate_n_flags = cpu_to_le32(iwl_mvm_get_tx_rate(mvm, info, sta));
 }
                        break;
                }
 
+               if ((status & TX_STATUS_MSK) != TX_STATUS_SUCCESS &&
+                   ieee80211_is_mgmt(hdr->frame_control))
+                       iwl_mvm_toggle_tx_ant(mvm, &mvm->mgmt_last_antenna_idx);
+
                /*
                 * If we are freeing multiple frames, mark all the frames
                 * but the first one as acked, since they were acknowledged