Esempio n. 1
0
static int ehea_set_flags(struct net_device *dev, u32 data)
{
	/* Avoid changing the VLAN flags */
	if ((data & (ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN)) !=
	    (ethtool_op_get_flags(dev) & (ETH_FLAG_RXVLAN |
					  ETH_FLAG_TXVLAN))){
		return -EINVAL;
	}

	return ethtool_op_set_flags(dev, data, ETH_FLAG_LRO
					| ETH_FLAG_TXVLAN
					| ETH_FLAG_RXVLAN);
}
Esempio n. 2
0
static int qlcnic_set_flags(struct net_device *netdev, u32 data)
{
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
	int hw_lro;

	if ((ethtool_op_get_flags(netdev) & ~ETH_FLAG_LRO) !=
	    (data & ~ETH_FLAG_LRO))
		return -EINVAL;

	if (data & ETH_FLAG_LRO) {
		if (netdev->features & NETIF_F_LRO)
			return 0;

		if (!(adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO))
			return -EINVAL;

		if (!adapter->rx_csum) {
			dev_info(&adapter->pdev->dev, "rx csum is off, "
				"cannot toggle lro\n");
			return -EINVAL;
		}

		hw_lro = QLCNIC_LRO_ENABLED;
		netdev->features |= NETIF_F_LRO;
	} else {

		if (!(netdev->features & NETIF_F_LRO))
			return 0;

		hw_lro = 0;
		netdev->features &= ~NETIF_F_LRO;
	}

	if (qlcnic_config_hw_lro(adapter, hw_lro))
		return -EIO;

	if ((hw_lro == 0) && qlcnic_send_lro_cleanup(adapter))
		return -EIO;


	return 0;
}