ath10k: add TCP/UDP Checksum offload support for QCA99x0
authorManikanta Pubbisetty <c_mpubbi@qti.qualcomm.com>
Mon, 20 Jul 2015 12:26:12 +0000 (17:56 +0530)
committerKalle Valo <kvalo@qca.qualcomm.com>
Fri, 24 Jul 2015 08:08:44 +0000 (11:08 +0300)
The patch adds support to offload TCP/UDP checksum
calculations for QCA99x0.

Signed-off-by: Manikanta Pubbisetty <c_mpubbi@qti.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/htt.h
drivers/net/wireless/ath/ath10k/htt_tx.c

index e31cd74dded6e4f1aadce25ebbe06b130c7b7916..551f64bf64578cb930fadda493c60bef0a05927b 100644 (file)
@@ -97,10 +97,25 @@ struct htt_data_tx_desc_frag {
 } __packed;
 
 struct htt_msdu_ext_desc {
-       __le32 tso_flag[4];
+       __le32 tso_flag[3];
+       __le16 ip_identification;
+       u8 flags;
+       u8 reserved;
        struct htt_data_tx_desc_frag frags[6];
 };
 
+#define        HTT_MSDU_EXT_DESC_FLAG_IPV4_CSUM_ENABLE         BIT(0)
+#define        HTT_MSDU_EXT_DESC_FLAG_UDP_IPV4_CSUM_ENABLE     BIT(1)
+#define        HTT_MSDU_EXT_DESC_FLAG_UDP_IPV6_CSUM_ENABLE     BIT(2)
+#define        HTT_MSDU_EXT_DESC_FLAG_TCP_IPV4_CSUM_ENABLE     BIT(3)
+#define        HTT_MSDU_EXT_DESC_FLAG_TCP_IPV6_CSUM_ENABLE     BIT(4)
+
+#define HTT_MSDU_CHECKSUM_ENABLE (HTT_MSDU_EXT_DESC_FLAG_IPV4_CSUM_ENABLE \
+                                | HTT_MSDU_EXT_DESC_FLAG_UDP_IPV4_CSUM_ENABLE \
+                                | HTT_MSDU_EXT_DESC_FLAG_UDP_IPV6_CSUM_ENABLE \
+                                | HTT_MSDU_EXT_DESC_FLAG_TCP_IPV4_CSUM_ENABLE \
+                                | HTT_MSDU_EXT_DESC_FLAG_TCP_IPV6_CSUM_ENABLE)
+
 enum htt_data_tx_desc_flags0 {
        HTT_DATA_TX_DESC_FLAGS0_MAC_HDR_PRESENT = 1 << 0,
        HTT_DATA_TX_DESC_FLAGS0_NO_AGGR         = 1 << 1,
index c49ecffc29055757a359df9f7578428f83274947..1b34c1350f637ec082b318db3d643f6329782b34 100644 (file)
@@ -496,6 +496,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
        u16 msdu_id, flags1 = 0;
        dma_addr_t paddr = 0;
        u32 frags_paddr = 0;
+       struct htt_msdu_ext_desc *ext_desc = NULL;
 
        res = ath10k_htt_tx_inc_pending(htt);
        if (res)
@@ -542,6 +543,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
                if (ar->hw_params.continuous_frag_desc) {
                        frags = (struct htt_data_tx_desc_frag *)
                                &htt->frag_desc.vaddr[msdu_id].frags;
+                       ext_desc = &htt->frag_desc.vaddr[msdu_id];
                        frags[0].tword_addr.paddr_lo =
                                __cpu_to_le32(skb_cb->paddr);
                        frags[0].tword_addr.paddr_hi = 0;
@@ -603,6 +605,8 @@ int ath10k_htt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
        if (msdu->ip_summed == CHECKSUM_PARTIAL) {
                flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L3_OFFLOAD;
                flags1 |= HTT_DATA_TX_DESC_FLAGS1_CKSUM_L4_OFFLOAD;
+               if (ar->hw_params.continuous_frag_desc)
+                       ext_desc->flags |= HTT_MSDU_CHECKSUM_ENABLE;
        }
 
        /* Prevent firmware from sending up tx inspection requests. There's