net: introduce and use netdev_features_t for device features sets
v2: add couple missing conversions in drivers split unexporting netdev_fix_features() implemented %pNF convert sock::sk_route_(no?)caps Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
					parent
					
						
							
								a59e2ecb85
							
						
					
				
			
			
				commit
				
					
						c8f44affb7
					
				
			
		
					 74 changed files with 305 additions and 202 deletions
				
			
		| 
						 | 
					@ -1325,11 +1325,12 @@ static int bond_sethwaddr(struct net_device *bond_dev,
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 bond_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t bond_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct slave *slave;
 | 
						struct slave *slave;
 | 
				
			||||||
	struct bonding *bond = netdev_priv(dev);
 | 
						struct bonding *bond = netdev_priv(dev);
 | 
				
			||||||
	u32 mask;
 | 
						netdev_features_t mask;
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	read_lock(&bond->lock);
 | 
						read_lock(&bond->lock);
 | 
				
			||||||
| 
						 | 
					@ -1363,7 +1364,7 @@ static void bond_compute_features(struct bonding *bond)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct slave *slave;
 | 
						struct slave *slave;
 | 
				
			||||||
	struct net_device *bond_dev = bond->dev;
 | 
						struct net_device *bond_dev = bond->dev;
 | 
				
			||||||
	u32 vlan_features = BOND_VLAN_FEATURES;
 | 
						netdev_features_t vlan_features = BOND_VLAN_FEATURES;
 | 
				
			||||||
	unsigned short max_hard_header_len = ETH_HLEN;
 | 
						unsigned short max_hard_header_len = ETH_HLEN;
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1897,7 +1898,7 @@ int bond_release(struct net_device *bond_dev, struct net_device *slave_dev)
 | 
				
			||||||
	struct bonding *bond = netdev_priv(bond_dev);
 | 
						struct bonding *bond = netdev_priv(bond_dev);
 | 
				
			||||||
	struct slave *slave, *oldcurrent;
 | 
						struct slave *slave, *oldcurrent;
 | 
				
			||||||
	struct sockaddr addr;
 | 
						struct sockaddr addr;
 | 
				
			||||||
	u32 old_features = bond_dev->features;
 | 
						netdev_features_t old_features = bond_dev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* slave is not a slave or master is not master of this slave */
 | 
						/* slave is not a slave or master is not master of this slave */
 | 
				
			||||||
	if (!(slave_dev->flags & IFF_SLAVE) ||
 | 
						if (!(slave_dev->flags & IFF_SLAVE) ||
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -411,7 +411,7 @@ static void atl1c_set_multi(struct net_device *netdev)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __atl1c_vlan_mode(u32 features, u32 *mac_ctrl_data)
 | 
					static void __atl1c_vlan_mode(netdev_features_t features, u32 *mac_ctrl_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (features & NETIF_F_HW_VLAN_RX) {
 | 
						if (features & NETIF_F_HW_VLAN_RX) {
 | 
				
			||||||
		/* enable VLAN tag insert/strip */
 | 
							/* enable VLAN tag insert/strip */
 | 
				
			||||||
| 
						 | 
					@ -422,7 +422,8 @@ static void __atl1c_vlan_mode(u32 features, u32 *mac_ctrl_data)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void atl1c_vlan_mode(struct net_device *netdev, u32 features)
 | 
					static void atl1c_vlan_mode(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct atl1c_adapter *adapter = netdev_priv(netdev);
 | 
						struct atl1c_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	struct pci_dev *pdev = adapter->pdev;
 | 
						struct pci_dev *pdev = adapter->pdev;
 | 
				
			||||||
| 
						 | 
					@ -482,7 +483,8 @@ static void atl1c_set_rxbufsize(struct atl1c_adapter *adapter,
 | 
				
			||||||
		roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE;
 | 
							roundup(mtu + ETH_HLEN + ETH_FCS_LEN + VLAN_HLEN, 8) : AT_RX_BUF_SIZE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 atl1c_fix_features(struct net_device *netdev, u32 features)
 | 
					static netdev_features_t atl1c_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -499,9 +501,10 @@ static u32 atl1c_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int atl1c_set_features(struct net_device *netdev, u32 features)
 | 
					static int atl1c_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = netdev->features ^ features;
 | 
						netdev_features_t changed = netdev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		atl1c_vlan_mode(netdev, features);
 | 
							atl1c_vlan_mode(netdev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -313,7 +313,7 @@ static void atl1e_set_multi(struct net_device *netdev)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __atl1e_vlan_mode(u32 features, u32 *mac_ctrl_data)
 | 
					static void __atl1e_vlan_mode(netdev_features_t features, u32 *mac_ctrl_data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (features & NETIF_F_HW_VLAN_RX) {
 | 
						if (features & NETIF_F_HW_VLAN_RX) {
 | 
				
			||||||
		/* enable VLAN tag insert/strip */
 | 
							/* enable VLAN tag insert/strip */
 | 
				
			||||||
| 
						 | 
					@ -324,7 +324,8 @@ static void __atl1e_vlan_mode(u32 features, u32 *mac_ctrl_data)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void atl1e_vlan_mode(struct net_device *netdev, u32 features)
 | 
					static void atl1e_vlan_mode(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct atl1e_adapter *adapter = netdev_priv(netdev);
 | 
						struct atl1e_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 mac_ctrl_data = 0;
 | 
						u32 mac_ctrl_data = 0;
 | 
				
			||||||
| 
						 | 
					@ -370,7 +371,8 @@ static int atl1e_set_mac_addr(struct net_device *netdev, void *p)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 atl1e_fix_features(struct net_device *netdev, u32 features)
 | 
					static netdev_features_t atl1e_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -384,9 +386,10 @@ static u32 atl1e_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int atl1e_set_features(struct net_device *netdev, u32 features)
 | 
					static int atl1e_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = netdev->features ^ features;
 | 
						netdev_features_t changed = netdev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		atl1e_vlan_mode(netdev, features);
 | 
							atl1e_vlan_mode(netdev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -361,7 +361,7 @@ static inline void atl2_irq_disable(struct atl2_adapter *adapter)
 | 
				
			||||||
    synchronize_irq(adapter->pdev->irq);
 | 
					    synchronize_irq(adapter->pdev->irq);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __atl2_vlan_mode(u32 features, u32 *ctrl)
 | 
					static void __atl2_vlan_mode(netdev_features_t features, u32 *ctrl)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (features & NETIF_F_HW_VLAN_RX) {
 | 
						if (features & NETIF_F_HW_VLAN_RX) {
 | 
				
			||||||
		/* enable VLAN tag insert/strip */
 | 
							/* enable VLAN tag insert/strip */
 | 
				
			||||||
| 
						 | 
					@ -372,7 +372,8 @@ static void __atl2_vlan_mode(u32 features, u32 *ctrl)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void atl2_vlan_mode(struct net_device *netdev, u32 features)
 | 
					static void atl2_vlan_mode(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct atl2_adapter *adapter = netdev_priv(netdev);
 | 
						struct atl2_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 ctrl;
 | 
						u32 ctrl;
 | 
				
			||||||
| 
						 | 
					@ -391,7 +392,8 @@ static void atl2_restore_vlan(struct atl2_adapter *adapter)
 | 
				
			||||||
	atl2_vlan_mode(adapter->netdev, adapter->netdev->features);
 | 
						atl2_vlan_mode(adapter->netdev, adapter->netdev->features);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 atl2_fix_features(struct net_device *netdev, u32 features)
 | 
					static netdev_features_t atl2_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -405,9 +407,10 @@ static u32 atl2_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int atl2_set_features(struct net_device *netdev, u32 features)
 | 
					static int atl2_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = netdev->features ^ features;
 | 
						netdev_features_t changed = netdev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		atl2_vlan_mode(netdev, features);
 | 
							atl2_vlan_mode(netdev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,7 +211,7 @@ static void atlx_link_chg_task(struct work_struct *work)
 | 
				
			||||||
	spin_unlock_irqrestore(&adapter->lock, flags);
 | 
						spin_unlock_irqrestore(&adapter->lock, flags);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __atlx_vlan_mode(u32 features, u32 *ctrl)
 | 
					static void __atlx_vlan_mode(netdev_features_t features, u32 *ctrl)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (features & NETIF_F_HW_VLAN_RX) {
 | 
						if (features & NETIF_F_HW_VLAN_RX) {
 | 
				
			||||||
		/* enable VLAN tag insert/strip */
 | 
							/* enable VLAN tag insert/strip */
 | 
				
			||||||
| 
						 | 
					@ -222,7 +222,8 @@ static void __atlx_vlan_mode(u32 features, u32 *ctrl)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void atlx_vlan_mode(struct net_device *netdev, u32 features)
 | 
					static void atlx_vlan_mode(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct atlx_adapter *adapter = netdev_priv(netdev);
 | 
						struct atlx_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
| 
						 | 
					@ -242,7 +243,8 @@ static void atlx_restore_vlan(struct atlx_adapter *adapter)
 | 
				
			||||||
	atlx_vlan_mode(adapter->netdev, adapter->netdev->features);
 | 
						atlx_vlan_mode(adapter->netdev, adapter->netdev->features);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 atlx_fix_features(struct net_device *netdev, u32 features)
 | 
					static netdev_features_t atlx_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -256,9 +258,10 @@ static u32 atlx_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int atlx_set_features(struct net_device *netdev, u32 features)
 | 
					static int atlx_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = netdev->features ^ features;
 | 
						netdev_features_t changed = netdev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		atlx_vlan_mode(netdev, features);
 | 
							atlx_vlan_mode(netdev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7571,8 +7571,8 @@ bnx2_set_phys_id(struct net_device *dev, enum ethtool_phys_id_state state)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32
 | 
					static netdev_features_t
 | 
				
			||||||
bnx2_fix_features(struct net_device *dev, u32 features)
 | 
					bnx2_fix_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct bnx2 *bp = netdev_priv(dev);
 | 
						struct bnx2 *bp = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7583,7 +7583,7 @@ bnx2_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
bnx2_set_features(struct net_device *dev, u32 features)
 | 
					bnx2_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct bnx2 *bp = netdev_priv(dev);
 | 
						struct bnx2 *bp = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3398,7 +3398,8 @@ int bnx2x_change_mtu(struct net_device *dev, int new_mtu)
 | 
				
			||||||
	return bnx2x_reload_if_running(dev);
 | 
						return bnx2x_reload_if_running(dev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32 bnx2x_fix_features(struct net_device *dev, u32 features)
 | 
					netdev_features_t bnx2x_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct bnx2x *bp = netdev_priv(dev);
 | 
						struct bnx2x *bp = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3409,7 +3410,7 @@ u32 bnx2x_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int bnx2x_set_features(struct net_device *dev, u32 features)
 | 
					int bnx2x_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct bnx2x *bp = netdev_priv(dev);
 | 
						struct bnx2x *bp = netdev_priv(dev);
 | 
				
			||||||
	u32 flags = bp->flags;
 | 
						u32 flags = bp->flags;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -533,8 +533,9 @@ int bnx2x_change_mtu(struct net_device *dev, int new_mtu);
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type);
 | 
					int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
u32 bnx2x_fix_features(struct net_device *dev, u32 features);
 | 
					netdev_features_t bnx2x_fix_features(struct net_device *dev,
 | 
				
			||||||
int bnx2x_set_features(struct net_device *dev, u32 features);
 | 
						netdev_features_t features);
 | 
				
			||||||
 | 
					int bnx2x_set_features(struct net_device *dev, netdev_features_t features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * bnx2x_tx_timeout - tx timeout netdev callback
 | 
					 * bnx2x_tx_timeout - tx timeout netdev callback
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6968,7 +6968,7 @@ static int tg3_phy_lpbk_set(struct tg3 *tp, u32 speed, bool extlpbk)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void tg3_set_loopback(struct net_device *dev, u32 features)
 | 
					static void tg3_set_loopback(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tg3 *tp = netdev_priv(dev);
 | 
						struct tg3 *tp = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6994,7 +6994,8 @@ static void tg3_set_loopback(struct net_device *dev, u32 features)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 tg3_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t tg3_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tg3 *tp = netdev_priv(dev);
 | 
						struct tg3 *tp = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7004,9 +7005,9 @@ static u32 tg3_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tg3_set_features(struct net_device *dev, u32 features)
 | 
					static int tg3_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((changed & NETIF_F_LOOPBACK) && netif_running(dev))
 | 
						if ((changed & NETIF_F_LOOPBACK) && netif_running(dev))
 | 
				
			||||||
		tg3_set_loopback(dev, features);
 | 
							tg3_set_loopback(dev, features);
 | 
				
			||||||
| 
						 | 
					@ -15313,7 +15314,7 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
 | 
				
			||||||
	u32 sndmbx, rcvmbx, intmbx;
 | 
						u32 sndmbx, rcvmbx, intmbx;
 | 
				
			||||||
	char str[40];
 | 
						char str[40];
 | 
				
			||||||
	u64 dma_mask, persist_dma_mask;
 | 
						u64 dma_mask, persist_dma_mask;
 | 
				
			||||||
	u32 features = 0;
 | 
						netdev_features_t features = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printk_once(KERN_INFO "%s\n", version);
 | 
						printk_once(KERN_INFO "%s\n", version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -850,7 +850,8 @@ static int t1_set_mac_addr(struct net_device *dev, void *p)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 t1_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t t1_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -864,9 +865,9 @@ static u32 t1_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int t1_set_features(struct net_device *dev, u32 features)
 | 
					static int t1_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
	struct adapter *adapter = dev->ml_priv;
 | 
						struct adapter *adapter = dev->ml_priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -742,7 +742,7 @@ static inline void setup_ring_params(struct adapter *adapter, u64 addr,
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Enable/disable VLAN acceleration.
 | 
					 * Enable/disable VLAN acceleration.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void t1_vlan_mode(struct adapter *adapter, u32 features)
 | 
					void t1_vlan_mode(struct adapter *adapter, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sge *sge = adapter->sge;
 | 
						struct sge *sge = adapter->sge;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -79,7 +79,7 @@ irqreturn_t t1_interrupt(int irq, void *cookie);
 | 
				
			||||||
int t1_poll(struct napi_struct *, int);
 | 
					int t1_poll(struct napi_struct *, int);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
netdev_tx_t t1_start_xmit(struct sk_buff *skb, struct net_device *dev);
 | 
					netdev_tx_t t1_start_xmit(struct sk_buff *skb, struct net_device *dev);
 | 
				
			||||||
void t1_vlan_mode(struct adapter *adapter, u32 features);
 | 
					void t1_vlan_mode(struct adapter *adapter, netdev_features_t features);
 | 
				
			||||||
void t1_sge_start(struct sge *);
 | 
					void t1_sge_start(struct sge *);
 | 
				
			||||||
void t1_sge_stop(struct sge *);
 | 
					void t1_sge_stop(struct sge *);
 | 
				
			||||||
int t1_sge_intr_error_handler(struct sge *);
 | 
					int t1_sge_intr_error_handler(struct sge *);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2532,7 +2532,7 @@ static void t3_synchronize_rx(struct adapter *adap, const struct port_info *p)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void cxgb_vlan_mode(struct net_device *dev, u32 features)
 | 
					static void cxgb_vlan_mode(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct port_info *pi = netdev_priv(dev);
 | 
						struct port_info *pi = netdev_priv(dev);
 | 
				
			||||||
	struct adapter *adapter = pi->adapter;
 | 
						struct adapter *adapter = pi->adapter;
 | 
				
			||||||
| 
						 | 
					@ -2553,7 +2553,8 @@ static void cxgb_vlan_mode(struct net_device *dev, u32 features)
 | 
				
			||||||
	t3_synchronize_rx(adapter, pi);
 | 
						t3_synchronize_rx(adapter, pi);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 cxgb_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t cxgb_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -2567,9 +2568,9 @@ static u32 cxgb_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int cxgb_set_features(struct net_device *dev, u32 features)
 | 
					static int cxgb_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		cxgb_vlan_mode(dev, features);
 | 
							cxgb_vlan_mode(dev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1856,10 +1856,10 @@ static int set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int cxgb_set_features(struct net_device *dev, u32 features)
 | 
					static int cxgb_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const struct port_info *pi = netdev_priv(dev);
 | 
						const struct port_info *pi = netdev_priv(dev);
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(changed & NETIF_F_HW_VLAN_RX))
 | 
						if (!(changed & NETIF_F_HW_VLAN_RX))
 | 
				
			||||||
| 
						 | 
					@ -3538,7 +3538,7 @@ static int __devinit init_one(struct pci_dev *pdev,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int func, i, err;
 | 
						int func, i, err;
 | 
				
			||||||
	struct port_info *pi;
 | 
						struct port_info *pi;
 | 
				
			||||||
	unsigned int highdma = 0;
 | 
						bool highdma = false;
 | 
				
			||||||
	struct adapter *adapter = NULL;
 | 
						struct adapter *adapter = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printk_once(KERN_INFO "%s - version %s\n", DRV_DESC, DRV_VERSION);
 | 
						printk_once(KERN_INFO "%s - version %s\n", DRV_DESC, DRV_VERSION);
 | 
				
			||||||
| 
						 | 
					@ -3564,7 +3564,7 @@ static int __devinit init_one(struct pci_dev *pdev,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
 | 
						if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
 | 
				
			||||||
		highdma = NETIF_F_HIGHDMA;
 | 
							highdma = true;
 | 
				
			||||||
		err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
 | 
							err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
 | 
				
			||||||
		if (err) {
 | 
							if (err) {
 | 
				
			||||||
			dev_err(&pdev->dev, "unable to obtain 64-bit DMA for "
 | 
								dev_err(&pdev->dev, "unable to obtain 64-bit DMA for "
 | 
				
			||||||
| 
						 | 
					@ -3638,7 +3638,9 @@ static int __devinit init_one(struct pci_dev *pdev,
 | 
				
			||||||
			NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
 | 
								NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
 | 
				
			||||||
			NETIF_F_RXCSUM | NETIF_F_RXHASH |
 | 
								NETIF_F_RXCSUM | NETIF_F_RXHASH |
 | 
				
			||||||
			NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 | 
								NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
 | 
				
			||||||
		netdev->features |= netdev->hw_features | highdma;
 | 
							if (highdma)
 | 
				
			||||||
 | 
								netdev->hw_features |= NETIF_F_HIGHDMA;
 | 
				
			||||||
 | 
							netdev->features |= netdev->hw_features;
 | 
				
			||||||
		netdev->vlan_features = netdev->features & VLAN_FEAT;
 | 
							netdev->vlan_features = netdev->features & VLAN_FEAT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		netdev->priv_flags |= IFF_UNICAST_FLT;
 | 
							netdev->priv_flags |= IFF_UNICAST_FLT;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1092,7 +1092,8 @@ static int cxgb4vf_change_mtu(struct net_device *dev, int new_mtu)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 cxgb4vf_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t cxgb4vf_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -1106,10 +1107,11 @@ static u32 cxgb4vf_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int cxgb4vf_set_features(struct net_device *dev, u32 features)
 | 
					static int cxgb4vf_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct port_info *pi = netdev_priv(dev);
 | 
						struct port_info *pi = netdev_priv(dev);
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		t4vf_set_rxmode(pi->adapter, pi->viid, -1, -1, -1, -1,
 | 
							t4vf_set_rxmode(pi->adapter, pi->viid, -1, -1, -1, -1,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -474,10 +474,11 @@ static int dm9000_nway_reset(struct net_device *dev)
 | 
				
			||||||
	return mii_nway_restart(&dm->mii);
 | 
						return mii_nway_restart(&dm->mii);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int dm9000_set_features(struct net_device *dev, u32 features)
 | 
					static int dm9000_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	board_info_t *dm = to_dm9000_board(dev);
 | 
						board_info_t *dm = to_dm9000_board(dev);
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(changed & NETIF_F_RXCSUM))
 | 
						if (!(changed & NETIF_F_RXCSUM))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2306,7 +2306,7 @@ void gfar_check_rx_parser_mode(struct gfar_private *priv)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Enables and disables VLAN insertion/extraction */
 | 
					/* Enables and disables VLAN insertion/extraction */
 | 
				
			||||||
void gfar_vlan_mode(struct net_device *dev, u32 features)
 | 
					void gfar_vlan_mode(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gfar_private *priv = netdev_priv(dev);
 | 
						struct gfar_private *priv = netdev_priv(dev);
 | 
				
			||||||
	struct gfar __iomem *regs = NULL;
 | 
						struct gfar __iomem *regs = NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1179,9 +1179,9 @@ extern void gfar_phy_test(struct mii_bus *bus, struct phy_device *phydev,
 | 
				
			||||||
extern void gfar_configure_coalescing(struct gfar_private *priv,
 | 
					extern void gfar_configure_coalescing(struct gfar_private *priv,
 | 
				
			||||||
		unsigned long tx_mask, unsigned long rx_mask);
 | 
							unsigned long tx_mask, unsigned long rx_mask);
 | 
				
			||||||
void gfar_init_sysfs(struct net_device *dev);
 | 
					void gfar_init_sysfs(struct net_device *dev);
 | 
				
			||||||
int gfar_set_features(struct net_device *dev, u32 features);
 | 
					int gfar_set_features(struct net_device *dev, netdev_features_t features);
 | 
				
			||||||
extern void gfar_check_rx_parser_mode(struct gfar_private *priv);
 | 
					extern void gfar_check_rx_parser_mode(struct gfar_private *priv);
 | 
				
			||||||
extern void gfar_vlan_mode(struct net_device *dev, u32 features);
 | 
					extern void gfar_vlan_mode(struct net_device *dev, netdev_features_t features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern const struct ethtool_ops gfar_ethtool_ops;
 | 
					extern const struct ethtool_ops gfar_ethtool_ops;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -519,12 +519,12 @@ static int gfar_sringparam(struct net_device *dev, struct ethtool_ringparam *rva
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int gfar_set_features(struct net_device *dev, u32 features)
 | 
					int gfar_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct gfar_private *priv = netdev_priv(dev);
 | 
						struct gfar_private *priv = netdev_priv(dev);
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	int err = 0, i = 0;
 | 
						int err = 0, i = 0;
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & (NETIF_F_HW_VLAN_TX|NETIF_F_HW_VLAN_RX))
 | 
						if (changed & (NETIF_F_HW_VLAN_TX|NETIF_F_HW_VLAN_RX))
 | 
				
			||||||
		gfar_vlan_mode(dev, features);
 | 
							gfar_vlan_mode(dev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -735,7 +735,8 @@ static void netdev_get_drvinfo(struct net_device *dev,
 | 
				
			||||||
		sizeof(info->version) - 1);
 | 
							sizeof(info->version) - 1);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 ibmveth_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t ibmveth_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since the ibmveth firmware interface does not have the
 | 
						 * Since the ibmveth firmware interface does not have the
 | 
				
			||||||
| 
						 | 
					@ -838,7 +839,8 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data)
 | 
				
			||||||
	return rc1 ? rc1 : rc2;
 | 
						return rc1 ? rc1 : rc2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ibmveth_set_features(struct net_device *dev, u32 features)
 | 
					static int ibmveth_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ibmveth_adapter *adapter = netdev_priv(dev);
 | 
						struct ibmveth_adapter *adapter = netdev_priv(dev);
 | 
				
			||||||
	int rx_csum = !!(features & NETIF_F_RXCSUM);
 | 
						int rx_csum = !!(features & NETIF_F_RXCSUM);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,7 +167,8 @@ static int e1000_82547_fifo_workaround(struct e1000_adapter *adapter,
 | 
				
			||||||
                                       struct sk_buff *skb);
 | 
					                                       struct sk_buff *skb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool e1000_vlan_used(struct e1000_adapter *adapter);
 | 
					static bool e1000_vlan_used(struct e1000_adapter *adapter);
 | 
				
			||||||
static void e1000_vlan_mode(struct net_device *netdev, u32 features);
 | 
					static void e1000_vlan_mode(struct net_device *netdev,
 | 
				
			||||||
 | 
								    netdev_features_t features);
 | 
				
			||||||
static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
 | 
					static void e1000_vlan_rx_add_vid(struct net_device *netdev, u16 vid);
 | 
				
			||||||
static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
 | 
					static void e1000_vlan_rx_kill_vid(struct net_device *netdev, u16 vid);
 | 
				
			||||||
static void e1000_restore_vlan(struct e1000_adapter *adapter);
 | 
					static void e1000_restore_vlan(struct e1000_adapter *adapter);
 | 
				
			||||||
| 
						 | 
					@ -806,7 +807,8 @@ static int e1000_is_need_ioport(struct pci_dev *pdev)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 e1000_fix_features(struct net_device *netdev, u32 features)
 | 
					static netdev_features_t e1000_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -820,10 +822,11 @@ static u32 e1000_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int e1000_set_features(struct net_device *netdev, u32 features)
 | 
					static int e1000_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct e1000_adapter *adapter = netdev_priv(netdev);
 | 
						struct e1000_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 changed = features ^ netdev->features;
 | 
						netdev_features_t changed = features ^ netdev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		e1000_vlan_mode(netdev, features);
 | 
							e1000_vlan_mode(netdev, features);
 | 
				
			||||||
| 
						 | 
					@ -4577,7 +4580,8 @@ static void e1000_vlan_filter_on_off(struct e1000_adapter *adapter,
 | 
				
			||||||
		e1000_irq_enable(adapter);
 | 
							e1000_irq_enable(adapter);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void e1000_vlan_mode(struct net_device *netdev, u32 features)
 | 
					static void e1000_vlan_mode(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct e1000_adapter *adapter = netdev_priv(netdev);
 | 
						struct e1000_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	struct e1000_hw *hw = &adapter->hw;
 | 
						struct e1000_hw *hw = &adapter->hw;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5859,10 +5859,11 @@ static void e1000_eeprom_checks(struct e1000_adapter *adapter)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int e1000_set_features(struct net_device *netdev, u32 features)
 | 
					static int e1000_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct e1000_adapter *adapter = netdev_priv(netdev);
 | 
						struct e1000_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 changed = features ^ netdev->features;
 | 
						netdev_features_t changed = features ^ netdev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & (NETIF_F_TSO | NETIF_F_TSO6))
 | 
						if (changed & (NETIF_F_TSO | NETIF_F_TSO6))
 | 
				
			||||||
		adapter->flags |= FLAG_TSO_FORCE;
 | 
							adapter->flags |= FLAG_TSO_FORCE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -145,7 +145,7 @@ static bool igb_clean_rx_irq(struct igb_q_vector *, int);
 | 
				
			||||||
static int igb_ioctl(struct net_device *, struct ifreq *, int cmd);
 | 
					static int igb_ioctl(struct net_device *, struct ifreq *, int cmd);
 | 
				
			||||||
static void igb_tx_timeout(struct net_device *);
 | 
					static void igb_tx_timeout(struct net_device *);
 | 
				
			||||||
static void igb_reset_task(struct work_struct *);
 | 
					static void igb_reset_task(struct work_struct *);
 | 
				
			||||||
static void igb_vlan_mode(struct net_device *netdev, u32 features);
 | 
					static void igb_vlan_mode(struct net_device *netdev, netdev_features_t features);
 | 
				
			||||||
static void igb_vlan_rx_add_vid(struct net_device *, u16);
 | 
					static void igb_vlan_rx_add_vid(struct net_device *, u16);
 | 
				
			||||||
static void igb_vlan_rx_kill_vid(struct net_device *, u16);
 | 
					static void igb_vlan_rx_kill_vid(struct net_device *, u16);
 | 
				
			||||||
static void igb_restore_vlan(struct igb_adapter *);
 | 
					static void igb_restore_vlan(struct igb_adapter *);
 | 
				
			||||||
| 
						 | 
					@ -1742,7 +1742,8 @@ void igb_reset(struct igb_adapter *adapter)
 | 
				
			||||||
	igb_get_phy_info(hw);
 | 
						igb_get_phy_info(hw);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 igb_fix_features(struct net_device *netdev, u32 features)
 | 
					static netdev_features_t igb_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -1756,9 +1757,10 @@ static u32 igb_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int igb_set_features(struct net_device *netdev, u32 features)
 | 
					static int igb_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = netdev->features ^ features;
 | 
						netdev_features_t changed = netdev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		igb_vlan_mode(netdev, features);
 | 
							igb_vlan_mode(netdev, features);
 | 
				
			||||||
| 
						 | 
					@ -6467,7 +6469,7 @@ s32 igb_write_pcie_cap_reg(struct e1000_hw *hw, u32 reg, u16 *value)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void igb_vlan_mode(struct net_device *netdev, u32 features)
 | 
					static void igb_vlan_mode(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct igb_adapter *adapter = netdev_priv(netdev);
 | 
						struct igb_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	struct e1000_hw *hw = &adapter->hw;
 | 
						struct e1000_hw *hw = &adapter->hw;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2532,7 +2532,8 @@ static void igbvf_print_device_info(struct igbvf_adapter *adapter)
 | 
				
			||||||
	dev_info(&pdev->dev, "Address: %pM\n", netdev->dev_addr);
 | 
						dev_info(&pdev->dev, "Address: %pM\n", netdev->dev_addr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int igbvf_set_features(struct net_device *netdev, u32 features)
 | 
					static int igbvf_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct igbvf_adapter *adapter = netdev_priv(netdev);
 | 
						struct igbvf_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -325,8 +325,8 @@ ixgb_reset(struct ixgb_adapter *adapter)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32
 | 
					static netdev_features_t
 | 
				
			||||||
ixgb_fix_features(struct net_device *netdev, u32 features)
 | 
					ixgb_fix_features(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Tx VLAN insertion does not work per HW design when Rx stripping is
 | 
						 * Tx VLAN insertion does not work per HW design when Rx stripping is
 | 
				
			||||||
| 
						 | 
					@ -339,10 +339,10 @@ ixgb_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
ixgb_set_features(struct net_device *netdev, u32 features)
 | 
					ixgb_set_features(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ixgb_adapter *adapter = netdev_priv(netdev);
 | 
						struct ixgb_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 changed = features ^ netdev->features;
 | 
						netdev_features_t changed = features ^ netdev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(changed & (NETIF_F_RXCSUM|NETIF_F_HW_VLAN_RX)))
 | 
						if (!(changed & (NETIF_F_RXCSUM|NETIF_F_HW_VLAN_RX)))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7174,7 +7174,8 @@ void ixgbe_do_reset(struct net_device *netdev)
 | 
				
			||||||
		ixgbe_reset(adapter);
 | 
							ixgbe_reset(adapter);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 ixgbe_fix_features(struct net_device *netdev, u32 data)
 | 
					static netdev_features_t ixgbe_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
 | 
						struct ixgbe_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7204,7 +7205,8 @@ static u32 ixgbe_fix_features(struct net_device *netdev, u32 data)
 | 
				
			||||||
	return data;
 | 
						return data;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ixgbe_set_features(struct net_device *netdev, u32 data)
 | 
					static int ixgbe_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ixgbe_adapter *adapter = netdev_priv(netdev);
 | 
						struct ixgbe_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	bool need_reset = false;
 | 
						bool need_reset = false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3249,7 +3249,8 @@ static struct rtnl_link_stats64 *ixgbevf_get_stats(struct net_device *netdev,
 | 
				
			||||||
	return stats;
 | 
						return stats;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int ixgbevf_set_features(struct net_device *netdev, u32 features)
 | 
					static int ixgbevf_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ixgbevf_adapter *adapter = netdev_priv(netdev);
 | 
						struct ixgbevf_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1917,7 +1917,7 @@ jme_map_tx_skb(struct jme_adapter *jme, struct sk_buff *skb, int idx)
 | 
				
			||||||
	struct jme_ring *txring = &(jme->txring[0]);
 | 
						struct jme_ring *txring = &(jme->txring[0]);
 | 
				
			||||||
	struct txdesc *txdesc = txring->desc, *ctxdesc;
 | 
						struct txdesc *txdesc = txring->desc, *ctxdesc;
 | 
				
			||||||
	struct jme_buffer_info *txbi = txring->bufinf, *ctxbi;
 | 
						struct jme_buffer_info *txbi = txring->bufinf, *ctxbi;
 | 
				
			||||||
	u8 hidma = jme->dev->features & NETIF_F_HIGHDMA;
 | 
						u8 hidma = !!(jme->dev->features & NETIF_F_HIGHDMA);
 | 
				
			||||||
	int i, nr_frags = skb_shinfo(skb)->nr_frags;
 | 
						int i, nr_frags = skb_shinfo(skb)->nr_frags;
 | 
				
			||||||
	int mask = jme->tx_ring_mask;
 | 
						int mask = jme->tx_ring_mask;
 | 
				
			||||||
	const struct skb_frag_struct *frag;
 | 
						const struct skb_frag_struct *frag;
 | 
				
			||||||
| 
						 | 
					@ -2620,8 +2620,8 @@ jme_set_msglevel(struct net_device *netdev, u32 value)
 | 
				
			||||||
	jme->msg_enable = value;
 | 
						jme->msg_enable = value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32
 | 
					static netdev_features_t
 | 
				
			||||||
jme_fix_features(struct net_device *netdev, u32 features)
 | 
					jme_fix_features(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (netdev->mtu > 1900)
 | 
						if (netdev->mtu > 1900)
 | 
				
			||||||
		features &= ~(NETIF_F_ALL_TSO | NETIF_F_ALL_CSUM);
 | 
							features &= ~(NETIF_F_ALL_TSO | NETIF_F_ALL_CSUM);
 | 
				
			||||||
| 
						 | 
					@ -2629,7 +2629,7 @@ jme_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
jme_set_features(struct net_device *netdev, u32 features)
 | 
					jme_set_features(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct jme_adapter *jme = netdev_priv(netdev);
 | 
						struct jme_adapter *jme = netdev_priv(netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1579,10 +1579,10 @@ mv643xx_eth_set_ringparam(struct net_device *dev, struct ethtool_ringparam *er)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
mv643xx_eth_set_features(struct net_device *dev, u32 features)
 | 
					mv643xx_eth_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct mv643xx_eth_private *mp = netdev_priv(dev);
 | 
						struct mv643xx_eth_private *mp = netdev_priv(dev);
 | 
				
			||||||
	u32 rx_csum = features & NETIF_F_RXCSUM;
 | 
						int rx_csum = !!(features & NETIF_F_RXCSUM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wrlp(mp, PORT_CONFIG, rx_csum ? 0x02000000 : 0x00000000);
 | 
						wrlp(mp, PORT_CONFIG, rx_csum ? 0x02000000 : 0x00000000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1275,7 +1275,7 @@ static void rx_set_checksum(struct sky2_port *sky2)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Enable/disable receive hash calculation (RSS) */
 | 
					/* Enable/disable receive hash calculation (RSS) */
 | 
				
			||||||
static void rx_set_rss(struct net_device *dev, u32 features)
 | 
					static void rx_set_rss(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sky2_port *sky2 = netdev_priv(dev);
 | 
						struct sky2_port *sky2 = netdev_priv(dev);
 | 
				
			||||||
	struct sky2_hw *hw = sky2->hw;
 | 
						struct sky2_hw *hw = sky2->hw;
 | 
				
			||||||
| 
						 | 
					@ -1396,7 +1396,7 @@ static int sky2_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define SKY2_VLAN_OFFLOADS (NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO)
 | 
					#define SKY2_VLAN_OFFLOADS (NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void sky2_vlan_mode(struct net_device *dev, u32 features)
 | 
					static void sky2_vlan_mode(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sky2_port *sky2 = netdev_priv(dev);
 | 
						struct sky2_port *sky2 = netdev_priv(dev);
 | 
				
			||||||
	struct sky2_hw *hw = sky2->hw;
 | 
						struct sky2_hw *hw = sky2->hw;
 | 
				
			||||||
| 
						 | 
					@ -4282,7 +4282,8 @@ static int sky2_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom
 | 
				
			||||||
	return sky2_vpd_write(sky2->hw, cap, data, eeprom->offset, eeprom->len);
 | 
						return sky2_vpd_write(sky2->hw, cap, data, eeprom->offset, eeprom->len);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 sky2_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t sky2_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	const struct sky2_port *sky2 = netdev_priv(dev);
 | 
						const struct sky2_port *sky2 = netdev_priv(dev);
 | 
				
			||||||
	const struct sky2_hw *hw = sky2->hw;
 | 
						const struct sky2_hw *hw = sky2->hw;
 | 
				
			||||||
| 
						 | 
					@ -4306,13 +4307,13 @@ static u32 sky2_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int sky2_set_features(struct net_device *dev, u32 features)
 | 
					static int sky2_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sky2_port *sky2 = netdev_priv(dev);
 | 
						struct sky2_port *sky2 = netdev_priv(dev);
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_RXCSUM) {
 | 
						if (changed & NETIF_F_RXCSUM) {
 | 
				
			||||||
		u32 on = features & NETIF_F_RXCSUM;
 | 
							int on = !!(features & NETIF_F_RXCSUM);
 | 
				
			||||||
		sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR),
 | 
							sky2_write32(sky2->hw, Q_ADDR(rxqaddr[sky2->port], Q_CSR),
 | 
				
			||||||
			     on ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
 | 
								     on ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6588,7 +6588,8 @@ static void netdev_get_ethtool_stats(struct net_device *dev,
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Return 0 if successful; otherwise an error code.
 | 
					 * Return 0 if successful; otherwise an error code.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int netdev_set_features(struct net_device *dev, u32 features)
 | 
					static int netdev_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct dev_priv *priv = netdev_priv(dev);
 | 
						struct dev_priv *priv = netdev_priv(dev);
 | 
				
			||||||
	struct dev_info *hw_priv = priv->adapter;
 | 
						struct dev_info *hw_priv = priv->adapter;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1491,7 +1491,7 @@ myri10ge_clean_rx_done(struct myri10ge_slice_state *ss, int budget)
 | 
				
			||||||
	 * access to avoid theoretical race condition with functions that
 | 
						 * access to avoid theoretical race condition with functions that
 | 
				
			||||||
	 * change NETIF_F_LRO flag at runtime.
 | 
						 * change NETIF_F_LRO flag at runtime.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	bool lro_enabled = ACCESS_ONCE(mgp->dev->features) & NETIF_F_LRO;
 | 
						bool lro_enabled = !!(ACCESS_ONCE(mgp->dev->features) & NETIF_F_LRO);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (rx_done->entry[idx].length != 0 && work_done < budget) {
 | 
						while (rx_done->entry[idx].length != 0 && work_done < budget) {
 | 
				
			||||||
		length = ntohs(rx_done->entry[idx].length);
 | 
							length = ntohs(rx_done->entry[idx].length);
 | 
				
			||||||
| 
						 | 
					@ -3149,7 +3149,8 @@ static int myri10ge_set_mac_address(struct net_device *dev, void *addr)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 myri10ge_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t myri10ge_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!(features & NETIF_F_RXCSUM))
 | 
						if (!(features & NETIF_F_RXCSUM))
 | 
				
			||||||
		features &= ~NETIF_F_LRO;
 | 
							features &= ~NETIF_F_LRO;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6616,10 +6616,10 @@ static void s2io_ethtool_get_strings(struct net_device *dev,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int s2io_set_features(struct net_device *dev, u32 features)
 | 
					static int s2io_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct s2io_nic *sp = netdev_priv(dev);
 | 
						struct s2io_nic *sp = netdev_priv(dev);
 | 
				
			||||||
	u32 changed = (features ^ dev->features) & NETIF_F_LRO;
 | 
						netdev_features_t changed = (features ^ dev->features) & NETIF_F_LRO;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed && netif_running(dev)) {
 | 
						if (changed && netif_running(dev)) {
 | 
				
			||||||
		int rc;
 | 
							int rc;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2662,9 +2662,10 @@ static void vxge_poll_vp_lockup(unsigned long data)
 | 
				
			||||||
	mod_timer(&vdev->vp_lockup_timer, jiffies + HZ / 1000);
 | 
						mod_timer(&vdev->vp_lockup_timer, jiffies + HZ / 1000);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 vxge_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t vxge_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Enabling RTH requires some of the logic in vxge_device_register and a
 | 
						/* Enabling RTH requires some of the logic in vxge_device_register and a
 | 
				
			||||||
	 * vpath reset.  Due to these restrictions, only allow modification
 | 
						 * vpath reset.  Due to these restrictions, only allow modification
 | 
				
			||||||
| 
						 | 
					@ -2676,10 +2677,10 @@ static u32 vxge_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int vxge_set_features(struct net_device *dev, u32 features)
 | 
					static int vxge_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct vxgedev *vdev = netdev_priv(dev);
 | 
						struct vxgedev *vdev = netdev_priv(dev);
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(changed & NETIF_F_RXHASH))
 | 
						if (!(changed & NETIF_F_RXHASH))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4536,7 +4536,7 @@ static int nv_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam*
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int nv_set_loopback(struct net_device *dev, u32 features)
 | 
					static int nv_set_loopback(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct fe_priv *np = netdev_priv(dev);
 | 
						struct fe_priv *np = netdev_priv(dev);
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
| 
						 | 
					@ -4591,7 +4591,8 @@ static int nv_set_loopback(struct net_device *dev, u32 features)
 | 
				
			||||||
	return retval;
 | 
						return retval;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 nv_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t nv_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* vlan is dependent on rx checksum offload */
 | 
						/* vlan is dependent on rx checksum offload */
 | 
				
			||||||
	if (features & (NETIF_F_HW_VLAN_TX|NETIF_F_HW_VLAN_RX))
 | 
						if (features & (NETIF_F_HW_VLAN_TX|NETIF_F_HW_VLAN_RX))
 | 
				
			||||||
| 
						 | 
					@ -4600,7 +4601,7 @@ static u32 nv_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void nv_vlan_mode(struct net_device *dev, u32 features)
 | 
					static void nv_vlan_mode(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct fe_priv *np = get_nvpriv(dev);
 | 
						struct fe_priv *np = get_nvpriv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4621,11 +4622,11 @@ static void nv_vlan_mode(struct net_device *dev, u32 features)
 | 
				
			||||||
	spin_unlock_irq(&np->lock);
 | 
						spin_unlock_irq(&np->lock);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int nv_set_features(struct net_device *dev, u32 features)
 | 
					static int nv_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct fe_priv *np = netdev_priv(dev);
 | 
						struct fe_priv *np = netdev_priv(dev);
 | 
				
			||||||
	u8 __iomem *base = get_hwbase(dev);
 | 
						u8 __iomem *base = get_hwbase(dev);
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						netdev_features_t changed = dev->features ^ features;
 | 
				
			||||||
	int retval;
 | 
						int retval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((changed & NETIF_F_LOOPBACK) && netif_running(dev)) {
 | 
						if ((changed & NETIF_F_LOOPBACK) && netif_running(dev)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2109,10 +2109,11 @@ static int pch_gbe_change_mtu(struct net_device *netdev, int new_mtu)
 | 
				
			||||||
 * Returns
 | 
					 * Returns
 | 
				
			||||||
 *	0:		HW state updated successfully
 | 
					 *	0:		HW state updated successfully
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int pch_gbe_set_features(struct net_device *netdev, u32 features)
 | 
					static int pch_gbe_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct pch_gbe_adapter *adapter = netdev_priv(netdev);
 | 
						struct pch_gbe_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 changed = features ^ netdev->features;
 | 
						netdev_features_t changed = features ^ netdev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(changed & NETIF_F_RXCSUM))
 | 
						if (!(changed & NETIF_F_RXCSUM))
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -544,7 +544,8 @@ static void netxen_set_multicast_list(struct net_device *dev)
 | 
				
			||||||
	adapter->set_multi(dev);
 | 
						adapter->set_multi(dev);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 netxen_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t netxen_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!(features & NETIF_F_RXCSUM)) {
 | 
						if (!(features & NETIF_F_RXCSUM)) {
 | 
				
			||||||
		netdev_info(dev, "disabling LRO as RXCSUM is off\n");
 | 
							netdev_info(dev, "disabling LRO as RXCSUM is off\n");
 | 
				
			||||||
| 
						 | 
					@ -555,7 +556,8 @@ static u32 netxen_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int netxen_set_features(struct net_device *dev, u32 features)
 | 
					static int netxen_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct netxen_adapter *adapter = netdev_priv(dev);
 | 
						struct netxen_adapter *adapter = netdev_priv(dev);
 | 
				
			||||||
	int hw_lro;
 | 
						int hw_lro;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1466,8 +1466,9 @@ void qlcnic_advert_link_change(struct qlcnic_adapter *adapter, int linkup);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
 | 
					int qlcnic_fw_cmd_set_mtu(struct qlcnic_adapter *adapter, int mtu);
 | 
				
			||||||
int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
 | 
					int qlcnic_change_mtu(struct net_device *netdev, int new_mtu);
 | 
				
			||||||
u32 qlcnic_fix_features(struct net_device *netdev, u32 features);
 | 
					netdev_features_t qlcnic_fix_features(struct net_device *netdev,
 | 
				
			||||||
int qlcnic_set_features(struct net_device *netdev, u32 features);
 | 
						netdev_features_t features);
 | 
				
			||||||
 | 
					int qlcnic_set_features(struct net_device *netdev, netdev_features_t features);
 | 
				
			||||||
int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter, int enable);
 | 
					int qlcnic_config_hw_lro(struct qlcnic_adapter *adapter, int enable);
 | 
				
			||||||
int qlcnic_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable);
 | 
					int qlcnic_config_bridged_mode(struct qlcnic_adapter *adapter, u32 enable);
 | 
				
			||||||
int qlcnic_send_lro_cleanup(struct qlcnic_adapter *adapter);
 | 
					int qlcnic_send_lro_cleanup(struct qlcnic_adapter *adapter);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -817,12 +817,13 @@ int qlcnic_change_mtu(struct net_device *netdev, int mtu)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32 qlcnic_fix_features(struct net_device *netdev, u32 features)
 | 
					netdev_features_t qlcnic_fix_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
 | 
						struct qlcnic_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
 | 
						if ((adapter->flags & QLCNIC_ESWITCH_ENABLED)) {
 | 
				
			||||||
		u32 changed = features ^ netdev->features;
 | 
							netdev_features_t changed = features ^ netdev->features;
 | 
				
			||||||
		features ^= changed & (NETIF_F_ALL_CSUM | NETIF_F_RXCSUM);
 | 
							features ^= changed & (NETIF_F_ALL_CSUM | NETIF_F_RXCSUM);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -833,10 +834,10 @@ u32 qlcnic_fix_features(struct net_device *netdev, u32 features)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int qlcnic_set_features(struct net_device *netdev, u32 features)
 | 
					int qlcnic_set_features(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct qlcnic_adapter *adapter = netdev_priv(netdev);
 | 
						struct qlcnic_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	u32 changed = netdev->features ^ features;
 | 
						netdev_features_t changed = netdev->features ^ features;
 | 
				
			||||||
	int hw_lro = (features & NETIF_F_LRO) ? QLCNIC_LRO_ENABLED : 0;
 | 
						int hw_lro = (features & NETIF_F_LRO) ? QLCNIC_LRO_ENABLED : 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(changed & NETIF_F_LRO))
 | 
						if (!(changed & NETIF_F_LRO))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -792,7 +792,7 @@ qlcnic_set_netdev_features(struct qlcnic_adapter *adapter,
 | 
				
			||||||
		struct qlcnic_esw_func_cfg *esw_cfg)
 | 
							struct qlcnic_esw_func_cfg *esw_cfg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct net_device *netdev = adapter->netdev;
 | 
						struct net_device *netdev = adapter->netdev;
 | 
				
			||||||
	unsigned long features, vlan_features;
 | 
						netdev_features_t features, vlan_features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	features = (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
 | 
						features = (NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_RXCSUM |
 | 
				
			||||||
			NETIF_F_IPV6_CSUM | NETIF_F_GRO);
 | 
								NETIF_F_IPV6_CSUM | NETIF_F_GRO);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2307,7 +2307,7 @@ static int ql_napi_poll_msix(struct napi_struct *napi, int budget)
 | 
				
			||||||
	return work_done;
 | 
						return work_done;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void qlge_vlan_mode(struct net_device *ndev, u32 features)
 | 
					static void qlge_vlan_mode(struct net_device *ndev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ql_adapter *qdev = netdev_priv(ndev);
 | 
						struct ql_adapter *qdev = netdev_priv(ndev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2323,7 +2323,8 @@ static void qlge_vlan_mode(struct net_device *ndev, u32 features)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 qlge_fix_features(struct net_device *ndev, u32 features)
 | 
					static netdev_features_t qlge_fix_features(struct net_device *ndev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Since there is no support for separate rx/tx vlan accel
 | 
						 * Since there is no support for separate rx/tx vlan accel
 | 
				
			||||||
| 
						 | 
					@ -2337,9 +2338,10 @@ static u32 qlge_fix_features(struct net_device *ndev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int qlge_set_features(struct net_device *ndev, u32 features)
 | 
					static int qlge_set_features(struct net_device *ndev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 changed = ndev->features ^ features;
 | 
						netdev_features_t changed = ndev->features ^ features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & NETIF_F_HW_VLAN_RX)
 | 
						if (changed & NETIF_F_HW_VLAN_RX)
 | 
				
			||||||
		qlge_vlan_mode(ndev, features);
 | 
							qlge_vlan_mode(ndev, features);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1392,7 +1392,7 @@ static void cp_set_msglevel(struct net_device *dev, u32 value)
 | 
				
			||||||
	cp->msg_enable = value;
 | 
						cp->msg_enable = value;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int cp_set_features(struct net_device *dev, u32 features)
 | 
					static int cp_set_features(struct net_device *dev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct cp_private *cp = netdev_priv(dev);
 | 
						struct cp_private *cp = netdev_priv(dev);
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1553,7 +1553,8 @@ static int rtl8169_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 rtl8169_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t rtl8169_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct rtl8169_private *tp = netdev_priv(dev);
 | 
						struct rtl8169_private *tp = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1567,7 +1568,8 @@ static u32 rtl8169_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int rtl8169_set_features(struct net_device *dev, u32 features)
 | 
					static int rtl8169_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct rtl8169_private *tp = netdev_priv(dev);
 | 
						struct rtl8169_private *tp = netdev_priv(dev);
 | 
				
			||||||
	void __iomem *ioaddr = tp->mmio_addr;
 | 
						void __iomem *ioaddr = tp->mmio_addr;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1900,7 +1900,7 @@ static void efx_set_multicast_list(struct net_device *net_dev)
 | 
				
			||||||
	/* Otherwise efx_start_port() will do this */
 | 
						/* Otherwise efx_start_port() will do this */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int efx_set_features(struct net_device *net_dev, u32 data)
 | 
					static int efx_set_features(struct net_device *net_dev, netdev_features_t data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct efx_nic *efx = netdev_priv(net_dev);
 | 
						struct efx_nic *efx = netdev_priv(net_dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -908,7 +908,7 @@ struct efx_nic_type {
 | 
				
			||||||
	unsigned int phys_addr_channels;
 | 
						unsigned int phys_addr_channels;
 | 
				
			||||||
	unsigned int tx_dc_base;
 | 
						unsigned int tx_dc_base;
 | 
				
			||||||
	unsigned int rx_dc_base;
 | 
						unsigned int rx_dc_base;
 | 
				
			||||||
	u32 offload_features;
 | 
						netdev_features_t offload_features;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**************************************************************************
 | 
					/**************************************************************************
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1419,7 +1419,8 @@ static int stmmac_change_mtu(struct net_device *dev, int new_mtu)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 stmmac_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t stmmac_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct stmmac_priv *priv = netdev_priv(dev);
 | 
						struct stmmac_priv *priv = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,7 +123,7 @@ struct tun_struct {
 | 
				
			||||||
	gid_t			group;
 | 
						gid_t			group;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct net_device	*dev;
 | 
						struct net_device	*dev;
 | 
				
			||||||
	u32			set_features;
 | 
						netdev_features_t	set_features;
 | 
				
			||||||
#define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \
 | 
					#define TUN_USER_FEATURES (NETIF_F_HW_CSUM|NETIF_F_TSO_ECN|NETIF_F_TSO| \
 | 
				
			||||||
			  NETIF_F_TSO6|NETIF_F_UFO)
 | 
								  NETIF_F_TSO6|NETIF_F_UFO)
 | 
				
			||||||
	struct fasync_struct	*fasync;
 | 
						struct fasync_struct	*fasync;
 | 
				
			||||||
| 
						 | 
					@ -454,7 +454,8 @@ tun_net_change_mtu(struct net_device *dev, int new_mtu)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 tun_net_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t tun_net_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tun_struct *tun = netdev_priv(dev);
 | 
						struct tun_struct *tun = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1196,7 +1197,7 @@ static int tun_get_iff(struct net *net, struct tun_struct *tun,
 | 
				
			||||||
 * privs required. */
 | 
					 * privs required. */
 | 
				
			||||||
static int set_offload(struct tun_struct *tun, unsigned long arg)
 | 
					static int set_offload(struct tun_struct *tun, unsigned long arg)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 features = 0;
 | 
						netdev_features_t features = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (arg & TUN_F_CSUM) {
 | 
						if (arg & TUN_F_CSUM) {
 | 
				
			||||||
		features |= NETIF_F_HW_CSUM;
 | 
							features |= NETIF_F_HW_CSUM;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -728,7 +728,8 @@ static int smsc75xx_change_mtu(struct net_device *netdev, int new_mtu)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Enable or disable Rx checksum offload engine */
 | 
					/* Enable or disable Rx checksum offload engine */
 | 
				
			||||||
static int smsc75xx_set_features(struct net_device *netdev, u32 features)
 | 
					static int smsc75xx_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct usbnet *dev = netdev_priv(netdev);
 | 
						struct usbnet *dev = netdev_priv(netdev);
 | 
				
			||||||
	struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
 | 
						struct smsc75xx_priv *pdata = (struct smsc75xx_priv *)(dev->data[0]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -516,7 +516,8 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Enable or disable Tx & Rx checksum offload engines */
 | 
					/* Enable or disable Tx & Rx checksum offload engines */
 | 
				
			||||||
static int smsc95xx_set_features(struct net_device *netdev, u32 features)
 | 
					static int smsc95xx_set_features(struct net_device *netdev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct usbnet *dev = netdev_priv(netdev);
 | 
						struct usbnet *dev = netdev_priv(netdev);
 | 
				
			||||||
	u32 read_buf;
 | 
						u32 read_buf;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -262,11 +262,11 @@ vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int vmxnet3_set_features(struct net_device *netdev, u32 features)
 | 
					int vmxnet3_set_features(struct net_device *netdev, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct vmxnet3_adapter *adapter = netdev_priv(netdev);
 | 
						struct vmxnet3_adapter *adapter = netdev_priv(netdev);
 | 
				
			||||||
	unsigned long flags;
 | 
						unsigned long flags;
 | 
				
			||||||
	u32 changed = features ^ netdev->features;
 | 
						netdev_features_t changed = features ^ netdev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (changed & (NETIF_F_RXCSUM | NETIF_F_LRO | NETIF_F_HW_VLAN_RX)) {
 | 
						if (changed & (NETIF_F_RXCSUM | NETIF_F_LRO | NETIF_F_HW_VLAN_RX)) {
 | 
				
			||||||
		if (features & NETIF_F_RXCSUM)
 | 
							if (features & NETIF_F_RXCSUM)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -401,7 +401,7 @@ void
 | 
				
			||||||
vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter);
 | 
					vmxnet3_rq_destroy_all(struct vmxnet3_adapter *adapter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
vmxnet3_set_features(struct net_device *netdev, u32 features);
 | 
					vmxnet3_set_features(struct net_device *netdev, netdev_features_t features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
vmxnet3_create_queues(struct vmxnet3_adapter *adapter,
 | 
					vmxnet3_create_queues(struct vmxnet3_adapter *adapter,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -165,7 +165,8 @@ static int xenvif_change_mtu(struct net_device *dev, int mtu)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 xenvif_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t xenvif_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct xenvif *vif = netdev_priv(dev);
 | 
						struct xenvif *vif = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -203,7 +203,7 @@ static void xennet_sysfs_delif(struct net_device *netdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int xennet_can_sg(struct net_device *dev)
 | 
					static int xennet_can_sg(struct net_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return dev->features & NETIF_F_SG;
 | 
						return !!(dev->features & NETIF_F_SG);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1190,7 +1190,8 @@ static void xennet_uninit(struct net_device *dev)
 | 
				
			||||||
	gnttab_free_grant_references(np->gref_rx_head);
 | 
						gnttab_free_grant_references(np->gref_rx_head);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 xennet_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t xennet_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct netfront_info *np = netdev_priv(dev);
 | 
						struct netfront_info *np = netdev_priv(dev);
 | 
				
			||||||
	int val;
 | 
						int val;
 | 
				
			||||||
| 
						 | 
					@ -1216,7 +1217,8 @@ static u32 xennet_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int xennet_set_features(struct net_device *dev, u32 features)
 | 
					static int xennet_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) {
 | 
						if (!(features & NETIF_F_SG) && dev->mtu > ETH_DATA_LEN) {
 | 
				
			||||||
		netdev_info(dev, "Reducing MTU because no SG offload");
 | 
							netdev_info(dev, "Reducing MTU because no SG offload");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3202,7 +3202,8 @@ static int qeth_l3_stop(struct net_device *dev)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 qeth_l3_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t qeth_l3_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct qeth_card *card = dev->ml_priv;
 | 
						struct qeth_card *card = dev->ml_priv;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3216,7 +3217,8 @@ static u32 qeth_l3_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int qeth_l3_set_features(struct net_device *dev, u32 features)
 | 
					static int qeth_l3_set_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct qeth_card *card = dev->ml_priv;
 | 
						struct qeth_card *card = dev->ml_priv;
 | 
				
			||||||
	u32 changed = dev->features ^ features;
 | 
						u32 changed = dev->features ^ features;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,10 @@
 | 
				
			||||||
#ifndef _LINUX_NETDEV_FEATURES_H
 | 
					#ifndef _LINUX_NETDEV_FEATURES_H
 | 
				
			||||||
#define _LINUX_NETDEV_FEATURES_H
 | 
					#define _LINUX_NETDEV_FEATURES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef u32 netdev_features_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Net device feature bits; if you change something,
 | 
					/* Net device feature bits; if you change something,
 | 
				
			||||||
 * also update netdev_features_strings[] in ethtool.c */
 | 
					 * also update netdev_features_strings[] in ethtool.c */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -847,12 +847,13 @@ struct netdev_tc_txq {
 | 
				
			||||||
 *	Called to release previously enslaved netdev.
 | 
					 *	Called to release previously enslaved netdev.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 *      Feature/offload setting functions.
 | 
					 *      Feature/offload setting functions.
 | 
				
			||||||
 * u32 (*ndo_fix_features)(struct net_device *dev, u32 features);
 | 
					 * netdev_features_t (*ndo_fix_features)(struct net_device *dev,
 | 
				
			||||||
 | 
					 *		netdev_features_t features);
 | 
				
			||||||
 *	Adjusts the requested feature flags according to device-specific
 | 
					 *	Adjusts the requested feature flags according to device-specific
 | 
				
			||||||
 *	constraints, and returns the resulting flags. Must not modify
 | 
					 *	constraints, and returns the resulting flags. Must not modify
 | 
				
			||||||
 *	the device state.
 | 
					 *	the device state.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * int (*ndo_set_features)(struct net_device *dev, u32 features);
 | 
					 * int (*ndo_set_features)(struct net_device *dev, netdev_features_t features);
 | 
				
			||||||
 *	Called to update device configuration to new features. Passed
 | 
					 *	Called to update device configuration to new features. Passed
 | 
				
			||||||
 *	feature set might be less than what was returned by ndo_fix_features()).
 | 
					 *	feature set might be less than what was returned by ndo_fix_features()).
 | 
				
			||||||
 *	Must return >0 or -errno if it changed dev->features itself.
 | 
					 *	Must return >0 or -errno if it changed dev->features itself.
 | 
				
			||||||
| 
						 | 
					@ -946,10 +947,10 @@ struct net_device_ops {
 | 
				
			||||||
						 struct net_device *slave_dev);
 | 
											 struct net_device *slave_dev);
 | 
				
			||||||
	int			(*ndo_del_slave)(struct net_device *dev,
 | 
						int			(*ndo_del_slave)(struct net_device *dev,
 | 
				
			||||||
						 struct net_device *slave_dev);
 | 
											 struct net_device *slave_dev);
 | 
				
			||||||
	u32			(*ndo_fix_features)(struct net_device *dev,
 | 
						netdev_features_t	(*ndo_fix_features)(struct net_device *dev,
 | 
				
			||||||
						    u32 features);
 | 
											    netdev_features_t features);
 | 
				
			||||||
	int			(*ndo_set_features)(struct net_device *dev,
 | 
						int			(*ndo_set_features)(struct net_device *dev,
 | 
				
			||||||
						    u32 features);
 | 
											    netdev_features_t features);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -999,13 +1000,13 @@ struct net_device {
 | 
				
			||||||
	struct list_head	unreg_list;
 | 
						struct list_head	unreg_list;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* currently active device features */
 | 
						/* currently active device features */
 | 
				
			||||||
	u32			features;
 | 
						netdev_features_t	features;
 | 
				
			||||||
	/* user-changeable features */
 | 
						/* user-changeable features */
 | 
				
			||||||
	u32			hw_features;
 | 
						netdev_features_t	hw_features;
 | 
				
			||||||
	/* user-requested features */
 | 
						/* user-requested features */
 | 
				
			||||||
	u32			wanted_features;
 | 
						netdev_features_t	wanted_features;
 | 
				
			||||||
	/* mask of features inheritable by VLAN devices */
 | 
						/* mask of features inheritable by VLAN devices */
 | 
				
			||||||
	u32			vlan_features;
 | 
						netdev_features_t	vlan_features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Interface index. Unique device identifier	*/
 | 
						/* Interface index. Unique device identifier	*/
 | 
				
			||||||
	int			ifindex;
 | 
						int			ifindex;
 | 
				
			||||||
| 
						 | 
					@ -1439,7 +1440,7 @@ struct packet_type {
 | 
				
			||||||
					 struct packet_type *,
 | 
										 struct packet_type *,
 | 
				
			||||||
					 struct net_device *);
 | 
										 struct net_device *);
 | 
				
			||||||
	struct sk_buff		*(*gso_segment)(struct sk_buff *skb,
 | 
						struct sk_buff		*(*gso_segment)(struct sk_buff *skb,
 | 
				
			||||||
						u32 features);
 | 
											netdev_features_t features);
 | 
				
			||||||
	int			(*gso_send_check)(struct sk_buff *skb);
 | 
						int			(*gso_send_check)(struct sk_buff *skb);
 | 
				
			||||||
	struct sk_buff		**(*gro_receive)(struct sk_buff **head,
 | 
						struct sk_buff		**(*gro_receive)(struct sk_buff **head,
 | 
				
			||||||
					       struct sk_buff *skb);
 | 
										       struct sk_buff *skb);
 | 
				
			||||||
| 
						 | 
					@ -2444,7 +2445,8 @@ extern int		netdev_set_master(struct net_device *dev, struct net_device *master)
 | 
				
			||||||
extern int netdev_set_bond_master(struct net_device *dev,
 | 
					extern int netdev_set_bond_master(struct net_device *dev,
 | 
				
			||||||
				  struct net_device *master);
 | 
									  struct net_device *master);
 | 
				
			||||||
extern int skb_checksum_help(struct sk_buff *skb);
 | 
					extern int skb_checksum_help(struct sk_buff *skb);
 | 
				
			||||||
extern struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features);
 | 
					extern struct sk_buff *skb_gso_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features);
 | 
				
			||||||
#ifdef CONFIG_BUG
 | 
					#ifdef CONFIG_BUG
 | 
				
			||||||
extern void netdev_rx_csum_fault(struct net_device *dev);
 | 
					extern void netdev_rx_csum_fault(struct net_device *dev);
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
| 
						 | 
					@ -2471,11 +2473,13 @@ extern const char *netdev_drivername(const struct net_device *dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void linkwatch_run_queue(void);
 | 
					extern void linkwatch_run_queue(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline u32 netdev_get_wanted_features(struct net_device *dev)
 | 
					static inline netdev_features_t netdev_get_wanted_features(
 | 
				
			||||||
 | 
						struct net_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return (dev->features & ~dev->hw_features) | dev->wanted_features;
 | 
						return (dev->features & ~dev->hw_features) | dev->wanted_features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
u32 netdev_increment_features(u32 all, u32 one, u32 mask);
 | 
					netdev_features_t netdev_increment_features(netdev_features_t all,
 | 
				
			||||||
 | 
						netdev_features_t one, netdev_features_t mask);
 | 
				
			||||||
int __netdev_update_features(struct net_device *dev);
 | 
					int __netdev_update_features(struct net_device *dev);
 | 
				
			||||||
void netdev_update_features(struct net_device *dev);
 | 
					void netdev_update_features(struct net_device *dev);
 | 
				
			||||||
void netdev_change_features(struct net_device *dev);
 | 
					void netdev_change_features(struct net_device *dev);
 | 
				
			||||||
| 
						 | 
					@ -2483,21 +2487,22 @@ void netdev_change_features(struct net_device *dev);
 | 
				
			||||||
void netif_stacked_transfer_operstate(const struct net_device *rootdev,
 | 
					void netif_stacked_transfer_operstate(const struct net_device *rootdev,
 | 
				
			||||||
					struct net_device *dev);
 | 
										struct net_device *dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32 netif_skb_features(struct sk_buff *skb);
 | 
					netdev_features_t netif_skb_features(struct sk_buff *skb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int net_gso_ok(u32 features, int gso_type)
 | 
					static inline int net_gso_ok(netdev_features_t features, int gso_type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int feature = gso_type << NETIF_F_GSO_SHIFT;
 | 
						netdev_features_t feature = gso_type << NETIF_F_GSO_SHIFT;
 | 
				
			||||||
	return (features & feature) == feature;
 | 
						return (features & feature) == feature;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int skb_gso_ok(struct sk_buff *skb, u32 features)
 | 
					static inline int skb_gso_ok(struct sk_buff *skb, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
 | 
						return net_gso_ok(features, skb_shinfo(skb)->gso_type) &&
 | 
				
			||||||
	       (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST));
 | 
						       (!skb_has_frag_list(skb) || (features & NETIF_F_FRAGLIST));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline int netif_needs_gso(struct sk_buff *skb, int features)
 | 
					static inline int netif_needs_gso(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return skb_is_gso(skb) && (!skb_gso_ok(skb, features) ||
 | 
						return skb_is_gso(skb) && (!skb_gso_ok(skb, features) ||
 | 
				
			||||||
		unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
 | 
							unlikely(skb->ip_summed != CHECKSUM_PARTIAL));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -30,6 +30,7 @@
 | 
				
			||||||
#include <linux/dmaengine.h>
 | 
					#include <linux/dmaengine.h>
 | 
				
			||||||
#include <linux/hrtimer.h>
 | 
					#include <linux/hrtimer.h>
 | 
				
			||||||
#include <linux/dma-mapping.h>
 | 
					#include <linux/dma-mapping.h>
 | 
				
			||||||
 | 
					#include <linux/netdev_features.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Don't change this without changing skb_csum_unnecessary! */
 | 
					/* Don't change this without changing skb_csum_unnecessary! */
 | 
				
			||||||
#define CHECKSUM_NONE 0
 | 
					#define CHECKSUM_NONE 0
 | 
				
			||||||
| 
						 | 
					@ -2106,7 +2107,8 @@ extern void	       skb_split(struct sk_buff *skb,
 | 
				
			||||||
extern int	       skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
 | 
					extern int	       skb_shift(struct sk_buff *tgt, struct sk_buff *skb,
 | 
				
			||||||
				 int shiftlen);
 | 
									 int shiftlen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern struct sk_buff *skb_segment(struct sk_buff *skb, u32 features);
 | 
					extern struct sk_buff *skb_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
									   netdev_features_t features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
 | 
					static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
 | 
				
			||||||
				       int len, void *buffer)
 | 
									       int len, void *buffer)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -38,7 +38,7 @@ struct net_protocol {
 | 
				
			||||||
	void			(*err_handler)(struct sk_buff *skb, u32 info);
 | 
						void			(*err_handler)(struct sk_buff *skb, u32 info);
 | 
				
			||||||
	int			(*gso_send_check)(struct sk_buff *skb);
 | 
						int			(*gso_send_check)(struct sk_buff *skb);
 | 
				
			||||||
	struct sk_buff	       *(*gso_segment)(struct sk_buff *skb,
 | 
						struct sk_buff	       *(*gso_segment)(struct sk_buff *skb,
 | 
				
			||||||
					       u32 features);
 | 
										       netdev_features_t features);
 | 
				
			||||||
	struct sk_buff	      **(*gro_receive)(struct sk_buff **head,
 | 
						struct sk_buff	      **(*gro_receive)(struct sk_buff **head,
 | 
				
			||||||
					       struct sk_buff *skb);
 | 
										       struct sk_buff *skb);
 | 
				
			||||||
	int			(*gro_complete)(struct sk_buff *skb);
 | 
						int			(*gro_complete)(struct sk_buff *skb);
 | 
				
			||||||
| 
						 | 
					@ -57,7 +57,7 @@ struct inet6_protocol {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int	(*gso_send_check)(struct sk_buff *skb);
 | 
						int	(*gso_send_check)(struct sk_buff *skb);
 | 
				
			||||||
	struct sk_buff *(*gso_segment)(struct sk_buff *skb,
 | 
						struct sk_buff *(*gso_segment)(struct sk_buff *skb,
 | 
				
			||||||
				       u32 features);
 | 
									       netdev_features_t features);
 | 
				
			||||||
	struct sk_buff **(*gro_receive)(struct sk_buff **head,
 | 
						struct sk_buff **(*gro_receive)(struct sk_buff **head,
 | 
				
			||||||
					struct sk_buff *skb);
 | 
										struct sk_buff *skb);
 | 
				
			||||||
	int	(*gro_complete)(struct sk_buff *skb);
 | 
						int	(*gro_complete)(struct sk_buff *skb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -306,8 +306,8 @@ struct sock {
 | 
				
			||||||
	kmemcheck_bitfield_end(flags);
 | 
						kmemcheck_bitfield_end(flags);
 | 
				
			||||||
	int			sk_wmem_queued;
 | 
						int			sk_wmem_queued;
 | 
				
			||||||
	gfp_t			sk_allocation;
 | 
						gfp_t			sk_allocation;
 | 
				
			||||||
	int			sk_route_caps;
 | 
						netdev_features_t	sk_route_caps;
 | 
				
			||||||
	int			sk_route_nocaps;
 | 
						netdev_features_t	sk_route_nocaps;
 | 
				
			||||||
	int			sk_gso_type;
 | 
						int			sk_gso_type;
 | 
				
			||||||
	unsigned int		sk_gso_max_size;
 | 
						unsigned int		sk_gso_max_size;
 | 
				
			||||||
	int			sk_rcvlowat;
 | 
						int			sk_rcvlowat;
 | 
				
			||||||
| 
						 | 
					@ -1393,7 +1393,7 @@ static inline int sk_can_gso(const struct sock *sk)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern void sk_setup_caps(struct sock *sk, struct dst_entry *dst);
 | 
					extern void sk_setup_caps(struct sock *sk, struct dst_entry *dst);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void sk_nocaps_add(struct sock *sk, int flags)
 | 
					static inline void sk_nocaps_add(struct sock *sk, netdev_features_t flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	sk->sk_route_nocaps |= flags;
 | 
						sk->sk_route_nocaps |= flags;
 | 
				
			||||||
	sk->sk_route_caps &= ~flags;
 | 
						sk->sk_route_caps &= ~flags;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1430,7 +1430,8 @@ extern struct request_sock_ops tcp6_request_sock_ops;
 | 
				
			||||||
extern void tcp_v4_destroy_sock(struct sock *sk);
 | 
					extern void tcp_v4_destroy_sock(struct sock *sk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int tcp_v4_gso_send_check(struct sk_buff *skb);
 | 
					extern int tcp_v4_gso_send_check(struct sk_buff *skb);
 | 
				
			||||||
extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb, u32 features);
 | 
					extern struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
									       netdev_features_t features);
 | 
				
			||||||
extern struct sk_buff **tcp_gro_receive(struct sk_buff **head,
 | 
					extern struct sk_buff **tcp_gro_receive(struct sk_buff **head,
 | 
				
			||||||
					struct sk_buff *skb);
 | 
										struct sk_buff *skb);
 | 
				
			||||||
extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head,
 | 
					extern struct sk_buff **tcp4_gro_receive(struct sk_buff **head,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -258,5 +258,6 @@ extern void udp4_proc_exit(void);
 | 
				
			||||||
extern void udp_init(void);
 | 
					extern void udp_init(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern int udp4_ufo_send_check(struct sk_buff *skb);
 | 
					extern int udp4_ufo_send_check(struct sk_buff *skb);
 | 
				
			||||||
extern struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, u32 features);
 | 
					extern struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features);
 | 
				
			||||||
#endif	/* _UDP_H */
 | 
					#endif	/* _UDP_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -777,6 +777,18 @@ char *uuid_string(char *buf, char *end, const u8 *addr,
 | 
				
			||||||
	return string(buf, end, uuid, spec);
 | 
						return string(buf, end, uuid, spec);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static
 | 
				
			||||||
 | 
					char *netdev_feature_string(char *buf, char *end, const u8 *addr,
 | 
				
			||||||
 | 
							      struct printf_spec spec)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						spec.flags |= SPECIAL | SMALL | ZEROPAD;
 | 
				
			||||||
 | 
						if (spec.field_width == -1)
 | 
				
			||||||
 | 
							spec.field_width = 2 + 2 * sizeof(netdev_features_t);
 | 
				
			||||||
 | 
						spec.base = 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return number(buf, end, *(const netdev_features_t *)addr, spec);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int kptr_restrict __read_mostly;
 | 
					int kptr_restrict __read_mostly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					@ -824,6 +836,7 @@ int kptr_restrict __read_mostly;
 | 
				
			||||||
 *       Do not use this feature without some mechanism to verify the
 | 
					 *       Do not use this feature without some mechanism to verify the
 | 
				
			||||||
 *       correctness of the format string and va_list arguments.
 | 
					 *       correctness of the format string and va_list arguments.
 | 
				
			||||||
 * - 'K' For a kernel pointer that should be hidden from unprivileged users
 | 
					 * - 'K' For a kernel pointer that should be hidden from unprivileged users
 | 
				
			||||||
 | 
					 * - 'NF' For a netdev_features_t
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Note: The difference between 'S' and 'F' is that on ia64 and ppc64
 | 
					 * Note: The difference between 'S' and 'F' is that on ia64 and ppc64
 | 
				
			||||||
 * function pointers are really function descriptors, which contain a
 | 
					 * function pointers are really function descriptors, which contain a
 | 
				
			||||||
| 
						 | 
					@ -896,6 +909,12 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
 | 
				
			||||||
		       has_capability_noaudit(current, CAP_SYSLOG))))
 | 
							       has_capability_noaudit(current, CAP_SYSLOG))))
 | 
				
			||||||
			ptr = NULL;
 | 
								ptr = NULL;
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case 'N':
 | 
				
			||||||
 | 
							switch (fmt[1]) {
 | 
				
			||||||
 | 
							case 'F':
 | 
				
			||||||
 | 
								return netdev_feature_string(buf, end, ptr, spec);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	spec.flags |= SMALL;
 | 
						spec.flags |= SMALL;
 | 
				
			||||||
	if (spec.field_width == -1) {
 | 
						if (spec.field_width == -1) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -591,7 +591,8 @@ static void vlan_dev_uninit(struct net_device *dev)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 vlan_dev_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t vlan_dev_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
 | 
						struct net_device *real_dev = vlan_dev_info(dev)->real_dev;
 | 
				
			||||||
	u32 old_features = features;
 | 
						u32 old_features = features;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,7 +186,8 @@ static void br_getinfo(struct net_device *dev, struct ethtool_drvinfo *info)
 | 
				
			||||||
	strcpy(info->bus_info, "N/A");
 | 
						strcpy(info->bus_info, "N/A");
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 br_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t br_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct net_bridge *br = netdev_priv(dev);
 | 
						struct net_bridge *br = netdev_priv(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -296,10 +296,11 @@ int br_min_mtu(const struct net_bridge *br)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Recomputes features using slave's features
 | 
					 * Recomputes features using slave's features
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
u32 br_features_recompute(struct net_bridge *br, u32 features)
 | 
					netdev_features_t br_features_recompute(struct net_bridge *br,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct net_bridge_port *p;
 | 
						struct net_bridge_port *p;
 | 
				
			||||||
	u32 mask;
 | 
						netdev_features_t mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (list_empty(&br->port_list))
 | 
						if (list_empty(&br->port_list))
 | 
				
			||||||
		return features;
 | 
							return features;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -387,7 +387,8 @@ extern int br_add_if(struct net_bridge *br,
 | 
				
			||||||
extern int br_del_if(struct net_bridge *br,
 | 
					extern int br_del_if(struct net_bridge *br,
 | 
				
			||||||
	      struct net_device *dev);
 | 
						      struct net_device *dev);
 | 
				
			||||||
extern int br_min_mtu(const struct net_bridge *br);
 | 
					extern int br_min_mtu(const struct net_bridge *br);
 | 
				
			||||||
extern u32 br_features_recompute(struct net_bridge *br, u32 features);
 | 
					extern netdev_features_t br_features_recompute(struct net_bridge *br,
 | 
				
			||||||
 | 
						netdev_features_t features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* br_input.c */
 | 
					/* br_input.c */
 | 
				
			||||||
extern int br_handle_frame_finish(struct sk_buff *skb);
 | 
					extern int br_handle_frame_finish(struct sk_buff *skb);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1914,7 +1914,8 @@ EXPORT_SYMBOL(skb_checksum_help);
 | 
				
			||||||
 *	It may return NULL if the skb requires no segmentation.  This is
 | 
					 *	It may return NULL if the skb requires no segmentation.  This is
 | 
				
			||||||
 *	only possible when GSO is used for verifying header integrity.
 | 
					 *	only possible when GSO is used for verifying header integrity.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features)
 | 
					struct sk_buff *skb_gso_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT);
 | 
						struct sk_buff *segs = ERR_PTR(-EPROTONOSUPPORT);
 | 
				
			||||||
	struct packet_type *ptype;
 | 
						struct packet_type *ptype;
 | 
				
			||||||
| 
						 | 
					@ -1944,9 +1945,9 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, u32 features)
 | 
				
			||||||
		if (dev && dev->ethtool_ops && dev->ethtool_ops->get_drvinfo)
 | 
							if (dev && dev->ethtool_ops && dev->ethtool_ops->get_drvinfo)
 | 
				
			||||||
			dev->ethtool_ops->get_drvinfo(dev, &info);
 | 
								dev->ethtool_ops->get_drvinfo(dev, &info);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		WARN(1, "%s: caps=(0x%lx, 0x%lx) len=%d data_len=%d ip_summed=%d\n",
 | 
							WARN(1, "%s: caps=(%pNF, %pNF) len=%d data_len=%d ip_summed=%d\n",
 | 
				
			||||||
		     info.driver, dev ? dev->features : 0L,
 | 
							     info.driver, dev ? &dev->features : NULL,
 | 
				
			||||||
		     skb->sk ? skb->sk->sk_route_caps : 0L,
 | 
							     skb->sk ? &skb->sk->sk_route_caps : NULL,
 | 
				
			||||||
		     skb->len, skb->data_len, skb->ip_summed);
 | 
							     skb->len, skb->data_len, skb->ip_summed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (skb_header_cloned(skb) &&
 | 
							if (skb_header_cloned(skb) &&
 | 
				
			||||||
| 
						 | 
					@ -2055,7 +2056,7 @@ static void dev_gso_skb_destructor(struct sk_buff *skb)
 | 
				
			||||||
 *	This function segments the given skb and stores the list of segments
 | 
					 *	This function segments the given skb and stores the list of segments
 | 
				
			||||||
 *	in skb->next.
 | 
					 *	in skb->next.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static int dev_gso_segment(struct sk_buff *skb, int features)
 | 
					static int dev_gso_segment(struct sk_buff *skb, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs;
 | 
						struct sk_buff *segs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2094,7 +2095,7 @@ static inline void skb_orphan_try(struct sk_buff *skb)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool can_checksum_protocol(unsigned long features, __be16 protocol)
 | 
					static bool can_checksum_protocol(netdev_features_t features, __be16 protocol)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return ((features & NETIF_F_GEN_CSUM) ||
 | 
						return ((features & NETIF_F_GEN_CSUM) ||
 | 
				
			||||||
		((features & NETIF_F_V4_CSUM) &&
 | 
							((features & NETIF_F_V4_CSUM) &&
 | 
				
			||||||
| 
						 | 
					@ -2105,7 +2106,8 @@ static bool can_checksum_protocol(unsigned long features, __be16 protocol)
 | 
				
			||||||
		 protocol == htons(ETH_P_FCOE)));
 | 
							 protocol == htons(ETH_P_FCOE)));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 harmonize_features(struct sk_buff *skb, __be16 protocol, u32 features)
 | 
					static netdev_features_t harmonize_features(struct sk_buff *skb,
 | 
				
			||||||
 | 
						__be16 protocol, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (!can_checksum_protocol(features, protocol)) {
 | 
						if (!can_checksum_protocol(features, protocol)) {
 | 
				
			||||||
		features &= ~NETIF_F_ALL_CSUM;
 | 
							features &= ~NETIF_F_ALL_CSUM;
 | 
				
			||||||
| 
						 | 
					@ -2117,10 +2119,10 @@ static u32 harmonize_features(struct sk_buff *skb, __be16 protocol, u32 features
 | 
				
			||||||
	return features;
 | 
						return features;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
u32 netif_skb_features(struct sk_buff *skb)
 | 
					netdev_features_t netif_skb_features(struct sk_buff *skb)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	__be16 protocol = skb->protocol;
 | 
						__be16 protocol = skb->protocol;
 | 
				
			||||||
	u32 features = skb->dev->features;
 | 
						netdev_features_t features = skb->dev->features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (protocol == htons(ETH_P_8021Q)) {
 | 
						if (protocol == htons(ETH_P_8021Q)) {
 | 
				
			||||||
		struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
 | 
							struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data;
 | 
				
			||||||
| 
						 | 
					@ -2166,7 +2168,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
 | 
				
			||||||
	unsigned int skb_len;
 | 
						unsigned int skb_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (likely(!skb->next)) {
 | 
						if (likely(!skb->next)) {
 | 
				
			||||||
		u32 features;
 | 
							netdev_features_t features;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * If device doesn't need skb->dst, release it right now while
 | 
							 * If device doesn't need skb->dst, release it right now while
 | 
				
			||||||
| 
						 | 
					@ -5350,7 +5352,8 @@ static void rollback_registered(struct net_device *dev)
 | 
				
			||||||
	list_del(&single);
 | 
						list_del(&single);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 netdev_fix_features(struct net_device *dev, u32 features)
 | 
					static netdev_features_t netdev_fix_features(struct net_device *dev,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* Fix illegal checksum combinations */
 | 
						/* Fix illegal checksum combinations */
 | 
				
			||||||
	if ((features & NETIF_F_HW_CSUM) &&
 | 
						if ((features & NETIF_F_HW_CSUM) &&
 | 
				
			||||||
| 
						 | 
					@ -5412,7 +5415,7 @@ static u32 netdev_fix_features(struct net_device *dev, u32 features)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int __netdev_update_features(struct net_device *dev)
 | 
					int __netdev_update_features(struct net_device *dev)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 features;
 | 
						netdev_features_t features;
 | 
				
			||||||
	int err = 0;
 | 
						int err = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ASSERT_RTNL();
 | 
						ASSERT_RTNL();
 | 
				
			||||||
| 
						 | 
					@ -5428,16 +5431,16 @@ int __netdev_update_features(struct net_device *dev)
 | 
				
			||||||
	if (dev->features == features)
 | 
						if (dev->features == features)
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	netdev_dbg(dev, "Features changed: 0x%08x -> 0x%08x\n",
 | 
						netdev_dbg(dev, "Features changed: %pNF -> %pNF\n",
 | 
				
			||||||
		dev->features, features);
 | 
							&dev->features, &features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (dev->netdev_ops->ndo_set_features)
 | 
						if (dev->netdev_ops->ndo_set_features)
 | 
				
			||||||
		err = dev->netdev_ops->ndo_set_features(dev, features);
 | 
							err = dev->netdev_ops->ndo_set_features(dev, features);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (unlikely(err < 0)) {
 | 
						if (unlikely(err < 0)) {
 | 
				
			||||||
		netdev_err(dev,
 | 
							netdev_err(dev,
 | 
				
			||||||
			"set_features() failed (%d); wanted 0x%08x, left 0x%08x\n",
 | 
								"set_features() failed (%d); wanted %pNF, left %pNF\n",
 | 
				
			||||||
			err, features, dev->features);
 | 
								err, &features, &dev->features);
 | 
				
			||||||
		return -1;
 | 
							return -1;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6361,7 +6364,8 @@ static int dev_cpu_callback(struct notifier_block *nfb,
 | 
				
			||||||
 *	@one to the master device with current feature set @all.  Will not
 | 
					 *	@one to the master device with current feature set @all.  Will not
 | 
				
			||||||
 *	enable anything that is off in @mask. Returns the new feature set.
 | 
					 *	enable anything that is off in @mask. Returns the new feature set.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
u32 netdev_increment_features(u32 all, u32 one, u32 mask)
 | 
					netdev_features_t netdev_increment_features(netdev_features_t all,
 | 
				
			||||||
 | 
						netdev_features_t one, netdev_features_t mask)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	if (mask & NETIF_F_GEN_CSUM)
 | 
						if (mask & NETIF_F_GEN_CSUM)
 | 
				
			||||||
		mask |= NETIF_F_ALL_CSUM;
 | 
							mask |= NETIF_F_ALL_CSUM;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -171,7 +171,7 @@ static void __ethtool_get_strings(struct net_device *dev,
 | 
				
			||||||
		ops->get_strings(dev, stringset, data);
 | 
							ops->get_strings(dev, stringset, data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static u32 ethtool_get_feature_mask(u32 eth_cmd)
 | 
					static netdev_features_t ethtool_get_feature_mask(u32 eth_cmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	/* feature masks of legacy discrete ethtool ops */
 | 
						/* feature masks of legacy discrete ethtool ops */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -205,7 +205,7 @@ static u32 ethtool_get_feature_mask(u32 eth_cmd)
 | 
				
			||||||
static int ethtool_get_one_feature(struct net_device *dev,
 | 
					static int ethtool_get_one_feature(struct net_device *dev,
 | 
				
			||||||
	char __user *useraddr, u32 ethcmd)
 | 
						char __user *useraddr, u32 ethcmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 mask = ethtool_get_feature_mask(ethcmd);
 | 
						netdev_features_t mask = ethtool_get_feature_mask(ethcmd);
 | 
				
			||||||
	struct ethtool_value edata = {
 | 
						struct ethtool_value edata = {
 | 
				
			||||||
		.cmd = ethcmd,
 | 
							.cmd = ethcmd,
 | 
				
			||||||
		.data = !!(dev->features & mask),
 | 
							.data = !!(dev->features & mask),
 | 
				
			||||||
| 
						 | 
					@ -220,7 +220,7 @@ static int ethtool_set_one_feature(struct net_device *dev,
 | 
				
			||||||
	void __user *useraddr, u32 ethcmd)
 | 
						void __user *useraddr, u32 ethcmd)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct ethtool_value edata;
 | 
						struct ethtool_value edata;
 | 
				
			||||||
	u32 mask;
 | 
						netdev_features_t mask;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (copy_from_user(&edata, useraddr, sizeof(edata)))
 | 
						if (copy_from_user(&edata, useraddr, sizeof(edata)))
 | 
				
			||||||
		return -EFAULT;
 | 
							return -EFAULT;
 | 
				
			||||||
| 
						 | 
					@ -260,8 +260,7 @@ static u32 __ethtool_get_flags(struct net_device *dev)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __ethtool_set_flags(struct net_device *dev, u32 data)
 | 
					static int __ethtool_set_flags(struct net_device *dev, u32 data)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u32 features = 0;
 | 
						netdev_features_t features = 0, changed;
 | 
				
			||||||
	u32 changed;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (data & ~ETH_ALL_FLAGS)
 | 
						if (data & ~ETH_ALL_FLAGS)
 | 
				
			||||||
		return -EINVAL;
 | 
							return -EINVAL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2670,7 +2670,7 @@ EXPORT_SYMBOL_GPL(skb_pull_rcsum);
 | 
				
			||||||
 *	a pointer to the first in a list of new skbs for the segments.
 | 
					 *	a pointer to the first in a list of new skbs for the segments.
 | 
				
			||||||
 *	In case of error it returns ERR_PTR(err).
 | 
					 *	In case of error it returns ERR_PTR(err).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct sk_buff *skb_segment(struct sk_buff *skb, u32 features)
 | 
					struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = NULL;
 | 
						struct sk_buff *segs = NULL;
 | 
				
			||||||
	struct sk_buff *tail = NULL;
 | 
						struct sk_buff *tail = NULL;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1250,7 +1250,8 @@ out:
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct sk_buff *inet_gso_segment(struct sk_buff *skb, u32 features)
 | 
					static struct sk_buff *inet_gso_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
						struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
				
			||||||
	struct iphdr *iph;
 | 
						struct iphdr *iph;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2653,7 +2653,8 @@ int compat_tcp_getsockopt(struct sock *sk, int level, int optname,
 | 
				
			||||||
EXPORT_SYMBOL(compat_tcp_getsockopt);
 | 
					EXPORT_SYMBOL(compat_tcp_getsockopt);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sk_buff *tcp_tso_segment(struct sk_buff *skb, u32 features)
 | 
					struct sk_buff *tcp_tso_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
						struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
				
			||||||
	struct tcphdr *th;
 | 
						struct tcphdr *th;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2247,7 +2247,8 @@ int udp4_ufo_send_check(struct sk_buff *skb)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb, u32 features)
 | 
					struct sk_buff *udp4_ufo_fragment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
						struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
				
			||||||
	unsigned int mss;
 | 
						unsigned int mss;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -769,7 +769,8 @@ out:
 | 
				
			||||||
	return err;
 | 
						return err;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb, u32 features)
 | 
					static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
						struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
				
			||||||
	struct ipv6hdr *ipv6h;
 | 
						struct ipv6hdr *ipv6h;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1300,7 +1300,8 @@ static int udp6_ufo_send_check(struct sk_buff *skb)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb, u32 features)
 | 
					static struct sk_buff *udp6_ufo_fragment(struct sk_buff *skb,
 | 
				
			||||||
 | 
						netdev_features_t features)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
						struct sk_buff *segs = ERR_PTR(-EINVAL);
 | 
				
			||||||
	unsigned int mss;
 | 
						unsigned int mss;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue