iwlwifi: mvm: flip address 4 of AMSDU frames
authorSara Sharon <sara.sharon@intel.com>
Tue, 14 Feb 2017 12:58:21 +0000 (14:58 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Wed, 19 Apr 2017 19:21:49 +0000 (22:21 +0300)
Address 4 is reversed as well.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c

index 0f74a200e81255008ce1cb729fc5604142d4e568..24c4fbe139a36f80de0ce2387ea28eb132981dda 100644 (file)
@@ -925,7 +925,7 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
                 * Our hardware de-aggregates AMSDUs but copies the mac header
                 * as it to the de-aggregated MPDUs. We need to turn off the
                 * AMSDU bit in the QoS control ourselves.
-                * In addition, HW reverses addr3 - reverse it back.
+                * In addition, HW reverses addr3 and addr4 - reverse it back.
                 */
                if ((desc->mac_flags2 & IWL_RX_MPDU_MFLG2_AMSDU) &&
                    !WARN_ON(!ieee80211_is_data_qos(hdr->frame_control))) {
@@ -938,6 +938,13 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
                        for (i = 0; i < ETH_ALEN; i++)
                                mac_addr[i] = hdr->addr3[ETH_ALEN - i - 1];
                        ether_addr_copy(hdr->addr3, mac_addr);
+
+                       if (ieee80211_has_a4(hdr->frame_control)) {
+                               for (i = 0; i < ETH_ALEN; i++)
+                                       mac_addr[i] =
+                                               hdr->addr4[ETH_ALEN - i - 1];
+                               ether_addr_copy(hdr->addr4, mac_addr);
+                       }
                }
                if (baid != IWL_RX_REORDER_DATA_INVALID_BAID) {
                        u32 reorder_data = le32_to_cpu(desc->reorder_data);