diff options
Diffstat (limited to 'drivers/infiniband/ulp/ipoib')
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib.h | 1 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_cm.c | 11 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_ethtool.c | 28 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_ib.c | 2 | ||||
| -rw-r--r-- | drivers/infiniband/ulp/ipoib/ipoib_main.c | 24 | 
5 files changed, 20 insertions, 46 deletions
| diff --git a/drivers/infiniband/ulp/ipoib/ipoib.h b/drivers/infiniband/ulp/ipoib/ipoib.h index ab97f92fc257..7b6985a2e652 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib.h +++ b/drivers/infiniband/ulp/ipoib/ipoib.h @@ -91,7 +91,6 @@ enum {  	IPOIB_STOP_REAPER	  = 7,  	IPOIB_FLAG_ADMIN_CM	  = 9,  	IPOIB_FLAG_UMCAST	  = 10, -	IPOIB_FLAG_CSUM		  = 11,  	IPOIB_MAX_BACKOFF_SECONDS = 16, diff --git a/drivers/infiniband/ulp/ipoib/ipoib_cm.c b/drivers/infiniband/ulp/ipoib/ipoib_cm.c index 93d55806b967..39913a065f99 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_cm.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_cm.c @@ -1463,8 +1463,7 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,  		set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);  		ipoib_warn(priv, "enabling connected mode "  			   "will cause multicast packet drops\n"); - -		dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO); +		netdev_update_features(dev);  		rtnl_unlock();  		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")) {  		clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags); - -		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; -		} +		netdev_update_features(dev);  		dev_set_mtu(dev, min(priv->mcast_mtu, dev->mtu));  		rtnl_unlock();  		ipoib_flush_paths(dev); diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c b/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c index 19f7f5206f78..29bc7b5724ac 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ethtool.c @@ -42,32 +42,6 @@ static void ipoib_get_drvinfo(struct net_device *netdev,  	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,  			      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 = {  	.get_drvinfo		= ipoib_get_drvinfo, -	.get_rx_csum		= ipoib_get_rx_csum, -	.set_tso		= ipoib_set_tso,  	.get_coalesce		= ipoib_get_coalesce,  	.set_coalesce		= ipoib_set_coalesce,  }; diff --git a/drivers/infiniband/ulp/ipoib/ipoib_ib.c b/drivers/infiniband/ulp/ipoib/ipoib_ib.c index 806d0292dc39..81ae61d68a22 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_ib.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_ib.c @@ -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;  	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;  	napi_gro_receive(&priv->napi, skb); diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index aca3b44f7aed..86addca9ddf6 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c @@ -171,6 +171,16 @@ static int ipoib_stop(struct net_device *dev)  	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)  {  	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_stop		 = ipoib_stop,  	.ndo_change_mtu		 = ipoib_change_mtu, +	.ndo_fix_features	 = ipoib_fix_features,  	.ndo_start_xmit	 	 = ipoib_start_xmit,  	.ndo_tx_timeout		 = ipoib_timeout,  	.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);  	if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) { -		set_bit(IPOIB_FLAG_CSUM, &priv->flags); -		priv->dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; -	} +		priv->dev->hw_features = NETIF_F_SG | +			NETIF_F_IP_CSUM | NETIF_F_RXCSUM; -	priv->dev->features |= NETIF_F_GRO; +		if (priv->hca_caps & IB_DEVICE_UD_TSO) +			priv->dev->hw_features |= NETIF_F_TSO; -	if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO) -		priv->dev->features |= NETIF_F_TSO; +		priv->dev->features |= priv->dev->hw_features; +	}  	return 0;  } -  static struct net_device *ipoib_add_port(const char *format,  					 struct ib_device *hca, u8 port)  { | 
