diff options
author | Steve Wise <swise@opengridcomputing.com> | 2009-05-27 17:42:36 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2009-05-27 17:42:36 -0400 |
commit | 7ab1a2b31d4a8b4f519ccff5a84c53a5b87fd1be (patch) | |
tree | d11363c949e8f15b3f933e3839374dacef0429ac /drivers/infiniband | |
parent | 210af919c949a7d6bd330916ef376cec2907d81e (diff) |
RDMA/cxgb3: Report correct port state and MTU
Signed-off-by: Steve Wise <swise@opengridcomputing.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/hw/cxgb3/iwch_provider.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/infiniband/hw/cxgb3/iwch_provider.c b/drivers/infiniband/hw/cxgb3/iwch_provider.c index 160ef482712d..e2a63214008a 100644 --- a/drivers/infiniband/hw/cxgb3/iwch_provider.c +++ b/drivers/infiniband/hw/cxgb3/iwch_provider.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include <linux/spinlock.h> | 40 | #include <linux/spinlock.h> |
41 | #include <linux/ethtool.h> | 41 | #include <linux/ethtool.h> |
42 | #include <linux/rtnetlink.h> | 42 | #include <linux/rtnetlink.h> |
43 | #include <linux/inetdevice.h> | ||
43 | 44 | ||
44 | #include <asm/io.h> | 45 | #include <asm/io.h> |
45 | #include <asm/irq.h> | 46 | #include <asm/irq.h> |
@@ -1152,12 +1153,39 @@ static int iwch_query_device(struct ib_device *ibdev, | |||
1152 | static int iwch_query_port(struct ib_device *ibdev, | 1153 | static int iwch_query_port(struct ib_device *ibdev, |
1153 | u8 port, struct ib_port_attr *props) | 1154 | u8 port, struct ib_port_attr *props) |
1154 | { | 1155 | { |
1156 | struct iwch_dev *dev; | ||
1157 | struct net_device *netdev; | ||
1158 | struct in_device *inetdev; | ||
1159 | |||
1155 | PDBG("%s ibdev %p\n", __func__, ibdev); | 1160 | PDBG("%s ibdev %p\n", __func__, ibdev); |
1156 | 1161 | ||
1162 | dev = to_iwch_dev(ibdev); | ||
1163 | netdev = dev->rdev.port_info.lldevs[port-1]; | ||
1164 | |||
1157 | memset(props, 0, sizeof(struct ib_port_attr)); | 1165 | memset(props, 0, sizeof(struct ib_port_attr)); |
1158 | props->max_mtu = IB_MTU_4096; | 1166 | props->max_mtu = IB_MTU_4096; |
1159 | props->active_mtu = IB_MTU_2048; | 1167 | if (netdev->mtu >= 4096) |
1160 | props->state = IB_PORT_ACTIVE; | 1168 | props->active_mtu = IB_MTU_4096; |
1169 | else if (netdev->mtu >= 2048) | ||
1170 | props->active_mtu = IB_MTU_2048; | ||
1171 | else if (netdev->mtu >= 1024) | ||
1172 | props->active_mtu = IB_MTU_1024; | ||
1173 | else if (netdev->mtu >= 512) | ||
1174 | props->active_mtu = IB_MTU_512; | ||
1175 | else | ||
1176 | props->active_mtu = IB_MTU_256; | ||
1177 | |||
1178 | if (!netif_carrier_ok(netdev)) | ||
1179 | props->state = IB_PORT_DOWN; | ||
1180 | else { | ||
1181 | inetdev = in_dev_get(netdev); | ||
1182 | if (inetdev->ifa_list) | ||
1183 | props->state = IB_PORT_ACTIVE; | ||
1184 | else | ||
1185 | props->state = IB_PORT_INIT; | ||
1186 | in_dev_put(inetdev); | ||
1187 | } | ||
1188 | |||
1161 | props->port_cap_flags = | 1189 | props->port_cap_flags = |
1162 | IB_PORT_CM_SUP | | 1190 | IB_PORT_CM_SUP | |
1163 | IB_PORT_SNMP_TUNNEL_SUP | | 1191 | IB_PORT_SNMP_TUNNEL_SUP | |