ath10k: remove tsf argument from rx_desc tracing
[cascardo/linux.git] / drivers / net / wireless / ath / ath10k / htt_rx.c
index 60d40a0..a691fdf 100644 (file)
@@ -291,6 +291,15 @@ static inline struct sk_buff *ath10k_htt_rx_netbuf_pop(struct ath10k_htt *htt)
        htt->rx_ring.sw_rd_idx.msdu_payld = idx;
        htt->rx_ring.fill_cnt--;
 
+       dma_unmap_single(htt->ar->dev,
+                        ATH10K_SKB_CB(msdu)->paddr,
+                        msdu->len + skb_tailroom(msdu),
+                        DMA_FROM_DEVICE);
+       ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL, "htt rx netbuf pop: ",
+                       msdu->data, msdu->len + skb_tailroom(msdu));
+       trace_ath10k_htt_rx_pop_msdu(ar, msdu->data, msdu->len +
+                                    skb_tailroom(msdu));
+
        return msdu;
 }
 
@@ -328,14 +337,6 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
        while (msdu) {
                int last_msdu, msdu_len_invalid, msdu_chained;
 
-               dma_unmap_single(htt->ar->dev,
-                                ATH10K_SKB_CB(msdu)->paddr,
-                                msdu->len + skb_tailroom(msdu),
-                                DMA_FROM_DEVICE);
-
-               ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL, "htt rx pop: ",
-                               msdu->data, msdu->len + skb_tailroom(msdu));
-
                rx_desc = (struct htt_rx_desc *)msdu->data;
 
                /* FIXME: we must report msdu payload since this is what caller
@@ -426,14 +427,14 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
                while (msdu_chained--) {
                        struct sk_buff *next = ath10k_htt_rx_netbuf_pop(htt);
 
-                       dma_unmap_single(htt->ar->dev,
-                                        ATH10K_SKB_CB(next)->paddr,
-                                        next->len + skb_tailroom(next),
-                                        DMA_FROM_DEVICE);
-
-                       ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL,
-                                       "htt rx chained: ", next->data,
-                                       next->len + skb_tailroom(next));
+                       if (!next) {
+                               ath10k_warn(ar, "failed to pop chained msdu\n");
+                               ath10k_htt_rx_free_msdu_chain(*head_msdu);
+                               *head_msdu = NULL;
+                               msdu = NULL;
+                               htt->rx_confused = true;
+                               break;
+                       }
 
                        skb_trim(next, 0);
                        skb_put(next, min(msdu_len, HTT_RX_BUF_SIZE));
@@ -447,6 +448,8 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
                last_msdu = __le32_to_cpu(rx_desc->msdu_end.info0) &
                                RX_MSDU_END_INFO0_LAST_MSDU;
 
+               trace_ath10k_htt_rx_desc(ar, &rx_desc->attention,
+                                        sizeof(*rx_desc) - sizeof(u32));
                if (last_msdu) {
                        msdu->next = NULL;
                        break;
@@ -492,6 +495,8 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
        size_t size;
        struct timer_list *timer = &htt->rx_ring.refill_retry_timer;
 
+       htt->rx_confused = false;
+
        htt->rx_ring.size = ath10k_htt_rx_ring_size(htt);
        if (!is_power_of_2(htt->rx_ring.size)) {
                ath10k_warn(ar, "htt rx ring size is not power of 2\n");
@@ -581,41 +586,47 @@ static int ath10k_htt_rx_crypto_param_len(struct ath10k *ar,
                                          enum htt_rx_mpdu_encrypt_type type)
 {
        switch (type) {
+       case HTT_RX_MPDU_ENCRYPT_NONE:
+               return 0;
        case HTT_RX_MPDU_ENCRYPT_WEP40:
        case HTT_RX_MPDU_ENCRYPT_WEP104:
-               return 4;
+               return IEEE80211_WEP_IV_LEN;
        case HTT_RX_MPDU_ENCRYPT_TKIP_WITHOUT_MIC:
-       case HTT_RX_MPDU_ENCRYPT_WEP128: /* not tested */
        case HTT_RX_MPDU_ENCRYPT_TKIP_WPA:
-       case HTT_RX_MPDU_ENCRYPT_WAPI: /* not tested */
+               return IEEE80211_TKIP_IV_LEN;
        case HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2:
-               return 8;
-       case HTT_RX_MPDU_ENCRYPT_NONE:
-               return 0;
+               return IEEE80211_CCMP_HDR_LEN;
+       case HTT_RX_MPDU_ENCRYPT_WEP128:
+       case HTT_RX_MPDU_ENCRYPT_WAPI:
+               break;
        }
 
-       ath10k_warn(ar, "unknown encryption type %d\n", type);
+       ath10k_warn(ar, "unsupported encryption type %d\n", type);
        return 0;
 }
 
+#define MICHAEL_MIC_LEN 8
+
 static int ath10k_htt_rx_crypto_tail_len(struct ath10k *ar,
                                         enum htt_rx_mpdu_encrypt_type type)
 {
        switch (type) {
        case HTT_RX_MPDU_ENCRYPT_NONE:
+               return 0;
        case HTT_RX_MPDU_ENCRYPT_WEP40:
        case HTT_RX_MPDU_ENCRYPT_WEP104:
-       case HTT_RX_MPDU_ENCRYPT_WEP128:
-       case HTT_RX_MPDU_ENCRYPT_WAPI:
-               return 0;
+               return IEEE80211_WEP_ICV_LEN;
        case HTT_RX_MPDU_ENCRYPT_TKIP_WITHOUT_MIC:
        case HTT_RX_MPDU_ENCRYPT_TKIP_WPA:
-               return 4;
+               return IEEE80211_TKIP_ICV_LEN;
        case HTT_RX_MPDU_ENCRYPT_AES_CCM_WPA2:
-               return 8;
+               return IEEE80211_CCMP_MIC_LEN;
+       case HTT_RX_MPDU_ENCRYPT_WEP128:
+       case HTT_RX_MPDU_ENCRYPT_WAPI:
+               break;
        }
 
-       ath10k_warn(ar, "unknown encryption type %d\n", type);
+       ath10k_warn(ar, "unsupported encryption type %d\n", type);
        return 0;
 }
 
@@ -1169,7 +1180,6 @@ static int ath10k_unchain_msdu(struct sk_buff *msdu_head)
 
 static bool ath10k_htt_rx_amsdu_allowed(struct ath10k_htt *htt,
                                        struct sk_buff *head,
-                                       enum htt_rx_mpdu_status status,
                                        bool channel_set,
                                        u32 attention)
 {
@@ -1193,22 +1203,11 @@ static bool ath10k_htt_rx_amsdu_allowed(struct ath10k_htt *htt,
        }
 
        /* Skip mgmt frames while we handle this in WMI */
-       if (status == HTT_RX_IND_MPDU_STATUS_MGMT_CTRL ||
-           attention & RX_ATTENTION_FLAGS_MGMT_TYPE) {
+       if (attention & RX_ATTENTION_FLAGS_MGMT_TYPE) {
                ath10k_dbg(ar, ATH10K_DBG_HTT, "htt rx mgmt ctrl\n");
                return false;
        }
 
-       if (status != HTT_RX_IND_MPDU_STATUS_OK &&
-           status != HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR &&
-           status != HTT_RX_IND_MPDU_STATUS_ERR_INV_PEER &&
-           !htt->ar->monitor_started) {
-               ath10k_dbg(ar, ATH10K_DBG_HTT,
-                          "htt rx ignoring frame w/ status %d\n",
-                          status);
-               return false;
-       }
-
        if (test_bit(ATH10K_CAC_RUNNING, &htt->ar->dev_flags)) {
                ath10k_dbg(ar, ATH10K_DBG_HTT,
                           "htt rx CAC running\n");
@@ -1224,8 +1223,6 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
        struct ath10k *ar = htt->ar;
        struct ieee80211_rx_status *rx_status = &htt->rx_status;
        struct htt_rx_indication_mpdu_range *mpdu_ranges;
-       struct htt_rx_desc *rxd;
-       enum htt_rx_mpdu_status status;
        struct ieee80211_hdr *hdr;
        int num_mpdu_ranges;
        u32 attention;
@@ -1273,8 +1270,6 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
                                num_mpdu_ranges));
 
        for (i = 0; i < num_mpdu_ranges; i++) {
-               status = mpdu_ranges[i].mpdu_range_status;
-
                for (j = 0; j < mpdu_ranges[i].mpdu_count; j++) {
                        struct sk_buff *msdu_head, *msdu_tail;
 
@@ -1295,12 +1290,7 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
                                continue;
                        }
 
-                       rxd = container_of((void *)msdu_head->data,
-                                          struct htt_rx_desc,
-                                          msdu_payload);
-
                        if (!ath10k_htt_rx_amsdu_allowed(htt, msdu_head,
-                                                        status,
                                                         channel_set,
                                                         attention)) {
                                ath10k_htt_rx_free_msdu_chain(msdu_head);
@@ -1365,6 +1355,8 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
                                      &attention);
        spin_unlock_bh(&htt->rx_ring.lock);
 
+       tasklet_schedule(&htt->rx_replenish_task);
+
        ath10k_dbg(ar, ATH10K_DBG_HTT_DUMP, "htt rx frag ahead\n");
 
        if (ret) {
@@ -1426,7 +1418,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
        /* last fragment of TKIP frags has MIC */
        if (!ieee80211_has_morefrags(hdr->frame_control) &&
            enctype == HTT_RX_MPDU_ENCRYPT_TKIP_WPA)
-               trim += 8;
+               trim += MICHAEL_MIC_LEN;
 
        if (trim > msdu_head->len) {
                ath10k_warn(ar, "htt rx fragment: trailer longer than the frame itself? drop\n");
@@ -1674,6 +1666,15 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
        case HTT_T2H_MSG_TYPE_RX_DELBA:
                ath10k_htt_rx_delba(ar, resp);
                break;
+       case HTT_T2H_MSG_TYPE_PKTLOG: {
+               struct ath10k_pktlog_hdr *hdr =
+                       (struct ath10k_pktlog_hdr *)resp->pktlog_msg.payload;
+
+               trace_ath10k_htt_pktlog(ar, resp->pktlog_msg.payload,
+                                       sizeof(*hdr) +
+                                       __le16_to_cpu(hdr->size));
+               break;
+       }
        case HTT_T2H_MSG_TYPE_RX_FLUSH: {
                /* Ignore this event because mac80211 takes care of Rx
                 * aggregation reordering.
@@ -1681,8 +1682,8 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
                break;
        }
        default:
-               ath10k_dbg(ar, ATH10K_DBG_HTT, "htt event (%d) not handled\n",
-                          resp->hdr.msg_type);
+               ath10k_warn(ar, "htt event (%d) not handled\n",
+                           resp->hdr.msg_type);
                ath10k_dbg_dump(ar, ATH10K_DBG_HTT_DUMP, NULL, "htt event: ",
                                skb->data, skb->len);
                break;