-From 8a8633978b842c88fbcfe00d4e5dde96048f630e Mon Sep 17 00:00:00 2001
+From 9cd318eacf44d8febca72286ac1e6ceeec041f1c Mon Sep 17 00:00:00 2001
From: Manish Chopra <manish.chopra@cavium.com>
Date: Thu, 17 May 2018 12:05:00 -0700
Subject: [PATCH 14/44] qede: Add build_skb() support.
drivers/net/ethernet/qlogic/qede/qede.h | 5 +-
drivers/net/ethernet/qlogic/qede/qede_ethtool.c | 3 +-
drivers/net/ethernet/qlogic/qede/qede_fp.c | 227 +++++++++++++-----------
- drivers/net/ethernet/qlogic/qede/qede_main.c | 76 ++------
- 4 files changed, 137 insertions(+), 174 deletions(-)
+ drivers/net/ethernet/qlogic/qede/qede_main.c | 74 ++------
+ 4 files changed, 136 insertions(+), 173 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
-index 9935978c..2d3f09e 100644
+index 88ea270..a003bec 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
-@@ -290,15 +290,12 @@ struct qede_agg_info {
+@@ -301,15 +301,12 @@ struct qede_agg_info {
* aggregation.
*/
struct sw_rx_data buffer;
ether_addr_equal(data_ptr + ETH_ALEN,
edev->ndev->dev_addr)) {
diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c
-index 1494130..6c70239 100644
+index b589b70..8a99e4d 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_fp.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c
-@@ -660,7 +660,8 @@ static int qede_fill_frag_skb(struct qede_dev *edev,
+@@ -668,7 +668,8 @@ static int qede_fill_frag_skb(struct qede_dev *edev,
/* Add one frag and update the appropriate fields in the skb */
skb_fill_page_desc(skb, tpa_info->frag_id++,
len_on_bd);
if (unlikely(qede_realloc_rx_buffer(rxq, current_bd))) {
-@@ -671,8 +672,7 @@ static int qede_fill_frag_skb(struct qede_dev *edev,
+@@ -679,8 +680,7 @@ static int qede_fill_frag_skb(struct qede_dev *edev,
goto out;
}
skb->data_len += len_on_bd;
skb->truesize += rxq->rx_buf_seg_size;
-@@ -721,64 +721,129 @@ static u8 qede_check_tunn_csum(u16 flag)
+@@ -729,64 +729,129 @@ static u8 qede_check_tunn_csum(u16 flag)
return QEDE_CSUM_UNNECESSARY | tcsum;
}
if ((le16_to_cpu(cqe->pars_flags.flags) >>
PARSING_AND_ERR_FLAGS_TAG8021QEXIST_SHIFT) &
PARSING_AND_ERR_FLAGS_TAG8021QEXIST_MASK)
-@@ -899,6 +964,10 @@ static int qede_tpa_end(struct qede_dev *edev,
+@@ -907,6 +972,10 @@ static int qede_tpa_end(struct qede_dev *edev,
tpa_info = &rxq->tpa_info[cqe->tpa_agg_index];
skb = tpa_info->skb;
for (i = 0; cqe->len_list[i]; i++)
qede_fill_frag_skb(edev, rxq, cqe->tpa_agg_index,
le16_to_cpu(cqe->len_list[i]));
-@@ -919,11 +988,6 @@ static int qede_tpa_end(struct qede_dev *edev,
+@@ -927,11 +996,6 @@ static int qede_tpa_end(struct qede_dev *edev,
"Strange - total packet len [cqe] is %4x but SKB has len %04x\n",
le16_to_cpu(cqe->total_packet_len), skb->len);
/* Finalize the SKB */
skb->protocol = eth_type_trans(skb, edev->ndev);
skb->ip_summed = CHECKSUM_UNNECESSARY;
-@@ -940,6 +1004,12 @@ static int qede_tpa_end(struct qede_dev *edev,
+@@ -948,6 +1012,12 @@ static int qede_tpa_end(struct qede_dev *edev,
return 1;
err:
tpa_info->state = QEDE_AGG_STATE_NONE;
dev_kfree_skb_any(tpa_info->skb);
tpa_info->skb = NULL;
return 0;
-@@ -1058,65 +1128,6 @@ static bool qede_rx_xdp(struct qede_dev *edev,
- return false;
+@@ -1071,65 +1141,6 @@ static bool qede_rx_xdp(struct qede_dev *edev,
}
+ #endif
-static struct sk_buff *qede_rx_allocate_skb(struct qede_dev *edev,
- struct qede_rx_queue *rxq,
static int qede_rx_build_jumbo(struct qede_dev *edev,
struct qede_rx_queue *rxq,
struct sk_buff *skb,
-@@ -1157,7 +1168,7 @@ static int qede_rx_build_jumbo(struct qede_dev *edev,
+@@ -1170,7 +1181,7 @@ static int qede_rx_build_jumbo(struct qede_dev *edev,
PAGE_SIZE, DMA_FROM_DEVICE);
skb_fill_page_desc(skb, skb_shinfo(skb)->nr_frags++,
skb->truesize += PAGE_SIZE;
skb->data_len += cur_size;
-@@ -1256,7 +1267,7 @@ static int qede_rx_process_cqe(struct qede_dev *edev,
+@@ -1273,7 +1284,7 @@ static int qede_rx_process_cqe(struct qede_dev *edev,
/* Basic validation passed; Need to prepare an SKB. This would also
* guarantee to finally consume the first BD upon success.
*/
rxq->rx_alloc_errors++;
qede_recycle_rx_bd_ring(rxq, fp_cqe->bd_num);
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
-index 89c581c..40e2b92 100644
+index 9540bc7..daf766b 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
-@@ -1197,30 +1197,8 @@ static void qede_free_rx_buffers(struct qede_dev *edev,
+@@ -1242,30 +1242,8 @@ static void qede_free_rx_buffers(struct qede_dev *edev,
}
}
/* Free rx buffers */
qede_free_rx_buffers(edev, rxq);
-@@ -1232,45 +1210,15 @@ static void qede_free_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
+@@ -1277,45 +1255,15 @@ static void qede_free_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
edev->ops->common->chain_free(edev->cdev, &rxq->rx_comp_ring);
}
}
/* This function allocates all memory needed per Rx queue */
-@@ -1281,19 +1229,24 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
- rxq->num_rx_buffers = edev->q_num_rx_buffers;
+@@ -1327,24 +1275,29 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu;
+ #ifdef HAVE_XDP
- rxq->rx_headroom = edev->xdp_prog ? XDP_PACKET_HEADROOM : 0;
-+
+ rxq->rx_headroom = edev->xdp_prog ? XDP_PACKET_HEADROOM : NET_SKB_PAD;
+ #else
+ rxq->rx_headroom = 0;
+ #endif
+ size = rxq->rx_headroom +
-+ SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
-
++ SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
++
/* Make sure that the headroom and payload fit in a single page */
- if (rxq->rx_buf_size + rxq->rx_headroom > PAGE_SIZE)
- rxq->rx_buf_size = PAGE_SIZE - rxq->rx_headroom;
+ if (rxq->rx_buf_size + size > PAGE_SIZE)
+ rxq->rx_buf_size = PAGE_SIZE - size;
-- /* Segment size to spilt a page in multiple equal parts,
-+ /* Segment size to spilt a page in multiple equal parts ,
+ /* Segment size to spilt a page in multiple equal parts,
* unless XDP is used in which case we'd use the entire page.
*/
+ #ifdef HAVE_XDP
- if (!edev->xdp_prog)
-- rxq->rx_buf_seg_size = roundup_pow_of_two(rxq->rx_buf_size);
-- else
+ if (!edev->xdp_prog) {
+ #endif
+- rxq->rx_buf_seg_size = roundup_pow_of_two(rxq->rx_buf_size);
+ size = size + rxq->rx_buf_size;
+ rxq->rx_buf_seg_size = roundup_pow_of_two(size);
+ #ifdef HAVE_XDP
+- else
+ } else {
rxq->rx_buf_seg_size = PAGE_SIZE;
+ }
+ #endif
/* Allocate the parallel driver ring for Rx buffers */
- size = sizeof(*rxq->sw_rx_ring) * RX_RING_SIZE;
-@@ -1337,7 +1290,8 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
+@@ -1389,7 +1342,8 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
}
}
return rc;
}
--
-2.9.5
+1.8.3.1
--- /dev/null
+From 2963fb1c60c84751a0f95ddb0f3f631ce308f344 Mon Sep 17 00:00:00 2001
+From: Michal Kalderon <michal.kalderon@cavium.com>
+Date: Tue, 25 Sep 2018 18:32:27 +0300
+Subject: [PATCH] qede: SLES12SP3 BACKPORT
+
+Signed-off-by: Michal Kalderon <michal.kalderon@cavium.com>
+---
+ drivers/net/ethernet/qlogic/qede/qede.h | 4 ++++
+ drivers/net/ethernet/qlogic/qede/qede_filter.c | 2 ++
+ drivers/net/ethernet/qlogic/qede/qede_fp.c | 4 ++++
+ drivers/net/ethernet/qlogic/qede/qede_main.c | 14 ++++++++++++--
+ 4 files changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
+index 0386a7a..88ea270 100644
+--- a/drivers/net/ethernet/qlogic/qede/qede.h
++++ b/drivers/net/ethernet/qlogic/qede/qede.h
+@@ -39,7 +39,9 @@
+ #include <linux/bitmap.h>
+ #include <linux/kernel.h>
+ #include <linux/mutex.h>
++#ifdef HAVE_XDP
+ #include <linux/bpf.h>
++#endif
+ #ifdef HAVE_NET_XDP_H
+ #include <net/xdp.h>
+ #endif
+@@ -515,8 +517,10 @@ void qede_config_rx_mode(struct net_device *ndev);
+ void qede_fill_rss_params(struct qede_dev *edev,
+ struct qed_update_vport_rss_params *rss, u8 *update);
+
++#ifdef HAVE_UDP_TUNNEL_GET_RX_INFO
+ void qede_udp_tunnel_add(struct net_device *dev, struct udp_tunnel_info *ti);
+ void qede_udp_tunnel_del(struct net_device *dev, struct udp_tunnel_info *ti);
++#endif
+
+ #ifdef HAVE_NETDEV_BPF
+ int qede_xdp(struct net_device *dev, struct netdev_bpf *xdp);
+diff --git a/drivers/net/ethernet/qlogic/qede/qede_filter.c b/drivers/net/ethernet/qlogic/qede/qede_filter.c
+index 9da9e1e..57edea4 100644
+--- a/drivers/net/ethernet/qlogic/qede/qede_filter.c
++++ b/drivers/net/ethernet/qlogic/qede/qede_filter.c
+@@ -955,6 +955,7 @@ int qede_set_features(struct net_device *dev, netdev_features_t features)
+ return 0;
+ }
+
++#ifdef HAVE_UDP_TUNNEL_GET_RX_INFO
+ void qede_udp_tunnel_add(struct net_device *dev, struct udp_tunnel_info *ti)
+ {
+ struct qede_dev *edev = netdev_priv(dev);
+@@ -1065,6 +1066,7 @@ void qede_udp_tunnel_del(struct net_device *dev,
+ return;
+ }
+ }
++#endif
+
+ #ifdef HAVE_XDP
+ static void qede_xdp_reload_func(struct qede_dev *edev,
+diff --git a/drivers/net/ethernet/qlogic/qede/qede_fp.c b/drivers/net/ethernet/qlogic/qede/qede_fp.c
+index 766b1c9..b589b70 100644
+--- a/drivers/net/ethernet/qlogic/qede/qede_fp.c
++++ b/drivers/net/ethernet/qlogic/qede/qede_fp.c
+@@ -44,6 +44,10 @@
+
+ #include <linux/qed/qed_if.h>
+ #include "qede.h"
++
++#ifndef HAVE_LINUX_PAGE_REF_H
++#define page_ref_inc(val) atomic_inc(&val->_count)
++#endif
+ /*********************************
+ * Content also used by slowpath *
+ *********************************/
+diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
+index 1b0bcb5..5b05683 100644
+--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
++++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
+@@ -47,7 +47,9 @@
+ #include <linux/netdev_features.h>
+ #include <linux/udp.h>
+ #include <linux/tcp.h>
++#ifdef HAVE_UDP_TUNNEL_GET_RX_INFO
+ #include <net/udp_tunnel.h>
++#endif
+ #include <linux/ip.h>
+ #include <net/ipv6.h>
+ #include <net/tcp.h>
+@@ -1324,8 +1326,11 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
+ rxq->num_rx_buffers = edev->q_num_rx_buffers;
+
+ rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu;
++#ifdef HAVE_XDP
+ rxq->rx_headroom = edev->xdp_prog ? XDP_PACKET_HEADROOM : 0;
+-
++#else
++ rxq->rx_headroom = 0;
++#endif
+ /* Make sure that the headroom and payload fit in a single page */
+ if (rxq->rx_buf_size + rxq->rx_headroom > PAGE_SIZE)
+ rxq->rx_buf_size = PAGE_SIZE - rxq->rx_headroom;
+@@ -1333,10 +1338,14 @@ static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq)
+ /* Segment size to spilt a page in multiple equal parts,
+ * unless XDP is used in which case we'd use the entire page.
+ */
++#ifdef HAVE_XDP
+ if (!edev->xdp_prog)
++#endif
+ rxq->rx_buf_seg_size = roundup_pow_of_two(rxq->rx_buf_size);
++#ifdef HAVE_XDP
+ else
+ rxq->rx_buf_seg_size = PAGE_SIZE;
++#endif
+
+ /* Allocate the parallel driver ring for Rx buffers */
+ size = sizeof(*rxq->sw_rx_ring) * RX_RING_SIZE;
+@@ -2182,8 +2191,9 @@ static int qede_open(struct net_device *ndev)
+ rc = qede_load(edev, QEDE_LOAD_NORMAL, false);
+ if (rc)
+ return rc;
+-
++#ifdef HAVE_UDP_TUNNEL_GET_RX_INFO
+ udp_tunnel_get_rx_info(ndev);
++#endif
+
+ edev->ops->common->update_drv_state(edev->cdev, true);
+
+--
+1.8.3.1
+