diff options
author | Michał Mirosław <mirq-linux@rere.qmqm.pl> | 2011-04-18 20:43:20 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-04-20 04:30:42 -0400 |
commit | 3d96c74d8983b16bc7ecb196e61a2173fcc3f09f (patch) | |
tree | 3ecb598a9e24e916854e43f7f0ce5016ebebc22e /drivers/infiniband/ulp/ipoib/ipoib_main.c | |
parent | 6204b47ec4394f7e472885c8d05d9cda96d97a25 (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.c | 24 |
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 | ||
174 | static 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 | |||
174 | static int ipoib_change_mtu(struct net_device *dev, int new_mtu) | 184 | static 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 | |||
1170 | static struct net_device *ipoib_add_port(const char *format, | 1180 | static 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 | { |