Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b9796a14 authored by Anirban Chakraborty's avatar Anirban Chakraborty Committed by David S. Miller
Browse files

qlcnic: Changes to VLAN code



Made changes to VLAN code comply with new VLAN infrastructure in kernel

Signed-off-by: default avatarAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 036d61f0
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@

#include <linux/io.h>
#include <asm/byteorder.h>
#include <linux/bitops.h>
#include <linux/if_vlan.h>

#include "qlcnic_hdr.h"

@@ -982,8 +984,8 @@ struct qlcnic_adapter {
	u8 mac_addr[ETH_ALEN];

	u64 dev_rst_time;
	unsigned long vlans[BITS_TO_LONGS(VLAN_N_VID)];

	struct vlan_group *vlgrp;
	struct qlcnic_npar_info *npars;
	struct qlcnic_eswitch *eswitch;
	struct qlcnic_nic_template *nic_ops;
+7 −8
Original line number Diff line number Diff line
@@ -1467,9 +1467,9 @@ qlcnic_process_rcv(struct qlcnic_adapter *adapter,

	skb->protocol = eth_type_trans(skb, netdev);

	if ((vid != 0xffff) && adapter->vlgrp)
		vlan_gro_receive(&sds_ring->napi, adapter->vlgrp, vid, skb);
	else
	if (vid != 0xffff)
		__vlan_hwaccel_put_tag(skb, vid);

	napi_gro_receive(&sds_ring->napi, skb);

	adapter->stats.rx_pkts++;
@@ -1552,9 +1552,8 @@ qlcnic_process_lro(struct qlcnic_adapter *adapter,

	length = skb->len;

	if ((vid != 0xffff) && adapter->vlgrp)
		vlan_hwaccel_receive_skb(skb, adapter->vlgrp, vid);
	else
	if (vid != 0xffff)
		__vlan_hwaccel_put_tag(skb, vid);
	netif_receive_skb(skb);

	adapter->stats.lro_pkts++;
+25 −17
Original line number Diff line number Diff line
@@ -13,7 +13,6 @@

#include <linux/swab.h>
#include <linux/dma-mapping.h>
#include <linux/if_vlan.h>
#include <net/ip.h>
#include <linux/ipv6.h>
#include <linux/inetdevice.h>
@@ -98,6 +97,9 @@ static int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32);
static int qlcnicvf_start_firmware(struct qlcnic_adapter *);
static void qlcnic_set_netdev_features(struct qlcnic_adapter *,
				struct qlcnic_esw_func_cfg *);
static void qlcnic_vlan_rx_add(struct net_device *, u16);
static void qlcnic_vlan_rx_del(struct net_device *, u16);

/*  PCI Device ID Table  */
#define ENTRY(device) \
	{PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, (device)), \
@@ -317,13 +319,6 @@ static int qlcnic_set_mac(struct net_device *netdev, void *p)
	return 0;
}

static void qlcnic_vlan_rx_register(struct net_device *netdev,
		struct vlan_group *grp)
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	adapter->vlgrp = grp;
}

static const struct net_device_ops qlcnic_netdev_ops = {
	.ndo_open	   = qlcnic_open,
	.ndo_stop	   = qlcnic_close,
@@ -334,7 +329,8 @@ static const struct net_device_ops qlcnic_netdev_ops = {
	.ndo_set_mac_address    = qlcnic_set_mac,
	.ndo_change_mtu	   = qlcnic_change_mtu,
	.ndo_tx_timeout	   = qlcnic_tx_timeout,
	.ndo_vlan_rx_register = qlcnic_vlan_rx_register,
	.ndo_vlan_rx_add_vid	= qlcnic_vlan_rx_add,
	.ndo_vlan_rx_kill_vid	= qlcnic_vlan_rx_del,
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller = qlcnic_poll_controller,
#endif
@@ -709,6 +705,22 @@ qlcnic_set_vlan_config(struct qlcnic_adapter *adapter,
		adapter->pvid = 0;
}

static void
qlcnic_vlan_rx_add(struct net_device *netdev, u16 vid)
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	set_bit(vid, adapter->vlans);
}

static void
qlcnic_vlan_rx_del(struct net_device *netdev, u16 vid)
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);

	qlcnic_restore_indev_addr(netdev, NETDEV_DOWN);
	clear_bit(vid, adapter->vlans);
}

static void
qlcnic_set_eswitch_port_features(struct qlcnic_adapter *adapter,
		struct qlcnic_esw_func_cfg *esw_cfg)
@@ -755,7 +767,7 @@ qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
	features = (NETIF_F_SG | NETIF_F_IP_CSUM |
			NETIF_F_IPV6_CSUM | NETIF_F_GRO);
	vlan_features = (NETIF_F_SG | NETIF_F_IP_CSUM |
			NETIF_F_IPV6_CSUM);
			NETIF_F_IPV6_CSUM | NETIF_F_HW_VLAN_FILTER);

	if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO) {
		features |= (NETIF_F_TSO | NETIF_F_TSO6);
@@ -1448,7 +1460,7 @@ qlcnic_setup_netdev(struct qlcnic_adapter *adapter,
	netdev->features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
		NETIF_F_IPV6_CSUM | NETIF_F_GRO | NETIF_F_HW_VLAN_RX);
	netdev->vlan_features |= (NETIF_F_SG | NETIF_F_IP_CSUM |
		NETIF_F_IPV6_CSUM);
		NETIF_F_IPV6_CSUM | NETIF_F_HW_VLAN_FILTER);

	if (adapter->capabilities & QLCNIC_FW_CAPABILITY_TSO) {
		netdev->features |= (NETIF_F_TSO | NETIF_F_TSO6);
@@ -4068,14 +4080,10 @@ qlcnic_restore_indev_addr(struct net_device *netdev, unsigned long event)

	qlcnic_config_indev_addr(adapter, netdev, event);

	if (!adapter->vlgrp)
		return;

	for (vid = 0; vid < VLAN_N_VID; vid++) {
		dev = vlan_group_get_device(adapter->vlgrp, vid);
	for_each_set_bit(vid, adapter->vlans, VLAN_N_VID) {
		dev = vlan_find_dev(netdev, vid);
		if (!dev)
			continue;

		qlcnic_config_indev_addr(adapter, dev, event);
	}
}