aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSara Sharon <sara.sharon@intel.com>2017-12-19 04:09:41 -0500
committerLuca Coelho <luciano.coelho@intel.com>2018-03-28 05:16:03 -0400
commite4d7220813e986a99eff2b98d882d5290dd58078 (patch)
tree3846cb96a8ef722e14ebb62cb5775b11952b1760
parent6b7d5c0745905b71127d0c1ae6eeddc09bbdaad8 (diff)
iwlwifi: mvm: flip AMSDU addresses only for 9000 family
Hardware bug was fixed in later generation. Signed-off-by: Sara Sharon <sara.sharon@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c25
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
index 580de5851fc7..4a4ccfd11e5b 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
@@ -831,6 +831,16 @@ out:
831 rcu_read_unlock(); 831 rcu_read_unlock();
832} 832}
833 833
834static void iwl_mvm_flip_address(u8 *addr)
835{
836 int i;
837 u8 mac_addr[ETH_ALEN];
838
839 for (i = 0; i < ETH_ALEN; i++)
840 mac_addr[i] = addr[ETH_ALEN - i - 1];
841 ether_addr_copy(addr, mac_addr);
842}
843
834void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi, 844void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
835 struct iwl_rx_cmd_buffer *rxb, int queue) 845 struct iwl_rx_cmd_buffer *rxb, int queue)
836{ 846{
@@ -985,21 +995,16 @@ void iwl_mvm_rx_mpdu_mq(struct iwl_mvm *mvm, struct napi_struct *napi,
985 */ 995 */
986 if ((desc->mac_flags2 & IWL_RX_MPDU_MFLG2_AMSDU) && 996 if ((desc->mac_flags2 & IWL_RX_MPDU_MFLG2_AMSDU) &&
987 !WARN_ON(!ieee80211_is_data_qos(hdr->frame_control))) { 997 !WARN_ON(!ieee80211_is_data_qos(hdr->frame_control))) {
988 int i;
989 u8 *qc = ieee80211_get_qos_ctl(hdr); 998 u8 *qc = ieee80211_get_qos_ctl(hdr);
990 u8 mac_addr[ETH_ALEN];
991 999
992 *qc &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT; 1000 *qc &= ~IEEE80211_QOS_CTL_A_MSDU_PRESENT;
993 1001
994 for (i = 0; i < ETH_ALEN; i++) 1002 if (mvm->trans->cfg->device_family ==
995 mac_addr[i] = hdr->addr3[ETH_ALEN - i - 1]; 1003 IWL_DEVICE_FAMILY_9000) {
996 ether_addr_copy(hdr->addr3, mac_addr); 1004 iwl_mvm_flip_address(hdr->addr3);
997 1005
998 if (ieee80211_has_a4(hdr->frame_control)) { 1006 if (ieee80211_has_a4(hdr->frame_control))
999 for (i = 0; i < ETH_ALEN; i++) 1007 iwl_mvm_flip_address(hdr->addr4);
1000 mac_addr[i] =
1001 hdr->addr4[ETH_ALEN - i - 1];
1002 ether_addr_copy(hdr->addr4, mac_addr);
1003 } 1008 }
1004 } 1009 }
1005 if (baid != IWL_RX_REORDER_DATA_INVALID_BAID) { 1010 if (baid != IWL_RX_REORDER_DATA_INVALID_BAID) {