]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - drivers/net/wireless/ath/ath6kl/txrx.c
Merge remote branch 'wireless-next/master' into ath6kl-next
[mirror_ubuntu-zesty-kernel.git] / drivers / net / wireless / ath / ath6kl / txrx.c
index 521f0be990f1db589faca36aa2e7d98af963e668..82f2f5cb475b0b3ba8e7bebf6fea1d86472d56fa 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "core.h"
 #include "debug.h"
+#include "htc-ops.h"
 
 /*
  * tid - tid_mux0..tid_mux3
@@ -324,6 +325,7 @@ int ath6kl_control_tx(void *devt, struct sk_buff *skb,
        cookie->map_no = 0;
        set_htc_pkt_info(&cookie->htc_pkt, cookie, skb->data, skb->len,
                         eid, ATH6KL_CONTROL_PKT_TAG);
+       cookie->htc_pkt.skb = skb;
 
        /*
         * This interface is asynchronous, if there is an error, cleanup
@@ -492,6 +494,7 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
        cookie->map_no = map_no;
        set_htc_pkt_info(&cookie->htc_pkt, cookie, skb->data, skb->len,
                         eid, htc_tag);
+       cookie->htc_pkt.skb = skb;
 
        ath6kl_dbg_dump(ATH6KL_DBG_RAW_BYTES, __func__, "tx ",
                        skb->data, skb->len);
@@ -572,7 +575,7 @@ void ath6kl_indicate_tx_activity(void *devt, u8 traffic_class, bool active)
 
 notify_htc:
        /* notify HTC, this may cause credit distribution changes */
-       ath6kl_htc_indicate_activity_change(ar->htc_target, eid, active);
+       ath6kl_htc_activity_changed(ar->htc_target, eid, active);
 }
 
 enum htc_send_full_action ath6kl_tx_queue_full(struct htc_target *target,
@@ -668,9 +671,10 @@ static void ath6kl_tx_clear_node_map(struct ath6kl_vif *vif,
        }
 }
 
-void ath6kl_tx_complete(void *context, struct list_head *packet_queue)
+void ath6kl_tx_complete(struct htc_target *target,
+                       struct list_head *packet_queue)
 {
-       struct ath6kl *ar = context;
+       struct ath6kl *ar = target->dev->ar;
        struct sk_buff_head skb_queue;
        struct htc_packet *packet;
        struct sk_buff *skb;
@@ -889,6 +893,7 @@ void ath6kl_rx_refill(struct htc_target *target, enum htc_endpoint_id endpoint)
                        skb->data = PTR_ALIGN(skb->data - 4, 4);
                set_htc_rxpkt_info(packet, skb, skb->data,
                                   ATH6KL_BUFFER_SIZE, endpoint);
+               packet->skb = skb;
                list_add_tail(&packet->list, &queue);
        }
 
@@ -911,6 +916,8 @@ void ath6kl_refill_amsdu_rxbufs(struct ath6kl *ar, int count)
                        skb->data = PTR_ALIGN(skb->data - 4, 4);
                set_htc_rxpkt_info(packet, skb, skb->data,
                                   ATH6KL_AMSDU_BUFFER_SIZE, 0);
+               packet->skb = skb;
+
                spin_lock_bh(&ar->lock);
                list_add_tail(&packet->list, &ar->amsdu_rx_buffer_queue);
                spin_unlock_bh(&ar->lock);
@@ -1283,6 +1290,7 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
        struct wmi_data_hdr *dhdr;
        int min_hdr_len;
        u8 meta_type, dot11_hdr = 0;
+       u8 pad_before_data_start;
        int status = packet->status;
        enum htc_endpoint_id ept = packet->endpoint;
        bool is_amsdu, prev_ps, ps_state = false;
@@ -1494,6 +1502,10 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
        seq_no = wmi_data_hdr_get_seqno(dhdr);
        meta_type = wmi_data_hdr_get_meta(dhdr);
        dot11_hdr = wmi_data_hdr_get_dot11(dhdr);
+       pad_before_data_start =
+               (le16_to_cpu(dhdr->info3) >> WMI_DATA_HDR_PAD_BEFORE_DATA_SHIFT)
+                       & WMI_DATA_HDR_PAD_BEFORE_DATA_MASK;
+
        skb_pull(skb, sizeof(struct wmi_data_hdr));
 
        switch (meta_type) {
@@ -1512,6 +1524,8 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
                break;
        }
 
+       skb_pull(skb, pad_before_data_start);
+
        if (dot11_hdr)
                status = ath6kl_wmi_dot11_hdr_remove(ar->wmi, skb);
        else if (!is_amsdu)
@@ -1581,7 +1595,8 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
                        /* aggregation code will handle the skb */
                        return;
                }
-       }
+       } else if (!is_broadcast_ether_addr(datap->h_dest))
+               vif->net_stats.multicast++;
 
        ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb);
 }