{
        struct hfi1_devdata *dd = ppd->dd;
 
+       /*
+        * This pairs with the memory barrier implied by the atomic_dec in
+        * hfi1_set_led_override to ensure that we read the correct state of
+        * LED beaconing represented by led_override_timer_active
+        */
+       smp_mb();
        if (atomic_read(&ppd->led_override_timer_active)) {
                del_timer_sync(&ppd->led_override_timer);
                atomic_set(&ppd->led_override_timer_active, 0);
         * don't re-fire the timer if user asked for it to be off; we let
         * it fire one more time after they turn it off to simplify
         */
-       if (ppd->led_override_vals[0] || ppd->led_override_vals[1])
+       if (ppd->led_override_vals[0] || ppd->led_override_vals[1]) {
                mod_timer(&ppd->led_override_timer, jiffies + timeout);
-       else
+       } else {
                /* Hand control of the LED to the DC for normal operation */
                write_csr(dd, DCC_CFG_LED_CNTRL, 0);
+               /* Record that we did not re-fire the timer */
+               atomic_dec(&ppd->led_override_timer_active);
+       }
 }
 
 /*
 
        struct opa_port_info *pi = (struct opa_port_info *)data;
        u8 mtu;
        u8 credit_rate;
+       u8 is_beaconing_active;
        u32 state;
        u32 num_ports = OPA_AM_NPORT(am);
        u32 start_of_sm_config = OPA_AM_START_SM_CFG(am);
        pi->port_states.ledenable_offlinereason = ppd->neighbor_normal << 4;
        pi->port_states.ledenable_offlinereason |=
                ppd->is_sm_config_started << 5;
+       /*
+        * This pairs with the memory barrier implied by the atomic_dec in
+        * hfi1_set_led_override to ensure that we read the correct state of
+        * LED beaconing represented by led_override_timer_active
+        */
+       smp_mb();
+       is_beaconing_active = !!atomic_read(&ppd->led_override_timer_active);
+       pi->port_states.ledenable_offlinereason |= is_beaconing_active << 6;
        pi->port_states.ledenable_offlinereason |=
                ppd->offline_disabled_reason;
 #else
                                   u32 *resp_len)
 {
        struct hfi1_devdata *dd = dd_from_ibdev(ibdev);
+       struct hfi1_pportdata *ppd = dd->pport;
        struct opa_led_info *p = (struct opa_led_info *)data;
        u32 nport = OPA_AM_NPORT(am);
-       u64 reg;
+       u32 is_beaconing_active;
 
        if (nport != 1) {
                smp->status |= IB_SMP_INVALID_FIELD;
                return reply((struct ib_mad_hdr *)smp);
        }
 
-       reg = read_csr(dd, DCC_CFG_LED_CNTRL);
-       if ((reg & DCC_CFG_LED_CNTRL_LED_CNTRL_SMASK) &&
-           ((reg & DCC_CFG_LED_CNTRL_LED_SW_BLINK_RATE_SMASK) == 0xf))
-               p->rsvd_led_mask = cpu_to_be32(OPA_LED_MASK);
+       /*
+        * This pairs with the memory barrier implied by the atomic_dec in
+        * hfi1_set_led_override to ensure that we read the correct state of
+        * LED beaconing represented by led_override_timer_active
+        */
+       smp_mb();
+       is_beaconing_active = !!atomic_read(&ppd->led_override_timer_active);
+       p->rsvd_led_mask = cpu_to_be32(is_beaconing_active << OPA_LED_SHIFT);
 
        if (resp_len)
                *resp_len += sizeof(struct opa_led_info);