These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / iwlwifi / dvm / mac80211.c
index 5abd62e..b3ad34e 100644 (file)
@@ -104,15 +104,16 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
        hw->rate_control_algorithm = "iwl-agn-rs";
 
        /* Tell mac80211 our characteristics */
-       hw->flags = IEEE80211_HW_SIGNAL_DBM |
-                   IEEE80211_HW_AMPDU_AGGREGATION |
-                   IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC |
-                   IEEE80211_HW_SPECTRUM_MGMT |
-                   IEEE80211_HW_REPORTS_TX_ACK_STATUS |
-                   IEEE80211_HW_QUEUE_CONTROL |
-                   IEEE80211_HW_SUPPORTS_PS |
-                   IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
-                   IEEE80211_HW_WANT_MONITOR_VIF;
+       ieee80211_hw_set(hw, SIGNAL_DBM);
+       ieee80211_hw_set(hw, AMPDU_AGGREGATION);
+       ieee80211_hw_set(hw, NEED_DTIM_BEFORE_ASSOC);
+       ieee80211_hw_set(hw, SPECTRUM_MGMT);
+       ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
+       ieee80211_hw_set(hw, QUEUE_CONTROL);
+       ieee80211_hw_set(hw, SUPPORTS_PS);
+       ieee80211_hw_set(hw, SUPPORTS_DYNAMIC_PS);
+       ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
+       ieee80211_hw_set(hw, WANT_MONITOR_VIF);
 
        hw->offchannel_tx_hw_queue = IWL_AUX_QUEUE;
        hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FMT;
@@ -135,7 +136,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv,
         */
        if (priv->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP &&
            !iwlwifi_mod_params.sw_crypto)
-               hw->flags |= IEEE80211_HW_MFP_CAPABLE;
+               ieee80211_hw_set(hw, MFP_CAPABLE);
 
        hw->sta_data_size = sizeof(struct iwl_station_priv);
        hw->vif_data_size = sizeof(struct iwl_vif_priv);
@@ -249,12 +250,24 @@ static int __iwl_up(struct iwl_priv *priv)
                }
        }
 
+       ret = iwl_trans_start_hw(priv->trans);
+       if (ret) {
+               IWL_ERR(priv, "Failed to start HW: %d\n", ret);
+               goto error;
+       }
+
        ret = iwl_run_init_ucode(priv);
        if (ret) {
                IWL_ERR(priv, "Failed to run INIT ucode: %d\n", ret);
                goto error;
        }
 
+       ret = iwl_trans_start_hw(priv->trans);
+       if (ret) {
+               IWL_ERR(priv, "Failed to start HW: %d\n", ret);
+               goto error;
+       }
+
        ret = iwl_load_ucode_wait_alive(priv, IWL_UCODE_REGULAR);
        if (ret) {
                IWL_ERR(priv, "Failed to start RT ucode: %d\n", ret);
@@ -431,7 +444,7 @@ static int iwlagn_mac_resume(struct ieee80211_hw *hw)
                u32 error_id;
        } err_info;
        struct iwl_notification_wait status_wait;
-       static const u8 status_cmd[] = {
+       static const u16 status_cmd[] = {
                REPLY_WOWLAN_GET_STATUS,
        };
        struct iwlagn_wowlan_status status_data = {};
@@ -718,7 +731,7 @@ static int iwlagn_mac_ampdu_action(struct ieee80211_hw *hw,
                                   struct ieee80211_vif *vif,
                                   enum ieee80211_ampdu_mlme_action action,
                                   struct ieee80211_sta *sta, u16 tid, u16 *ssn,
-                                  u8 buf_size)
+                                  u8 buf_size, bool amsdu)
 {
        struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
        int ret = -EINVAL;
@@ -1061,7 +1074,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
        IWL_DEBUG_MAC80211(priv, "Enter: changed: 0x%x, total: 0x%x\n",
                        changed_flags, *total_flags);
 
-       CHK(FIF_OTHER_BSS | FIF_PROMISC_IN_BSS, RXON_FILTER_PROMISC_MSK);
+       CHK(FIF_OTHER_BSS, RXON_FILTER_PROMISC_MSK);
        /* Setting _just_ RXON_FILTER_CTL2HOST_MSK causes FH errors */
        CHK(FIF_CONTROL, RXON_FILTER_CTL2HOST_MSK | RXON_FILTER_PROMISC_MSK);
        CHK(FIF_BCN_PRBRESP_PROMISC, RXON_FILTER_BCON_AWARE_MSK);
@@ -1088,7 +1101,7 @@ static void iwlagn_configure_filter(struct ieee80211_hw *hw,
         * since we currently do not support programming multicast
         * filters into the device.
         */
-       *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI | FIF_PROMISC_IN_BSS |
+       *total_flags &= FIF_OTHER_BSS | FIF_ALLMULTI |
                        FIF_BCN_PRBRESP_PROMISC | FIF_CONTROL;
 }
 
@@ -1140,7 +1153,6 @@ static void iwlagn_mac_event_callback(struct ieee80211_hw *hw,
                return;
 
        IWL_DEBUG_MAC80211(priv, "enter\n");
-       mutex_lock(&priv->mutex);
 
        if (priv->lib->bt_params &&
            priv->lib->bt_params->advanced_bt_coexist) {
@@ -1149,13 +1161,12 @@ static void iwlagn_mac_event_callback(struct ieee80211_hw *hw,
                else if (event->u.rssi.data == RSSI_EVENT_HIGH)
                        priv->bt_enable_pspoll = false;
 
-               iwlagn_send_advance_bt_config(priv);
+               queue_work(priv->workqueue, &priv->bt_runtime_config);
        } else {
                IWL_DEBUG_MAC80211(priv, "Advanced BT coex disabled,"
                                "ignoring RSSI callback\n");
        }
 
-       mutex_unlock(&priv->mutex);
        IWL_DEBUG_MAC80211(priv, "leave\n");
 }
 
@@ -1343,9 +1354,9 @@ static int iwlagn_mac_add_interface(struct ieee80211_hw *hw,
         * other interfaces are added, this is safe.
         */
        if (vif->type == NL80211_IFTYPE_MONITOR)
-               priv->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS;
+               ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS);
        else
-               priv->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS;
+               __clear_bit(IEEE80211_HW_RX_INCLUDES_FCS, priv->hw->flags);
 
        err = iwl_setup_interface(priv, ctx);
        if (!err || reset)