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

Commit 79032644 authored by Michał Mirosław's avatar Michał Mirosław Committed by David S. Miller
Browse files

net: Fix too optimistic NETIF_F_HW_CSUM features



NETIF_F_HW_CSUM is a superset of NETIF_F_IP_CSUM+NETIF_F_IPV6_CSUM, but
some drivers miss the difference. Fix this and also fix UFO dependency
on checksumming offload as it makes the same mistake in assumptions.

Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Acked-by: default avatarJon Mason <jon.mason@exar.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 900d495a
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -2583,10 +2583,12 @@ static void be_netdev_init(struct net_device *netdev)
	int i;

	netdev->features |= NETIF_F_SG | NETIF_F_HW_VLAN_RX | NETIF_F_TSO |
		NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER | NETIF_F_HW_CSUM |
		NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_FILTER |
		NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
		NETIF_F_GRO | NETIF_F_TSO6;

	netdev->vlan_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_HW_CSUM;
	netdev->vlan_features |= NETIF_F_SG | NETIF_F_TSO |
		NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;

	if (lancer_chip(adapter))
		netdev->vlan_features |= NETIF_F_TSO6;
+2 −2
Original line number Diff line number Diff line
@@ -8957,7 +8957,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
	dev->netdev_ops = &bnx2x_netdev_ops;
	bnx2x_set_ethtool_ops(dev);
	dev->features |= NETIF_F_SG;
	dev->features |= NETIF_F_HW_CSUM;
	dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
	if (bp->flags & USING_DAC_FLAG)
		dev->features |= NETIF_F_HIGHDMA;
	dev->features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
@@ -8965,7 +8965,7 @@ static int __devinit bnx2x_init_dev(struct pci_dev *pdev,
	dev->features |= (NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX);

	dev->vlan_features |= NETIF_F_SG;
	dev->vlan_features |= NETIF_F_HW_CSUM;
	dev->vlan_features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
	if (bp->flags & USING_DAC_FLAG)
		dev->vlan_features |= NETIF_F_HIGHDMA;
	dev->vlan_features |= (NETIF_F_TSO | NETIF_F_TSO_ECN);
+9 −7
Original line number Diff line number Diff line
@@ -2076,12 +2076,11 @@ jme_change_mtu(struct net_device *netdev, int new_mtu)
	}

	if (new_mtu > 1900) {
		netdev->features &= ~(NETIF_F_HW_CSUM |
				NETIF_F_TSO |
				NETIF_F_TSO6);
		netdev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
				NETIF_F_TSO | NETIF_F_TSO6);
	} else {
		if (test_bit(JME_FLAG_TXCSUM, &jme->flags))
			netdev->features |= NETIF_F_HW_CSUM;
			netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
		if (test_bit(JME_FLAG_TSO, &jme->flags))
			netdev->features |= NETIF_F_TSO | NETIF_F_TSO6;
	}
@@ -2514,10 +2513,12 @@ jme_set_tx_csum(struct net_device *netdev, u32 on)
	if (on) {
		set_bit(JME_FLAG_TXCSUM, &jme->flags);
		if (netdev->mtu <= 1900)
			netdev->features |= NETIF_F_HW_CSUM;
			netdev->features |=
				NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
	} else {
		clear_bit(JME_FLAG_TXCSUM, &jme->flags);
		netdev->features &= ~NETIF_F_HW_CSUM;
		netdev->features &=
				~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
	}

	return 0;
@@ -2797,7 +2798,8 @@ jme_init_one(struct pci_dev *pdev,
	netdev->netdev_ops = &jme_netdev_ops;
	netdev->ethtool_ops		= &jme_ethtool_ops;
	netdev->watchdog_timeo		= TX_TIMEOUT;
	netdev->features		=	NETIF_F_HW_CSUM |
	netdev->features		=	NETIF_F_IP_CSUM |
						NETIF_F_IPV6_CSUM |
						NETIF_F_SG |
						NETIF_F_TSO |
						NETIF_F_TSO6 |
+1 −18
Original line number Diff line number Diff line
@@ -468,18 +468,6 @@ static int pch_gbe_set_rx_csum(struct net_device *netdev, u32 data)
	return 0;
}

/**
 * pch_gbe_get_tx_csum - Report whether transmit checksums are turned on or off
 * @netdev:  Network interface device structure
 * Returns
 *	true(1):  Checksum On
 *	false(0): Checksum Off
 */
static u32 pch_gbe_get_tx_csum(struct net_device *netdev)
{
	return (netdev->features & NETIF_F_HW_CSUM) != 0;
}

/**
 * pch_gbe_set_tx_csum - Turn transmit checksums on or off
 * @netdev: Network interface device structure
@@ -493,11 +481,7 @@ static int pch_gbe_set_tx_csum(struct net_device *netdev, u32 data)
	struct pch_gbe_adapter *adapter = netdev_priv(netdev);

	adapter->tx_csum = data;
	if (data)
		netdev->features |= NETIF_F_HW_CSUM;
	else
		netdev->features &= ~NETIF_F_HW_CSUM;
	return 0;
	return ethtool_op_set_tx_ipv6_csum(netdev, data);
}

/**
@@ -572,7 +556,6 @@ static const struct ethtool_ops pch_gbe_ethtool_ops = {
	.set_pauseparam = pch_gbe_set_pauseparam,
	.get_rx_csum = pch_gbe_get_rx_csum,
	.set_rx_csum = pch_gbe_set_rx_csum,
	.get_tx_csum = pch_gbe_get_tx_csum,
	.set_tx_csum = pch_gbe_set_tx_csum,
	.get_strings = pch_gbe_get_strings,
	.get_ethtool_stats = pch_gbe_get_ethtool_stats,
+3 −3
Original line number Diff line number Diff line
@@ -2319,7 +2319,7 @@ static int pch_gbe_probe(struct pci_dev *pdev,
	netdev->watchdog_timeo = PCH_GBE_WATCHDOG_PERIOD;
	netif_napi_add(netdev, &adapter->napi,
		       pch_gbe_napi_poll, PCH_GBE_RX_WEIGHT);
	netdev->features = NETIF_F_HW_CSUM | NETIF_F_GRO;
	netdev->features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_GRO;
	pch_gbe_set_ethtool_ops(netdev);

	pch_gbe_mac_reset_hw(&adapter->hw);
@@ -2358,9 +2358,9 @@ static int pch_gbe_probe(struct pci_dev *pdev,
	pch_gbe_check_options(adapter);

	if (adapter->tx_csum)
		netdev->features |= NETIF_F_HW_CSUM;
		netdev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
	else
		netdev->features &= ~NETIF_F_HW_CSUM;
		netdev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);

	/* initialize the wol settings based on the eeprom settings */
	adapter->wake_up_evt = PCH_GBE_WL_INIT_SETTING;
Loading