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

Commit 0364d6fd authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

igbvf: cleanup flags and allow for rx checksum to be disabled



This patch cleans up a number of unused or unneeded feature flags.  As a
result of these changes the user should now be able to enable or disable rx
checksumming via ethtool.

Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e0ca8410
Loading
Loading
Loading
Loading
+20 −16
Original line number Original line Diff line number Diff line
@@ -133,6 +133,24 @@ static int igbvf_set_pauseparam(struct net_device *netdev,
	return -EOPNOTSUPP;
	return -EOPNOTSUPP;
}
}


static u32 igbvf_get_rx_csum(struct net_device *netdev)
{
	struct igbvf_adapter *adapter = netdev_priv(netdev);
	return !(adapter->flags & IGBVF_FLAG_RX_CSUM_DISABLED);
}

static int igbvf_set_rx_csum(struct net_device *netdev, u32 data)
{
	struct igbvf_adapter *adapter = netdev_priv(netdev);

	if (data)
		adapter->flags &= ~IGBVF_FLAG_RX_CSUM_DISABLED;
	else
		adapter->flags |= IGBVF_FLAG_RX_CSUM_DISABLED;

	return 0;
}

static u32 igbvf_get_tx_csum(struct net_device *netdev)
static u32 igbvf_get_tx_csum(struct net_device *netdev)
{
{
	return ((netdev->features & NETIF_F_IP_CSUM) != 0);
	return ((netdev->features & NETIF_F_IP_CSUM) != 0);
@@ -150,8 +168,6 @@ static int igbvf_set_tx_csum(struct net_device *netdev, u32 data)
static int igbvf_set_tso(struct net_device *netdev, u32 data)
static int igbvf_set_tso(struct net_device *netdev, u32 data)
{
{
	struct igbvf_adapter *adapter = netdev_priv(netdev);
	struct igbvf_adapter *adapter = netdev_priv(netdev);
	int i;
	struct net_device *v_netdev;


	if (data) {
	if (data) {
		netdev->features |= NETIF_F_TSO;
		netdev->features |= NETIF_F_TSO;
@@ -159,24 +175,10 @@ static int igbvf_set_tso(struct net_device *netdev, u32 data)
	} else {
	} else {
		netdev->features &= ~NETIF_F_TSO;
		netdev->features &= ~NETIF_F_TSO;
		netdev->features &= ~NETIF_F_TSO6;
		netdev->features &= ~NETIF_F_TSO6;
		/* disable TSO on all VLANs if they're present */
		if (!adapter->vlgrp)
			goto tso_out;
		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
			v_netdev = vlan_group_get_device(adapter->vlgrp, i);
			if (!v_netdev)
				continue;

			v_netdev->features &= ~NETIF_F_TSO;
			v_netdev->features &= ~NETIF_F_TSO6;
			vlan_group_set_device(adapter->vlgrp, i, v_netdev);
		}
	}
	}


tso_out:
	dev_info(&adapter->pdev->dev, "TSO is %s\n",
	dev_info(&adapter->pdev->dev, "TSO is %s\n",
	         data ? "Enabled" : "Disabled");
	         data ? "Enabled" : "Disabled");
	adapter->flags |= FLAG_TSO_FORCE;
	return 0;
	return 0;
}
}


@@ -517,6 +519,8 @@ static const struct ethtool_ops igbvf_ethtool_ops = {
	.set_ringparam		= igbvf_set_ringparam,
	.set_ringparam		= igbvf_set_ringparam,
	.get_pauseparam		= igbvf_get_pauseparam,
	.get_pauseparam		= igbvf_get_pauseparam,
	.set_pauseparam		= igbvf_set_pauseparam,
	.set_pauseparam		= igbvf_set_pauseparam,
	.get_rx_csum            = igbvf_get_rx_csum,
	.set_rx_csum            = igbvf_set_rx_csum,
	.get_tx_csum		= igbvf_get_tx_csum,
	.get_tx_csum		= igbvf_get_tx_csum,
	.set_tx_csum		= igbvf_set_tx_csum,
	.set_tx_csum		= igbvf_set_tx_csum,
	.get_sg			= ethtool_op_get_sg,
	.get_sg			= ethtool_op_get_sg,
+1 −5
Original line number Original line Diff line number Diff line
@@ -286,11 +286,7 @@ struct igbvf_info {
};
};


/* hardware capability, feature, and workaround flags */
/* hardware capability, feature, and workaround flags */
#define FLAG_HAS_HW_VLAN_FILTER           (1 << 0)
#define IGBVF_FLAG_RX_CSUM_DISABLED             (1 << 0)
#define FLAG_HAS_JUMBO_FRAMES             (1 << 1)
#define FLAG_MSI_ENABLED                  (1 << 2)
#define FLAG_RX_CSUM_ENABLED              (1 << 3)
#define FLAG_TSO_FORCE                    (1 << 4)


#define IGBVF_RX_DESC_ADV(R, i)     \
#define IGBVF_RX_DESC_ADV(R, i)     \
	(&((((R).desc))[i].rx_desc))
	(&((((R).desc))[i].rx_desc))
+5 −12
Original line number Original line Diff line number Diff line
@@ -58,8 +58,7 @@ static void igbvf_reset_interrupt_capability(struct igbvf_adapter *);


static struct igbvf_info igbvf_vf_info = {
static struct igbvf_info igbvf_vf_info = {
	.mac                    = e1000_vfadapt,
	.mac                    = e1000_vfadapt,
	.flags                  = FLAG_HAS_JUMBO_FRAMES
	.flags                  = 0,
	                          | FLAG_RX_CSUM_ENABLED,
	.pba                    = 10,
	.pba                    = 10,
	.init_ops               = e1000_init_function_pointers_vf,
	.init_ops               = e1000_init_function_pointers_vf,
};
};
@@ -107,8 +106,10 @@ static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter,
	skb->ip_summed = CHECKSUM_NONE;
	skb->ip_summed = CHECKSUM_NONE;


	/* Ignore Checksum bit is set or checksum is disabled through ethtool */
	/* Ignore Checksum bit is set or checksum is disabled through ethtool */
	if ((status_err & E1000_RXD_STAT_IXSM))
	if ((status_err & E1000_RXD_STAT_IXSM) ||
	    (adapter->flags & IGBVF_FLAG_RX_CSUM_DISABLED))
		return;
		return;

	/* TCP/UDP checksum error bit is set */
	/* TCP/UDP checksum error bit is set */
	if (status_err &
	if (status_err &
	    (E1000_RXDEXT_STATERR_TCPE | E1000_RXDEXT_STATERR_IPE)) {
	    (E1000_RXDEXT_STATERR_TCPE | E1000_RXDEXT_STATERR_IPE)) {
@@ -116,6 +117,7 @@ static inline void igbvf_rx_checksum_adv(struct igbvf_adapter *adapter,
		adapter->hw_csum_err++;
		adapter->hw_csum_err++;
		return;
		return;
	}
	}

	/* It must be a TCP or UDP packet with a valid checksum */
	/* It must be a TCP or UDP packet with a valid checksum */
	if (status_err & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS))
	if (status_err & (E1000_RXD_STAT_TCPCS | E1000_RXD_STAT_UDPCS))
		skb->ip_summed = CHECKSUM_UNNECESSARY;
		skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -2351,15 +2353,6 @@ static int igbvf_change_mtu(struct net_device *netdev, int new_mtu)
		return -EINVAL;
		return -EINVAL;
	}
	}


	/* Jumbo frame size limits */
	if (max_frame > ETH_FRAME_LEN + ETH_FCS_LEN) {
		if (!(adapter->flags & FLAG_HAS_JUMBO_FRAMES)) {
			dev_err(&adapter->pdev->dev,
			        "Jumbo Frames not supported.\n");
			return -EINVAL;
		}
	}

#define MAX_STD_JUMBO_FRAME_SIZE 9234
#define MAX_STD_JUMBO_FRAME_SIZE 9234
	if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
	if (max_frame > MAX_STD_JUMBO_FRAME_SIZE) {
		dev_err(&adapter->pdev->dev, "MTU > 9216 not supported.\n");
		dev_err(&adapter->pdev->dev, "MTU > 9216 not supported.\n");