net/mlx4_core: Add bad-cable event support
[cascardo/linux.git] / drivers / net / ethernet / mellanox / mlx4 / eq.c
index 2f2e606..4df006d 100644 (file)
@@ -88,6 +88,8 @@ static u64 get_async_ev_mask(struct mlx4_dev *dev)
        u64 async_ev_mask = MLX4_ASYNC_EVENT_MASK;
        if (dev->caps.flags & MLX4_DEV_CAP_FLAG_PORT_MNG_CHG_EV)
                async_ev_mask |= (1ull << MLX4_EVENT_TYPE_PORT_MNG_CHG_EVENT);
+       if (dev->caps.flags2 & MLX4_DEV_CAP_FLAG2_RECOVERABLE_ERROR_EVENT)
+               async_ev_mask |= (1ull << MLX4_EVENT_TYPE_RECOVERABLE_ERROR_EVENT);
 
        return async_ev_mask;
 }
@@ -736,6 +738,26 @@ static int mlx4_eq_int(struct mlx4_dev *dev, struct mlx4_eq *eq)
                                            (unsigned long) eqe);
                        break;
 
+               case MLX4_EVENT_TYPE_RECOVERABLE_ERROR_EVENT:
+                       switch (eqe->subtype) {
+                       case MLX4_RECOVERABLE_ERROR_EVENT_SUBTYPE_BAD_CABLE:
+                               mlx4_warn(dev, "Bad cable detected on port %u\n",
+                                         eqe->event.bad_cable.port);
+                               break;
+                       case MLX4_RECOVERABLE_ERROR_EVENT_SUBTYPE_UNSUPPORTED_CABLE:
+                               mlx4_warn(dev, "Unsupported cable detected\n");
+                               break;
+                       default:
+                               mlx4_dbg(dev,
+                                        "Unhandled recoverable error event detected: %02x(%02x) on EQ %d at index %u. owner=%x, nent=0x%x, ownership=%s\n",
+                                        eqe->type, eqe->subtype, eq->eqn,
+                                        eq->cons_index, eqe->owner, eq->nent,
+                                        !!(eqe->owner & 0x80) ^
+                                        !!(eq->cons_index & eq->nent) ? "HW" : "SW");
+                               break;
+                       }
+                       break;
+
                case MLX4_EVENT_TYPE_EEC_CATAS_ERROR:
                case MLX4_EVENT_TYPE_ECC_DETECT:
                default: