From: Lipeng <lipeng321@huawei.com>
To: <davem@davemloft.net>
Cc: <netdev@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
<linuxarm@huawei.com>, <salil.mehta@huawei.com>,
<lipeng321@huawei.com>
Subject: [PATCH V3 net-next 09/17] net: hns3: Add handling vlan tag offload in bd
Date: Wed, 20 Dec 2017 16:43:11 +0800 [thread overview]
Message-ID: <1513759399-40915-10-git-send-email-lipeng321@huawei.com> (raw)
In-Reply-To: <1513759399-40915-1-git-send-email-lipeng321@huawei.com>
This patch deals with the vlan tag information between
sk_buff and rx/tx bd.
Signed-off-by: Shenjian <shenjian15@huawei.com>
Signed-off-by: Lipeng <lipeng321@huawei.com>
---
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 83 +++++++++++++++++++++++--
1 file changed, 78 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
index 301b329..320ae88 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
@@ -723,6 +723,58 @@ static void hns3_set_txbd_baseinfo(u16 *bdtp_fe_sc_vld_ra_ri, int frag_end)
hnae_set_field(*bdtp_fe_sc_vld_ra_ri, HNS3_TXD_SC_M, HNS3_TXD_SC_S, 0);
}
+static int hns3_fill_desc_vtags(struct sk_buff *skb,
+ struct hns3_enet_ring *tx_ring,
+ u32 *inner_vlan_flag,
+ u32 *out_vlan_flag,
+ u16 *inner_vtag,
+ u16 *out_vtag)
+{
+#define HNS3_TX_VLAN_PRIO_SHIFT 13
+
+ if (skb->protocol == htons(ETH_P_8021Q) &&
+ !(tx_ring->tqp->handle->kinfo.netdev->features &
+ NETIF_F_HW_VLAN_CTAG_TX)) {
+ /* When HW VLAN acceleration is turned off, and the stack
+ * sets the protocol to 802.1q, the driver just need to
+ * set the protocol to the encapsulated ethertype.
+ */
+ skb->protocol = vlan_get_protocol(skb);
+ return 0;
+ }
+
+ if (skb_vlan_tag_present(skb)) {
+ u16 vlan_tag;
+
+ vlan_tag = skb_vlan_tag_get(skb);
+ vlan_tag |= (skb->priority & 0x7) << HNS3_TX_VLAN_PRIO_SHIFT;
+
+ /* Based on hw strategy, use out_vtag in two layer tag case,
+ * and use inner_vtag in one tag case.
+ */
+ if (skb->protocol == htons(ETH_P_8021Q)) {
+ hnae_set_bit(*out_vlan_flag, HNS3_TXD_OVLAN_B, 1);
+ *out_vtag = vlan_tag;
+ } else {
+ hnae_set_bit(*inner_vlan_flag, HNS3_TXD_VLAN_B, 1);
+ *inner_vtag = vlan_tag;
+ }
+ } else if (skb->protocol == htons(ETH_P_8021Q)) {
+ struct vlan_ethhdr *vhdr;
+ int rc;
+
+ rc = skb_cow_head(skb, 0);
+ if (rc < 0)
+ return rc;
+ vhdr = (struct vlan_ethhdr *)skb->data;
+ vhdr->h_vlan_TCI |= cpu_to_be16((skb->priority & 0x7)
+ << HNS3_TX_VLAN_PRIO_SHIFT);
+ }
+
+ skb->protocol = vlan_get_protocol(skb);
+ return 0;
+}
+
static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
int size, dma_addr_t dma, int frag_end,
enum hns_desc_type type)
@@ -733,6 +785,8 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
u16 bdtp_fe_sc_vld_ra_ri = 0;
u32 type_cs_vlan_tso = 0;
struct sk_buff *skb;
+ u16 inner_vtag = 0;
+ u16 out_vtag = 0;
u32 paylen = 0;
u16 mss = 0;
__be16 protocol;
@@ -756,15 +810,16 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
skb = (struct sk_buff *)priv;
paylen = skb->len;
+ ret = hns3_fill_desc_vtags(skb, ring, &type_cs_vlan_tso,
+ &ol_type_vlan_len_msec,
+ &inner_vtag, &out_vtag);
+ if (unlikely(ret))
+ return ret;
+
if (skb->ip_summed == CHECKSUM_PARTIAL) {
skb_reset_mac_len(skb);
protocol = skb->protocol;
- /* vlan packet*/
- if (protocol == htons(ETH_P_8021Q)) {
- protocol = vlan_get_protocol(skb);
- skb->protocol = protocol;
- }
ret = hns3_get_l4_protocol(skb, &ol4_proto, &il4_proto);
if (ret)
return ret;
@@ -790,6 +845,8 @@ static int hns3_fill_desc(struct hns3_enet_ring *ring, void *priv,
cpu_to_le32(type_cs_vlan_tso);
desc->tx.paylen = cpu_to_le32(paylen);
desc->tx.mss = cpu_to_le16(mss);
+ desc->tx.vlan_tag = cpu_to_le16(inner_vtag);
+ desc->tx.outer_vlan_tag = cpu_to_le16(out_vtag);
}
/* move ring pointer to next.*/
@@ -2101,6 +2158,22 @@ static int hns3_handle_rx_bd(struct hns3_enet_ring *ring,
prefetchw(skb->data);
+ /* Based on hw strategy, the tag offloaded will be stored at
+ * ot_vlan_tag in two layer tag case, and stored at vlan_tag
+ * in one layer tag case.
+ */
+ if (netdev->features & NETIF_F_HW_VLAN_CTAG_RX) {
+ u16 vlan_tag;
+
+ vlan_tag = le16_to_cpu(desc->rx.ot_vlan_tag);
+ if (!(vlan_tag & VLAN_VID_MASK))
+ vlan_tag = le16_to_cpu(desc->rx.vlan_tag);
+ if (vlan_tag & VLAN_VID_MASK)
+ __vlan_hwaccel_put_tag(skb,
+ htons(ETH_P_8021Q),
+ vlan_tag);
+ }
+
bnum = 1;
if (length <= HNS3_RX_HEAD_SIZE) {
memcpy(__skb_put(skb, length), va, ALIGN(length, sizeof(long)));
--
1.9.1
next prev parent reply other threads:[~2017-12-20 8:43 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-12-20 8:43 [PATCH V3 net-next 00/17] add some features and fix some bugs for HNS3 driver Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 01/17] net: hns3: add support to query tqps number Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 02/17] net: hns3: add support to modify " Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 03/17] net: hns3: change the returned tqp number by ethtool -x Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 04/17] net: hns3: Free the ring_data structrue when change tqps Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 05/17] net: hns3: Get rss_size_max from configuration but not hardcode Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 06/17] net: hns3: Add a mask initialization for mac_vlan table Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 07/17] net: hns3: Add vlan offload config command Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 08/17] net: hns3: Add ethtool related offload command Lipeng
2017-12-20 8:43 ` Lipeng [this message]
2017-12-20 8:43 ` [PATCH V3 net-next 10/17] net: hns3: cleanup mac auto-negotiation state query Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 11/17] net: hns3: fix for getting auto-negotiation state in hclge_get_autoneg Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 12/17] net: hns3: add support for set_pauseparam Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 13/17] net: hns3: add support to update flow control settings after autoneg Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 14/17] net: hns3: add Asym Pause support to phy default features Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 15/17] net: hns3: add support for querying advertised pause frame by ethtool ethx Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 16/17] net: hns3: Increase the default depth of bucket for TM shaper Lipeng
2017-12-20 8:43 ` [PATCH V3 net-next 17/17] net: hns3: change TM sched mode to TC-based mode when SRIOV enabled Lipeng
2017-12-20 19:28 ` [PATCH V3 net-next 00/17] add some features and fix some bugs for HNS3 driver David Miller
2017-12-21 1:30 ` lipeng (Y)
2017-12-21 4:04 ` David Miller
2017-12-21 6:57 ` lipeng (Y)
2017-12-21 15:08 ` David Miller
2017-12-21 2:27 ` lipeng (Y)
2017-12-21 2:43 ` Hanjun Guo
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1513759399-40915-10-git-send-email-lipeng321@huawei.com \
--to=lipeng321@huawei.com \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=linuxarm@huawei.com \
--cc=netdev@vger.kernel.org \
--cc=salil.mehta@huawei.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox