net: infiniband/ulp/ipoib: convert to hw_features
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
6204b47ec4
commit
3d96c74d89
|
@ -91,7 +91,6 @@ enum {
|
||||||
IPOIB_STOP_REAPER = 7,
|
IPOIB_STOP_REAPER = 7,
|
||||||
IPOIB_FLAG_ADMIN_CM = 9,
|
IPOIB_FLAG_ADMIN_CM = 9,
|
||||||
IPOIB_FLAG_UMCAST = 10,
|
IPOIB_FLAG_UMCAST = 10,
|
||||||
IPOIB_FLAG_CSUM = 11,
|
|
||||||
|
|
||||||
IPOIB_MAX_BACKOFF_SECONDS = 16,
|
IPOIB_MAX_BACKOFF_SECONDS = 16,
|
||||||
|
|
||||||
|
|
|
@ -1463,8 +1463,7 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
|
||||||
set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
|
set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
|
||||||
ipoib_warn(priv, "enabling connected mode "
|
ipoib_warn(priv, "enabling connected mode "
|
||||||
"will cause multicast packet drops\n");
|
"will cause multicast packet drops\n");
|
||||||
|
netdev_update_features(dev);
|
||||||
dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO);
|
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
|
priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
|
||||||
|
|
||||||
|
@ -1474,13 +1473,7 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
|
||||||
|
|
||||||
if (!strcmp(buf, "datagram\n")) {
|
if (!strcmp(buf, "datagram\n")) {
|
||||||
clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
|
clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
|
||||||
|
netdev_update_features(dev);
|
||||||
if (test_bit(IPOIB_FLAG_CSUM, &priv->flags)) {
|
|
||||||
dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
|
|
||||||
priv->dev->features |= NETIF_F_GRO;
|
|
||||||
if (priv->hca_caps & IB_DEVICE_UD_TSO)
|
|
||||||
dev->features |= NETIF_F_TSO;
|
|
||||||
}
|
|
||||||
dev_set_mtu(dev, min(priv->mcast_mtu, dev->mtu));
|
dev_set_mtu(dev, min(priv->mcast_mtu, dev->mtu));
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
ipoib_flush_paths(dev);
|
ipoib_flush_paths(dev);
|
||||||
|
|
|
@ -42,32 +42,6 @@ static void ipoib_get_drvinfo(struct net_device *netdev,
|
||||||
strncpy(drvinfo->driver, "ipoib", sizeof(drvinfo->driver) - 1);
|
strncpy(drvinfo->driver, "ipoib", sizeof(drvinfo->driver) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 ipoib_get_rx_csum(struct net_device *dev)
|
|
||||||
{
|
|
||||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
|
||||||
return test_bit(IPOIB_FLAG_CSUM, &priv->flags) &&
|
|
||||||
!test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ipoib_set_tso(struct net_device *dev, u32 data)
|
|
||||||
{
|
|
||||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
|
||||||
|
|
||||||
if (data) {
|
|
||||||
if (!test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags) &&
|
|
||||||
(dev->features & NETIF_F_SG) &&
|
|
||||||
(priv->hca_caps & IB_DEVICE_UD_TSO)) {
|
|
||||||
dev->features |= NETIF_F_TSO;
|
|
||||||
} else {
|
|
||||||
ipoib_warn(priv, "can't set TSO on\n");
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
dev->features &= ~NETIF_F_TSO;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ipoib_get_coalesce(struct net_device *dev,
|
static int ipoib_get_coalesce(struct net_device *dev,
|
||||||
struct ethtool_coalesce *coal)
|
struct ethtool_coalesce *coal)
|
||||||
{
|
{
|
||||||
|
@ -108,8 +82,6 @@ static int ipoib_set_coalesce(struct net_device *dev,
|
||||||
|
|
||||||
static const struct ethtool_ops ipoib_ethtool_ops = {
|
static const struct ethtool_ops ipoib_ethtool_ops = {
|
||||||
.get_drvinfo = ipoib_get_drvinfo,
|
.get_drvinfo = ipoib_get_drvinfo,
|
||||||
.get_rx_csum = ipoib_get_rx_csum,
|
|
||||||
.set_tso = ipoib_set_tso,
|
|
||||||
.get_coalesce = ipoib_get_coalesce,
|
.get_coalesce = ipoib_get_coalesce,
|
||||||
.set_coalesce = ipoib_set_coalesce,
|
.set_coalesce = ipoib_set_coalesce,
|
||||||
};
|
};
|
||||||
|
|
|
@ -292,7 +292,7 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
|
||||||
dev->stats.rx_bytes += skb->len;
|
dev->stats.rx_bytes += skb->len;
|
||||||
|
|
||||||
skb->dev = dev;
|
skb->dev = dev;
|
||||||
if (test_bit(IPOIB_FLAG_CSUM, &priv->flags) && likely(wc->csum_ok))
|
if ((dev->features & NETIF_F_RXCSUM) && likely(wc->csum_ok))
|
||||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||||
|
|
||||||
napi_gro_receive(&priv->napi, skb);
|
napi_gro_receive(&priv->napi, skb);
|
||||||
|
|
|
@ -171,6 +171,16 @@ static int ipoib_stop(struct net_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u32 ipoib_fix_features(struct net_device *dev, u32 features)
|
||||||
|
{
|
||||||
|
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||||
|
|
||||||
|
if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))
|
||||||
|
features &= ~(NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
|
||||||
|
|
||||||
|
return features;
|
||||||
|
}
|
||||||
|
|
||||||
static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
|
static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
|
||||||
{
|
{
|
||||||
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
struct ipoib_dev_priv *priv = netdev_priv(dev);
|
||||||
|
@ -970,6 +980,7 @@ static const struct net_device_ops ipoib_netdev_ops = {
|
||||||
.ndo_open = ipoib_open,
|
.ndo_open = ipoib_open,
|
||||||
.ndo_stop = ipoib_stop,
|
.ndo_stop = ipoib_stop,
|
||||||
.ndo_change_mtu = ipoib_change_mtu,
|
.ndo_change_mtu = ipoib_change_mtu,
|
||||||
|
.ndo_fix_features = ipoib_fix_features,
|
||||||
.ndo_start_xmit = ipoib_start_xmit,
|
.ndo_start_xmit = ipoib_start_xmit,
|
||||||
.ndo_tx_timeout = ipoib_timeout,
|
.ndo_tx_timeout = ipoib_timeout,
|
||||||
.ndo_set_multicast_list = ipoib_set_mcast_list,
|
.ndo_set_multicast_list = ipoib_set_mcast_list,
|
||||||
|
@ -1154,19 +1165,18 @@ int ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca)
|
||||||
kfree(device_attr);
|
kfree(device_attr);
|
||||||
|
|
||||||
if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
|
if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
|
||||||
set_bit(IPOIB_FLAG_CSUM, &priv->flags);
|
priv->dev->hw_features = NETIF_F_SG |
|
||||||
priv->dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
|
NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
|
||||||
|
|
||||||
|
if (priv->hca_caps & IB_DEVICE_UD_TSO)
|
||||||
|
priv->dev->hw_features |= NETIF_F_TSO;
|
||||||
|
|
||||||
|
priv->dev->features |= priv->dev->hw_features;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->dev->features |= NETIF_F_GRO;
|
|
||||||
|
|
||||||
if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO)
|
|
||||||
priv->dev->features |= NETIF_F_TSO;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static struct net_device *ipoib_add_port(const char *format,
|
static struct net_device *ipoib_add_port(const char *format,
|
||||||
struct ib_device *hca, u8 port)
|
struct ib_device *hca, u8 port)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue