mlx4: capability for link sensing
authorYevgeny Petrilin <yevgenyp@mellanox.co.il>
Mon, 19 Dec 2011 04:00:26 +0000 (04:00 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 19 Dec 2011 19:57:06 +0000 (14:57 -0500)
For ConnectX3 devices, we allow link sensing only if FW explicitly
reported it supports the feature.
For older versions (ConnectX1 and 2), if the card supports both link layer types
(Ethenet and Infiniband), link sensing is supported.

Signed-off-by: Yevgeny Petrilin <yevgenyp@mellanox.co.il>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/mellanox/mlx4/main.c
include/linux/mlx4/device.h

index b969bfb569e36a379badf3782f6732a921d976ba..8f7314394cc228b9761eddbaa4a19be1141db91b 100644 (file)
@@ -274,6 +274,10 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
        dev->caps.stat_rate_support  = dev_cap->stat_rate_support;
        dev->caps.max_gso_sz         = dev_cap->max_gso_sz;
 
+       /* Sense port always allowed on supported devices for ConnectX1 and 2 */
+       if (dev->pdev->device != 0x1003)
+               dev->caps.flags |= MLX4_DEV_CAP_FLAG_SENSE_SUPPORT;
+
        dev->caps.log_num_macs  = log_num_mac;
        dev->caps.log_num_vlans = MLX4_LOG_NUM_VLANS;
        dev->caps.log_num_prios = use_prio ? 3 : 0;
@@ -311,7 +315,8 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
                }
                dev->caps.possible_type[i] = dev->caps.port_type[i];
                mlx4_priv(dev)->sense.sense_allowed[i] =
-                       dev->caps.supported_type[i] == MLX4_PORT_TYPE_AUTO;
+                       ((dev->caps.supported_type[i] == MLX4_PORT_TYPE_AUTO) &&
+                        (dev->caps.flags & MLX4_DEV_CAP_FLAG_SENSE_SUPPORT));
 
                if (dev->caps.log_num_macs > dev_cap->log_max_macs[i]) {
                        dev->caps.log_num_macs = dev_cap->log_max_macs[i];
@@ -583,7 +588,8 @@ static ssize_t set_port_type(struct device *dev,
                        types[i] = mdev->caps.port_type[i+1];
        }
 
-       if (!(mdev->caps.flags & MLX4_DEV_CAP_FLAG_DPDP)) {
+       if (!(mdev->caps.flags & MLX4_DEV_CAP_FLAG_DPDP) &&
+           !(mdev->caps.flags & MLX4_DEV_CAP_FLAG_SENSE_SUPPORT)) {
                for (i = 1; i <= mdev->caps.num_ports; i++) {
                        if (mdev->caps.possible_type[i] == MLX4_PORT_TYPE_AUTO) {
                                mdev->caps.possible_type[i] = mdev->caps.port_type[i];
index 5f784ff6a36ef83e725181e07a2145308e356b99..b06a44ba1565552a70b1bd9aba629ee2df68835a 100644 (file)
@@ -94,7 +94,8 @@ enum {
        MLX4_DEV_CAP_FLAG_UDP_RSS       = 1LL << 40,
        MLX4_DEV_CAP_FLAG_VEP_UC_STEER  = 1LL << 41,
        MLX4_DEV_CAP_FLAG_VEP_MC_STEER  = 1LL << 42,
-       MLX4_DEV_CAP_FLAG_COUNTERS      = 1LL << 48
+       MLX4_DEV_CAP_FLAG_COUNTERS      = 1LL << 48,
+       MLX4_DEV_CAP_FLAG_SENSE_SUPPORT = 1LL << 55
 };
 
 #define MLX4_ATTR_EXTENDED_PORT_INFO   cpu_to_be16(0xff90)