IB/hfi1: Correctly report neighbor link down reason
authorDean Luick <dean.luick@intel.com>
Thu, 14 Apr 2016 15:31:42 +0000 (08:31 -0700)
committerDoug Ledford <dledford@redhat.com>
Thu, 28 Apr 2016 20:32:29 +0000 (16:32 -0400)
The code to save the link down reason for reporting to the SMA
was in a location before the actual reason was read.  Move the
SMA link down reason assignment to a better location.

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

index 45ff8aea913209fb94b94f4f75ef1ef41733006c..dcae8e723f98921dac1a7f7f672d06f7bb0f87e5 100644 (file)
@@ -6951,6 +6951,15 @@ void handle_link_down(struct work_struct *work)
 
        set_link_down_reason(ppd, lcl_reason, neigh_reason, 0);
 
+       /* inform the SMA when the link transitions from up to down */
+       if (was_up && ppd->local_link_down_reason.sma == 0 &&
+           ppd->neigh_link_down_reason.sma == 0) {
+               ppd->local_link_down_reason.sma =
+                                       ppd->local_link_down_reason.latest;
+               ppd->neigh_link_down_reason.sma =
+                                       ppd->neigh_link_down_reason.latest;
+       }
+
        reset_neighbor_info(ppd);
 
        /* disable the port */
@@ -10106,7 +10115,6 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
        struct hfi1_devdata *dd = ppd->dd;
        struct ib_event event = {.device = NULL};
        int ret1, ret = 0;
-       int was_up, is_down;
        int orig_new_state, poll_bounce;
 
        mutex_lock(&ppd->hls_lock);
@@ -10125,8 +10133,6 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
                    poll_bounce ? "(bounce) " : "",
                    link_state_reason_name(ppd, state));
 
-       was_up = !!(ppd->host_link_state & HLS_UP);
-
        /*
         * If we're going to a (HLS_*) link state that implies the logical
         * link state is neither of (IB_PORT_ARMED, IB_PORT_ACTIVE), then
@@ -10337,17 +10343,6 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
                break;
        }
 
-       is_down = !!(ppd->host_link_state & (HLS_DN_POLL |
-                       HLS_DN_DISABLE | HLS_DN_OFFLINE));
-
-       if (was_up && is_down && ppd->local_link_down_reason.sma == 0 &&
-           ppd->neigh_link_down_reason.sma == 0) {
-               ppd->local_link_down_reason.sma =
-                 ppd->local_link_down_reason.latest;
-               ppd->neigh_link_down_reason.sma =
-                 ppd->neigh_link_down_reason.latest;
-       }
-
        goto done;
 
 unexpected: