Commit 0da0b77c authored by Raghu Vatsavayi's avatar Raghu Vatsavayi Committed by David S. Miller

liquidio: Vlan offloads changes

This patch adds support for vlan offloads for the driver and
receive header structures are also modified appropriately. Also
requestID will not be used in reveive header any more.
Signed-off-by: default avatarDerek Chickles <derek.chickles@caviumnetworks.com>
Signed-off-by: default avatarSatanand Burla <satananda.burla@caviumnetworks.com>
Signed-off-by: default avatarFelix Manlunas <felix.manlunas@caviumnetworks.com>
Signed-off-by: default avatarRaghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
Signed-off-by: default avatarRaghu Vatsavayi <rvatsavayi@caviumnetworks.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 63da8404
...@@ -1849,6 +1849,7 @@ liquidio_push_packet(u32 octeon_id, ...@@ -1849,6 +1849,7 @@ liquidio_push_packet(u32 octeon_id,
struct sk_buff *skb = (struct sk_buff *)skbuff; struct sk_buff *skb = (struct sk_buff *)skbuff;
struct skb_shared_hwtstamps *shhwtstamps; struct skb_shared_hwtstamps *shhwtstamps;
u64 ns; u64 ns;
u16 vtag = 0;
struct net_device *netdev = (struct net_device *)arg; struct net_device *netdev = (struct net_device *)arg;
struct octeon_droq *droq = container_of(param, struct octeon_droq, struct octeon_droq *droq = container_of(param, struct octeon_droq,
napi); napi);
...@@ -1925,6 +1926,16 @@ liquidio_push_packet(u32 octeon_id, ...@@ -1925,6 +1926,16 @@ liquidio_push_packet(u32 octeon_id,
else else
skb->ip_summed = CHECKSUM_NONE; skb->ip_summed = CHECKSUM_NONE;
/* inbound VLAN tag */
if ((netdev->features & NETIF_F_HW_VLAN_CTAG_RX) &&
(rh->r_dh.vlan != 0)) {
u16 vid = rh->r_dh.vlan;
u16 priority = rh->r_dh.priority;
vtag = priority << 13 | vid;
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), vtag);
}
packet_was_received = napi_gro_receive(napi, skb) != GRO_DROP; packet_was_received = napi_gro_receive(napi, skb) != GRO_DROP;
if (packet_was_received) { if (packet_was_received) {
...@@ -2900,6 +2911,11 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev) ...@@ -2900,6 +2911,11 @@ static int liquidio_xmit(struct sk_buff *skb, struct net_device *netdev)
tx_info->s.gso_size = skb_shinfo(skb)->gso_size; tx_info->s.gso_size = skb_shinfo(skb)->gso_size;
tx_info->s.gso_segs = skb_shinfo(skb)->gso_segs; tx_info->s.gso_segs = skb_shinfo(skb)->gso_segs;
} }
/* HW insert VLAN tag */
if (skb_vlan_tag_present(skb)) {
irh->priority = skb_vlan_tag_get(skb) >> 13;
irh->vlan = skb_vlan_tag_get(skb) & 0xfff;
}
xmit_more = skb->xmit_more; xmit_more = skb->xmit_more;
...@@ -3301,11 +3317,17 @@ static int setup_nic_devices(struct octeon_device *octeon_dev) ...@@ -3301,11 +3317,17 @@ static int setup_nic_devices(struct octeon_device *octeon_dev)
| NETIF_F_LRO; | NETIF_F_LRO;
netif_set_gso_max_size(netdev, OCTNIC_GSO_MAX_SIZE); netif_set_gso_max_size(netdev, OCTNIC_GSO_MAX_SIZE);
netdev->features = (lio->dev_capability & ~NETIF_F_LRO);
netdev->vlan_features = lio->dev_capability; netdev->vlan_features = lio->dev_capability;
/* Add any unchangeable hw features */
lio->dev_capability |= NETIF_F_HW_VLAN_CTAG_RX |
NETIF_F_HW_VLAN_CTAG_TX;
netdev->features = (lio->dev_capability & ~NETIF_F_LRO);
netdev->hw_features = lio->dev_capability; netdev->hw_features = lio->dev_capability;
/*HW_VLAN_RX and HW_VLAN_FILTER is always on*/
netdev->hw_features = netdev->hw_features &
~NETIF_F_HW_VLAN_CTAG_RX;
/* Point to the properties for octeon device to which this /* Point to the properties for octeon device to which this
* interface belongs. * interface belongs.
......
...@@ -482,15 +482,15 @@ struct octeon_instr_irh { ...@@ -482,15 +482,15 @@ struct octeon_instr_irh {
u64 opcode:4; u64 opcode:4;
u64 rflag:1; u64 rflag:1;
u64 subcode:7; u64 subcode:7;
u64 len:3; u64 vlan:12;
u64 rid:13; u64 priority:3;
u64 reserved:4; u64 reserved:5;
u64 ossp:32; /* opcode/subcode specific parameters */ u64 ossp:32; /* opcode/subcode specific parameters */
#else #else
u64 ossp:32; /* opcode/subcode specific parameters */ u64 ossp:32; /* opcode/subcode specific parameters */
u64 reserved:4; u64 reserved:5;
u64 rid:13; u64 priority:3;
u64 len:3; u64 vlan:12;
u64 subcode:7; u64 subcode:7;
u64 rflag:1; u64 rflag:1;
u64 opcode:4; u64 opcode:4;
...@@ -518,17 +518,16 @@ union octeon_rh { ...@@ -518,17 +518,16 @@ union octeon_rh {
u64 opcode:4; u64 opcode:4;
u64 subcode:8; u64 subcode:8;
u64 len:3; /** additional 64-bit words */ u64 len:3; /** additional 64-bit words */
u64 rid:13; /** request id in response to pkt sent by host */ u64 reserved:17;
u64 reserved:4;
u64 ossp:32; /** opcode/subcode specific parameters */ u64 ossp:32; /** opcode/subcode specific parameters */
} r; } r;
struct { struct {
u64 opcode:4; u64 opcode:4;
u64 subcode:8; u64 subcode:8;
u64 len:3; /** additional 64-bit words */ u64 len:3; /** additional 64-bit words */
u64 rid:13; /** request id in response to pkt sent by host */ u64 extra:28;
u64 extra:24; u64 vlan:12;
u64 link:8; u64 priority:3;
u64 csum_verified:3; /** checksum verified. */ u64 csum_verified:3; /** checksum verified. */
u64 has_hwtstamp:1; /** Has hardware timestamp. 1 = yes. */ u64 has_hwtstamp:1; /** Has hardware timestamp. 1 = yes. */
} r_dh; } r_dh;
...@@ -536,9 +535,9 @@ union octeon_rh { ...@@ -536,9 +535,9 @@ union octeon_rh {
u64 opcode:4; u64 opcode:4;
u64 subcode:8; u64 subcode:8;
u64 len:3; /** additional 64-bit words */ u64 len:3; /** additional 64-bit words */
u64 rid:13; /** request id in response to pkt sent by host */ u64 reserved:11;
u64 num_gmx_ports:8; u64 num_gmx_ports:8;
u64 max_nic_ports:8; u64 max_nic_ports:10;
u64 app_cap_flags:4; u64 app_cap_flags:4;
u64 app_mode:16; u64 app_mode:16;
} r_core_drv_init; } r_core_drv_init;
...@@ -554,8 +553,7 @@ union octeon_rh { ...@@ -554,8 +553,7 @@ union octeon_rh {
u64 u64; u64 u64;
struct { struct {
u64 ossp:32; /** opcode/subcode specific parameters */ u64 ossp:32; /** opcode/subcode specific parameters */
u64 reserved:4; u64 reserved:17;
u64 rid:13; /** req id in response to pkt sent by host */
u64 len:3; /** additional 64-bit words */ u64 len:3; /** additional 64-bit words */
u64 subcode:8; u64 subcode:8;
u64 opcode:4; u64 opcode:4;
...@@ -563,9 +561,9 @@ union octeon_rh { ...@@ -563,9 +561,9 @@ union octeon_rh {
struct { struct {
u64 has_hwtstamp:1; /** 1 = has hwtstamp */ u64 has_hwtstamp:1; /** 1 = has hwtstamp */
u64 csum_verified:3; /** checksum verified. */ u64 csum_verified:3; /** checksum verified. */
u64 link:8; u64 priority:3;
u64 extra:24; u64 vlan:12;
u64 rid:13; /** req id in response to pkt sent by host */ u64 extra:28;
u64 len:3; /** additional 64-bit words */ u64 len:3; /** additional 64-bit words */
u64 subcode:8; u64 subcode:8;
u64 opcode:4; u64 opcode:4;
...@@ -573,9 +571,9 @@ union octeon_rh { ...@@ -573,9 +571,9 @@ union octeon_rh {
struct { struct {
u64 app_mode:16; u64 app_mode:16;
u64 app_cap_flags:4; u64 app_cap_flags:4;
u64 max_nic_ports:8; u64 max_nic_ports:10;
u64 num_gmx_ports:8; u64 num_gmx_ports:8;
u64 rid:13; u64 reserved:11;
u64 len:3; /** additional 64-bit words */ u64 len:3; /** additional 64-bit words */
u64 subcode:8; u64 subcode:8;
u64 opcode:4; u64 opcode:4;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment