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); }
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; }