IB/hfi1: Ignore non-temperature warnings on a downed link
authorEaswar Hariharan <easwar.hariharan@intel.com>
Thu, 12 May 2016 17:22:33 +0000 (10:22 -0700)
committerDoug Ledford <dledford@redhat.com>
Fri, 13 May 2016 23:39:14 +0000 (19:39 -0400)
QSFP modules can raise an interrupt to inform us of expected conditions
while the link is down, such as RX power low. Actively ignore these
conditions when the link is down as they only add reporting noise.
Continue reporting conditions that are valid at all times, such as
temperature alarms and warnings.

Reviewed-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Easwar Hariharan <easwar.hariharan@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/staging/rdma/hfi1/chip.c
drivers/staging/rdma/hfi1/diag.c
drivers/staging/rdma/hfi1/hfi.h

index dcae8e723f98921dac1a7f7f672d06f7bb0f87e5..f6ae0ba3a3b81dda1b5a10f8da3c7474a6b6d728 100644 (file)
@@ -6105,7 +6105,7 @@ int acquire_lcb_access(struct hfi1_devdata *dd, int sleep_ok)
        }
 
        /* this access is valid only when the link is up */
-       if ((ppd->host_link_state & HLS_UP) == 0) {
+       if (ppd->host_link_state & HLS_DOWN) {
                dd_dev_info(dd, "%s: link state %s not up\n",
                            __func__, link_state_name(ppd->host_link_state));
                ret = -EBUSY;
@@ -7429,7 +7429,7 @@ void apply_link_downgrade_policy(struct hfi1_pportdata *ppd, int refresh_widths)
 retry:
        mutex_lock(&ppd->hls_lock);
        /* only apply if the link is up */
-       if (!(ppd->host_link_state & HLS_UP)) {
+       if (ppd->host_link_state & HLS_DOWN) {
                /* still going up..wait and retry */
                if (ppd->host_link_state & HLS_GOING_UP) {
                        if (++tries < 1000) {
@@ -9252,6 +9252,12 @@ static int handle_qsfp_error_conditions(struct hfi1_pportdata *ppd,
                dd_dev_info(dd, "%s: QSFP cable temperature too low\n",
                            __func__);
 
+       /*
+        * The remaining alarms/warnings don't matter if the link is down.
+        */
+       if (ppd->host_link_state & HLS_DOWN)
+               return 0;
+
        if ((qsfp_interrupt_status[1] & QSFP_HIGH_VCC_ALARM) ||
            (qsfp_interrupt_status[1] & QSFP_HIGH_VCC_WARNING))
                dd_dev_info(dd, "%s: QSFP supply voltage too high\n",
@@ -9346,9 +9352,8 @@ void qsfp_event(struct work_struct *work)
                return;
 
        /*
-        * Turn DC back on after cables has been
-        * re-inserted. Up until now, the DC has been in
-        * reset to save power.
+        * Turn DC back on after cable has been re-inserted. Up until
+        * now, the DC has been in reset to save power.
         */
        dc_start(dd);
 
@@ -10074,7 +10079,7 @@ u32 driver_physical_state(struct hfi1_pportdata *ppd)
  */
 u32 driver_logical_state(struct hfi1_pportdata *ppd)
 {
-       if (ppd->host_link_state && !(ppd->host_link_state & HLS_UP))
+       if (ppd->host_link_state && (ppd->host_link_state & HLS_DOWN))
                return IB_PORT_DOWN;
 
        switch (ppd->host_link_state & HLS_UP) {
index bb2409ad891a7559d47130bc9d9899f5a568d14e..3a679e46fa7df822e9d179445362b198de63436a 100644 (file)
@@ -998,7 +998,7 @@ static long hfi1_assign_snoop_link_credits(struct hfi1_pportdata *ppd,
        u16  per_vl_credits;
        __be16 be_per_vl_credits;
 
-       if (!(ppd->host_link_state & HLS_UP))
+       if (ppd->host_link_state & HLS_DOWN)
                goto err_exit;
        if (total_credits  <  vl15_credits)
                goto err_exit;
index 7b78d56de7f56bdf262582aee1f3f572167b0d93..4aac75f7ce598a438074828050620a358f8ebe88 100644 (file)
@@ -453,6 +453,7 @@ struct rvt_sge_state;
 #define HLS_LINK_COOLDOWN BIT(__HLS_LINK_COOLDOWN_BP)
 
 #define HLS_UP (HLS_UP_INIT | HLS_UP_ARMED | HLS_UP_ACTIVE)
+#define HLS_DOWN ~(HLS_UP)
 
 /* use this MTU size if none other is given */
 #define HFI1_DEFAULT_ACTIVE_MTU 10240