Commit b9367bf3 authored by Michał Mirosław's avatar Michał Mirosław Committed by David S. Miller

net: ibmveth: convert to hw_features

A minimal conversion.

ibmveth_set_csum_offload() can be folded into ibmveth_set_features()
and adapter->rx_csum removed - left for later cleanup.
Signed-off-by: default avatarMichał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 756a6b03
...@@ -729,13 +729,8 @@ static void netdev_get_drvinfo(struct net_device *dev, ...@@ -729,13 +729,8 @@ static void netdev_get_drvinfo(struct net_device *dev,
sizeof(info->version) - 1); sizeof(info->version) - 1);
} }
static void ibmveth_set_rx_csum_flags(struct net_device *dev, u32 data) static u32 ibmveth_fix_features(struct net_device *dev, u32 features)
{ {
struct ibmveth_adapter *adapter = netdev_priv(dev);
if (data) {
adapter->rx_csum = 1;
} else {
/* /*
* Since the ibmveth firmware interface does not have the * Since the ibmveth firmware interface does not have the
* concept of separate tx/rx checksum offload enable, if rx * concept of separate tx/rx checksum offload enable, if rx
...@@ -744,30 +739,14 @@ static void ibmveth_set_rx_csum_flags(struct net_device *dev, u32 data) ...@@ -744,30 +739,14 @@ static void ibmveth_set_rx_csum_flags(struct net_device *dev, u32 data)
* longer allowed to send tx buffers that are not properly * longer allowed to send tx buffers that are not properly
* checksummed. * checksummed.
*/ */
adapter->rx_csum = 0;
dev->features &= ~NETIF_F_IP_CSUM;
dev->features &= ~NETIF_F_IPV6_CSUM;
}
}
static void ibmveth_set_tx_csum_flags(struct net_device *dev, u32 data) if (!(features & NETIF_F_RXCSUM))
{ features &= ~NETIF_F_ALL_CSUM;
struct ibmveth_adapter *adapter = netdev_priv(dev);
if (data) { return features;
if (adapter->fw_ipv4_csum_support)
dev->features |= NETIF_F_IP_CSUM;
if (adapter->fw_ipv6_csum_support)
dev->features |= NETIF_F_IPV6_CSUM;
adapter->rx_csum = 1;
} else {
dev->features &= ~NETIF_F_IP_CSUM;
dev->features &= ~NETIF_F_IPV6_CSUM;
}
} }
static int ibmveth_set_csum_offload(struct net_device *dev, u32 data, static int ibmveth_set_csum_offload(struct net_device *dev, u32 data)
void (*done) (struct net_device *, u32))
{ {
struct ibmveth_adapter *adapter = netdev_priv(dev); struct ibmveth_adapter *adapter = netdev_priv(dev);
unsigned long set_attr, clr_attr, ret_attr; unsigned long set_attr, clr_attr, ret_attr;
...@@ -827,8 +806,8 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data, ...@@ -827,8 +806,8 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data,
} else } else
adapter->fw_ipv6_csum_support = data; adapter->fw_ipv6_csum_support = data;
if (ret == H_SUCCESS || ret6 == H_SUCCESS) if (ret != H_SUCCESS || ret6 != H_SUCCESS)
done(dev, data); adapter->rx_csum = data;
else else
rc1 = -EIO; rc1 = -EIO;
} else { } else {
...@@ -844,41 +823,22 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data, ...@@ -844,41 +823,22 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data,
return rc1 ? rc1 : rc2; return rc1 ? rc1 : rc2;
} }
static int ibmveth_set_rx_csum(struct net_device *dev, u32 data) static int ibmveth_set_features(struct net_device *dev, u32 features)
{
struct ibmveth_adapter *adapter = netdev_priv(dev);
if ((data && adapter->rx_csum) || (!data && !adapter->rx_csum))
return 0;
return ibmveth_set_csum_offload(dev, data, ibmveth_set_rx_csum_flags);
}
static int ibmveth_set_tx_csum(struct net_device *dev, u32 data)
{ {
struct ibmveth_adapter *adapter = netdev_priv(dev); struct ibmveth_adapter *adapter = netdev_priv(dev);
int rc = 0; int rx_csum = !!(features & NETIF_F_RXCSUM);
int rc;
if (data && (dev->features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM))) if (rx_csum == adapter->rx_csum)
return 0;
if (!data && !(dev->features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)))
return 0; return 0;
if (data && !adapter->rx_csum) rc = ibmveth_set_csum_offload(dev, rx_csum);
rc = ibmveth_set_csum_offload(dev, data, if (rc && !adapter->rx_csum)
ibmveth_set_tx_csum_flags); dev->features = features & ~(NETIF_F_ALL_CSUM | NETIF_F_RXCSUM);
else
ibmveth_set_tx_csum_flags(dev, data);
return rc; return rc;
} }
static u32 ibmveth_get_rx_csum(struct net_device *dev)
{
struct ibmveth_adapter *adapter = netdev_priv(dev);
return adapter->rx_csum;
}
static void ibmveth_get_strings(struct net_device *dev, u32 stringset, u8 *data) static void ibmveth_get_strings(struct net_device *dev, u32 stringset, u8 *data)
{ {
int i; int i;
...@@ -914,13 +874,9 @@ static const struct ethtool_ops netdev_ethtool_ops = { ...@@ -914,13 +874,9 @@ static const struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo = netdev_get_drvinfo, .get_drvinfo = netdev_get_drvinfo,
.get_settings = netdev_get_settings, .get_settings = netdev_get_settings,
.get_link = ethtool_op_get_link, .get_link = ethtool_op_get_link,
.set_tx_csum = ibmveth_set_tx_csum,
.get_rx_csum = ibmveth_get_rx_csum,
.set_rx_csum = ibmveth_set_rx_csum,
.get_strings = ibmveth_get_strings, .get_strings = ibmveth_get_strings,
.get_sset_count = ibmveth_get_sset_count, .get_sset_count = ibmveth_get_sset_count,
.get_ethtool_stats = ibmveth_get_ethtool_stats, .get_ethtool_stats = ibmveth_get_ethtool_stats,
.set_sg = ethtool_op_set_sg,
}; };
static int ibmveth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) static int ibmveth_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
...@@ -1345,6 +1301,8 @@ static const struct net_device_ops ibmveth_netdev_ops = { ...@@ -1345,6 +1301,8 @@ static const struct net_device_ops ibmveth_netdev_ops = {
.ndo_set_multicast_list = ibmveth_set_multicast_list, .ndo_set_multicast_list = ibmveth_set_multicast_list,
.ndo_do_ioctl = ibmveth_ioctl, .ndo_do_ioctl = ibmveth_ioctl,
.ndo_change_mtu = ibmveth_change_mtu, .ndo_change_mtu = ibmveth_change_mtu,
.ndo_fix_features = ibmveth_fix_features,
.ndo_set_features = ibmveth_set_features,
.ndo_validate_addr = eth_validate_addr, .ndo_validate_addr = eth_validate_addr,
.ndo_set_mac_address = eth_mac_addr, .ndo_set_mac_address = eth_mac_addr,
#ifdef CONFIG_NET_POLL_CONTROLLER #ifdef CONFIG_NET_POLL_CONTROLLER
...@@ -1412,7 +1370,9 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, ...@@ -1412,7 +1370,9 @@ static int __devinit ibmveth_probe(struct vio_dev *dev,
netdev->netdev_ops = &ibmveth_netdev_ops; netdev->netdev_ops = &ibmveth_netdev_ops;
netdev->ethtool_ops = &netdev_ethtool_ops; netdev->ethtool_ops = &netdev_ethtool_ops;
SET_NETDEV_DEV(netdev, &dev->dev); SET_NETDEV_DEV(netdev, &dev->dev);
netdev->features |= NETIF_F_SG; netdev->hw_features = NETIF_F_SG | NETIF_F_RXCSUM |
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
netdev->features |= netdev->hw_features;
memcpy(netdev->dev_addr, &adapter->mac_addr, netdev->addr_len); memcpy(netdev->dev_addr, &adapter->mac_addr, netdev->addr_len);
...@@ -1437,8 +1397,6 @@ static int __devinit ibmveth_probe(struct vio_dev *dev, ...@@ -1437,8 +1397,6 @@ static int __devinit ibmveth_probe(struct vio_dev *dev,
netdev_dbg(netdev, "registering netdev...\n"); netdev_dbg(netdev, "registering netdev...\n");
ibmveth_set_csum_offload(netdev, 1, ibmveth_set_tx_csum_flags);
rc = register_netdev(netdev); rc = register_netdev(netdev);
if (rc) { if (rc) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment