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

Commit d7ccb8c2 authored by Michał Mirosław's avatar Michał Mirosław Committed by Jeff Kirsher
Browse files

ixgb: convert to ndo_fix_features



Private rx_csum flags are now duplicate of netdev->features & NETIF_F_RXCSUM.
Removing this needs deeper surgery.

Things noticed:
 - ixgb has RX csum disabled by default
 - HW VLAN acceleration probably can be toggled, but it's left as is
 - the resets on RX csum offload change can probably be avoided
 - there is A LOT of copy-and-pasted code here

Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent f78a5fda
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -204,6 +204,8 @@ extern void ixgb_set_ethtool_ops(struct net_device *netdev);
extern char ixgb_driver_name[];
extern char ixgb_driver_name[];
extern const char ixgb_driver_version[];
extern const char ixgb_driver_version[];


extern void ixgb_set_speed_duplex(struct net_device *netdev);

extern int ixgb_up(struct ixgb_adapter *adapter);
extern int ixgb_up(struct ixgb_adapter *adapter);
extern void ixgb_down(struct ixgb_adapter *adapter, bool kill_watchdog);
extern void ixgb_down(struct ixgb_adapter *adapter, bool kill_watchdog);
extern void ixgb_reset(struct ixgb_adapter *adapter);
extern void ixgb_reset(struct ixgb_adapter *adapter);
+1 −58
Original line number Original line Diff line number Diff line
@@ -115,7 +115,7 @@ ixgb_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
	return 0;
	return 0;
}
}


static void ixgb_set_speed_duplex(struct net_device *netdev)
void ixgb_set_speed_duplex(struct net_device *netdev)
{
{
	struct ixgb_adapter *adapter = netdev_priv(netdev);
	struct ixgb_adapter *adapter = netdev_priv(netdev);
	/* be optimistic about our link, since we were up before */
	/* be optimistic about our link, since we were up before */
@@ -194,57 +194,6 @@ ixgb_set_pauseparam(struct net_device *netdev,
	return 0;
	return 0;
}
}


static u32
ixgb_get_rx_csum(struct net_device *netdev)
{
	struct ixgb_adapter *adapter = netdev_priv(netdev);

	return adapter->rx_csum;
}

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

	adapter->rx_csum = data;

	if (netif_running(netdev)) {
		ixgb_down(adapter, true);
		ixgb_up(adapter);
		ixgb_set_speed_duplex(netdev);
	} else
		ixgb_reset(adapter);
	return 0;
}

static u32
ixgb_get_tx_csum(struct net_device *netdev)
{
	return (netdev->features & NETIF_F_HW_CSUM) != 0;
}

static int
ixgb_set_tx_csum(struct net_device *netdev, u32 data)
{
	if (data)
		netdev->features |= NETIF_F_HW_CSUM;
	else
		netdev->features &= ~NETIF_F_HW_CSUM;

	return 0;
}

static int
ixgb_set_tso(struct net_device *netdev, u32 data)
{
	if (data)
		netdev->features |= NETIF_F_TSO;
	else
		netdev->features &= ~NETIF_F_TSO;
	return 0;
}

static u32
static u32
ixgb_get_msglevel(struct net_device *netdev)
ixgb_get_msglevel(struct net_device *netdev)
{
{
@@ -736,14 +685,8 @@ static const struct ethtool_ops ixgb_ethtool_ops = {
	.set_ringparam = ixgb_set_ringparam,
	.set_ringparam = ixgb_set_ringparam,
	.get_pauseparam	= ixgb_get_pauseparam,
	.get_pauseparam	= ixgb_get_pauseparam,
	.set_pauseparam	= ixgb_set_pauseparam,
	.set_pauseparam	= ixgb_set_pauseparam,
	.get_rx_csum = ixgb_get_rx_csum,
	.set_rx_csum = ixgb_set_rx_csum,
	.get_tx_csum = ixgb_get_tx_csum,
	.set_tx_csum = ixgb_set_tx_csum,
	.set_sg	= ethtool_op_set_sg,
	.get_msglevel = ixgb_get_msglevel,
	.get_msglevel = ixgb_get_msglevel,
	.set_msglevel = ixgb_set_msglevel,
	.set_msglevel = ixgb_set_msglevel,
	.set_tso = ixgb_set_tso,
	.get_strings = ixgb_get_strings,
	.get_strings = ixgb_get_strings,
	.set_phys_id = ixgb_set_phys_id,
	.set_phys_id = ixgb_set_phys_id,
	.get_sset_count = ixgb_get_sset_count,
	.get_sset_count = ixgb_get_sset_count,
+28 −3
Original line number Original line Diff line number Diff line
@@ -325,6 +325,28 @@ ixgb_reset(struct ixgb_adapter *adapter)
	}
	}
}
}


static int
ixgb_set_features(struct net_device *netdev, u32 features)
{
	struct ixgb_adapter *adapter = netdev_priv(netdev);
	u32 changed = features ^ netdev->features;

	if (!(changed & NETIF_F_RXCSUM))
		return 0;

	adapter->rx_csum = !!(features & NETIF_F_RXCSUM);

	if (netif_running(netdev)) {
		ixgb_down(adapter, true);
		ixgb_up(adapter);
		ixgb_set_speed_duplex(netdev);
	} else
		ixgb_reset(adapter);

	return 0;
}


static const struct net_device_ops ixgb_netdev_ops = {
static const struct net_device_ops ixgb_netdev_ops = {
	.ndo_open 		= ixgb_open,
	.ndo_open 		= ixgb_open,
	.ndo_stop		= ixgb_close,
	.ndo_stop		= ixgb_close,
@@ -340,6 +362,7 @@ static const struct net_device_ops ixgb_netdev_ops = {
#ifdef CONFIG_NET_POLL_CONTROLLER
#ifdef CONFIG_NET_POLL_CONTROLLER
	.ndo_poll_controller	= ixgb_netpoll,
	.ndo_poll_controller	= ixgb_netpoll,
#endif
#endif
	.ndo_set_features       = ixgb_set_features,
};
};


/**
/**
@@ -439,12 +462,14 @@ ixgb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	if (err)
	if (err)
		goto err_sw_init;
		goto err_sw_init;


	netdev->features = NETIF_F_SG |
	netdev->hw_features = NETIF_F_SG |
			   NETIF_F_HW_CSUM |
			   NETIF_F_TSO |
			   NETIF_F_HW_CSUM;
	netdev->features = netdev->hw_features |
			   NETIF_F_HW_VLAN_TX |
			   NETIF_F_HW_VLAN_TX |
			   NETIF_F_HW_VLAN_RX |
			   NETIF_F_HW_VLAN_RX |
			   NETIF_F_HW_VLAN_FILTER;
			   NETIF_F_HW_VLAN_FILTER;
	netdev->features |= NETIF_F_TSO;
	netdev->hw_features |= NETIF_F_RXCSUM;


	if (pci_using_dac) {
	if (pci_using_dac) {
		netdev->features |= NETIF_F_HIGHDMA;
		netdev->features |= NETIF_F_HIGHDMA;