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: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Michał Mirosław 2011-04-19 02:14:25 +00:00 коммит произвёл David S. Miller
Родитель 756a6b03da
Коммит b9367bf3ee
1 изменённых файлов: 28 добавлений и 70 удалений

Просмотреть файл

@ -729,45 +729,24 @@ static void netdev_get_drvinfo(struct net_device *dev,
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);
/*
* Since the ibmveth firmware interface does not have the
* concept of separate tx/rx checksum offload enable, if rx
* checksum is disabled we also have to disable tx checksum
* offload. Once we disable rx checksum offload, we are no
* longer allowed to send tx buffers that are not properly
* checksummed.
*/
if (data) {
adapter->rx_csum = 1;
} else {
/*
* Since the ibmveth firmware interface does not have the
* concept of separate tx/rx checksum offload enable, if rx
* checksum is disabled we also have to disable tx checksum
* offload. Once we disable rx checksum offload, we are no
* longer allowed to send tx buffers that are not properly
* checksummed.
*/
adapter->rx_csum = 0;
dev->features &= ~NETIF_F_IP_CSUM;
dev->features &= ~NETIF_F_IPV6_CSUM;
}
if (!(features & NETIF_F_RXCSUM))
features &= ~NETIF_F_ALL_CSUM;
return features;
}
static void ibmveth_set_tx_csum_flags(struct net_device *dev, u32 data)
{
struct ibmveth_adapter *adapter = netdev_priv(dev);
if (data) {
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,
void (*done) (struct net_device *, u32))
static int ibmveth_set_csum_offload(struct net_device *dev, u32 data)
{
struct ibmveth_adapter *adapter = netdev_priv(dev);
unsigned long set_attr, clr_attr, ret_attr;
@ -827,8 +806,8 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data,
} else
adapter->fw_ipv6_csum_support = data;
if (ret == H_SUCCESS || ret6 == H_SUCCESS)
done(dev, data);
if (ret != H_SUCCESS || ret6 != H_SUCCESS)
adapter->rx_csum = data;
else
rc1 = -EIO;
} else {
@ -844,41 +823,22 @@ static int ibmveth_set_csum_offload(struct net_device *dev, u32 data,
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);
int rx_csum = !!(features & NETIF_F_RXCSUM);
int rc;
if ((data && adapter->rx_csum) || (!data && !adapter->rx_csum))
if (rx_csum == 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);
int rc = 0;
if (data && (dev->features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)))
return 0;
if (!data && !(dev->features & (NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM)))
return 0;
if (data && !adapter->rx_csum)
rc = ibmveth_set_csum_offload(dev, data,
ibmveth_set_tx_csum_flags);
else
ibmveth_set_tx_csum_flags(dev, data);
rc = ibmveth_set_csum_offload(dev, rx_csum);
if (rc && !adapter->rx_csum)
dev->features = features & ~(NETIF_F_ALL_CSUM | NETIF_F_RXCSUM);
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)
{
int i;
@ -914,13 +874,9 @@ static const struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo = netdev_get_drvinfo,
.get_settings = netdev_get_settings,
.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_sset_count = ibmveth_get_sset_count,
.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)
@ -1345,6 +1301,8 @@ static const struct net_device_ops ibmveth_netdev_ops = {
.ndo_set_multicast_list = ibmveth_set_multicast_list,
.ndo_do_ioctl = ibmveth_ioctl,
.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_set_mac_address = eth_mac_addr,
#ifdef CONFIG_NET_POLL_CONTROLLER
@ -1412,7 +1370,9 @@ static int __devinit ibmveth_probe(struct vio_dev *dev,
netdev->netdev_ops = &ibmveth_netdev_ops;
netdev->ethtool_ops = &netdev_ethtool_ops;
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);
@ -1437,8 +1397,6 @@ static int __devinit ibmveth_probe(struct vio_dev *dev,
netdev_dbg(netdev, "registering netdev...\n");
ibmveth_set_csum_offload(netdev, 1, ibmveth_set_tx_csum_flags);
rc = register_netdev(netdev);
if (rc) {