From 43a942393d1795fa303b490a81bd943970fe9a71 Mon Sep 17 00:00:00 2001 From: Wenzhuo Lu Date: Fri, 11 Mar 2016 09:10:07 +0800 Subject: [PATCH] ixgbe: select pool by MAC when using double VLAN On X550, as required by datasheet, E-tag packets are not expected when double VLAN are used. So modify the register PFVTCTL after enabling double VLAN to select pool by MAC but not MAC or E-tag. An introduction of E-tag: It's defined in IEEE802.1br. Please reference this website, http://www.ieee802.org/1/pages/802.1br.html. A brief description. E-tag means external tag, and it's a kind of l2 tunnel. It means a tag will be inserted in the l2 header. Like below, |31 24|23 16|15 8|7 0| 0| Destination MAC address | 4| Dest MAC address(cont.) | Src MAC address | 8| Source MAC address(cont.) | 12| E-tag Etherenet type (0x893f) | E-tag header | 16| E-tag header(cont.) | 20| VLAN Ethertype(optional) | VLAN header(optional) | 24| Original type | ...... | ...| ...... | The E-tag format is like below, |0 15|16 18|19 |20 31| | Ethertype - 0x893f | E-PCP |DEI| Ingress E-CID_base | |32 33|34 35|36 47|48 55 |56 63| | RSV | GRP |E-CID_base|Ingress_E-CID_ext| E-CID_ext | The Ingess_E-CID_ext and E-CID_ext are always zero for endpoints and are effectively reserved. The more details of E-tag is in IEEE 802.1BR. 802.1BR is used to replace 802.1Qbh. 802.1BR is a standard for Bridge Port Extension. It specifies the operation of Bridge Port Extenders, including management, protocols, and algorithms. Bridge Port Extenders operate in support of the MAC Service by Extended Bridges. The E-tag is added to l2 header to identify the VM channel and the virtual port. Signed-off-by: Wenzhuo Lu Acked-by: Shaopeng He Acked-by: Jingjing Wu Tested-by: Yong Liu --- drivers/net/ixgbe/ixgbe_ethdev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index dbcb5b52e6..16326a85b5 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -138,6 +138,8 @@ #define IXGBE_CYCLECOUNTER_MASK 0xffffffffffffffffULL +#define IXGBE_VT_CTL_POOLING_MODE_MASK 0x00030000 + static int eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev); static int eth_ixgbe_dev_uninit(struct rte_eth_dev *eth_dev); static int ixgbe_dev_configure(struct rte_eth_dev *dev); @@ -1740,6 +1742,14 @@ ixgbe_vlan_hw_extend_enable(struct rte_eth_dev *dev) ctrl |= IXGBE_EXTENDED_VLAN; IXGBE_WRITE_REG(hw, IXGBE_CTRL_EXT, ctrl); + /* Clear pooling mode of PFVTCTL. It's required by X550. */ + if (hw->mac.type == ixgbe_mac_X550 || + hw->mac.type == ixgbe_mac_X550EM_x) { + ctrl = IXGBE_READ_REG(hw, IXGBE_VT_CTL); + ctrl &= ~IXGBE_VT_CTL_POOLING_MODE_MASK; + IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, ctrl); + } + /* * VET EXT field in the EXVET register = 0x8100 by default * So no need to change. Same to VT field of DMATXCTL register -- 2.20.1