aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/infiniband/ulp/ipoib/ipoib_main.c
diff options
context:
space:
mode:
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>2011-04-18 20:43:20 -0400
committerDavid S. Miller <davem@davemloft.net>2011-04-20 04:30:42 -0400
commit3d96c74d8983b16bc7ecb196e61a2173fcc3f09f (patch)
tree3ecb598a9e24e916854e43f7f0ce5016ebebc22e /drivers/infiniband/ulp/ipoib/ipoib_main.c
parent6204b47ec4394f7e472885c8d05d9cda96d97a25 (diff)
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>
Diffstat (limited to 'drivers/infiniband/ulp/ipoib/ipoib_main.c')
-rw-r--r--drivers/infiniband/ulp/ipoib/ipoib_main.c24
1 files changed, 17 insertions, 7 deletions
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)
171 return 0; 171 return 0;
172} 172}
173 173
174static u32 ipoib_fix_features(struct net_device *dev, u32 features)
175{
176 struct ipoib_dev_priv *priv = netdev_priv(dev);
177
178 if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))
179 features &= ~(NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
180
181 return features;
182}
183
174static int ipoib_change_mtu(struct net_device *dev, int new_mtu) 184static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
175{ 185{
176 struct ipoib_dev_priv *priv = netdev_priv(dev); 186 struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -970,6 +980,7 @@ static const struct net_device_ops ipoib_netdev_ops = {
970 .ndo_open = ipoib_open, 980 .ndo_open = ipoib_open,
971 .ndo_stop = ipoib_stop, 981 .ndo_stop = ipoib_stop,
972 .ndo_change_mtu = ipoib_change_mtu, 982 .ndo_change_mtu = ipoib_change_mtu,
983 .ndo_fix_features = ipoib_fix_features,
973 .ndo_start_xmit = ipoib_start_xmit, 984 .ndo_start_xmit = ipoib_start_xmit,
974 .ndo_tx_timeout = ipoib_timeout, 985 .ndo_tx_timeout = ipoib_timeout,
975 .ndo_set_multicast_list = ipoib_set_mcast_list, 986 .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)
1154 kfree(device_attr); 1165 kfree(device_attr);
1155 1166
1156 if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) { 1167 if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
1157 set_bit(IPOIB_FLAG_CSUM, &priv->flags); 1168 priv->dev->hw_features = NETIF_F_SG |
1158 priv->dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; 1169 NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
1159 }
1160 1170
1161 priv->dev->features |= NETIF_F_GRO; 1171 if (priv->hca_caps & IB_DEVICE_UD_TSO)
1172 priv->dev->hw_features |= NETIF_F_TSO;
1162 1173
1163 if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO) 1174 priv->dev->features |= priv->dev->hw_features;
1164 priv->dev->features |= NETIF_F_TSO; 1175 }
1165 1176
1166 return 0; 1177 return 0;
1167} 1178}
1168 1179
1169
1170static struct net_device *ipoib_add_port(const char *format, 1180static struct net_device *ipoib_add_port(const char *format,
1171 struct ib_device *hca, u8 port) 1181 struct ib_device *hca, u8 port)
1172{ 1182{