#include "ipath_kernel.h"
 #include "ipath_registers.h"
 
+static void ipath_setup_ht_setextled(struct ipath_devdata *, u64, u64);
+
+
 /*
  * This lists the InfiniPath registers, in the actual chip layout.
  * This structure should never be directly accessed.
                 * make the complaint once, in case it's stuck
                 * or recurring, and we get here multiple
                 * times.
+                * force link down, so switch knows, and
+                * LEDs are turned off
                 */
-               ipath_dev_err(dd, "%s hardware error\n", msg);
                if (dd->ipath_flags & IPATH_INITTED) {
+                       ipath_set_linkstate(dd, IPATH_IB_LINKDOWN);
+                       ipath_setup_ht_setextled(dd,
+                               INFINIPATH_IBCS_L_STATE_DOWN,
+                               INFINIPATH_IBCS_LT_STATE_DISABLED);
                        ipath_dev_err(dd, "Fatal Hardware Error (freeze "
                                          "mode), no longer usable, SN %.16s\n",
                                          dd->ipath_serial);
        }
        else
                *msg = 0; /* recovered from all of them */
+       if (*msg)
+               ipath_dev_err(dd, "%s hardware error\n", msg);
        if (isfatal && !ipath_diag_inuse && dd->ipath_freezemsg)
                /*
                 * for status file; if no trailing brace is copied,
 
 #include "ipath_kernel.h"
 #include "ipath_registers.h"
 
+static void ipath_setup_pe_setextled(struct ipath_devdata *, u64, u64);
+
 /*
  * This file contains all the chip-specific register information and
  * access functions for the QLogic InfiniPath PCI-Express chip.
                         * if any set that we aren't ignoring only make the
                         * complaint once, in case it's stuck or recurring,
                         * and we get here multiple times
+                        * Force link down, so switch knows, and
+                        * LEDs are turned off
                         */
                        if (dd->ipath_flags & IPATH_INITTED) {
+                               ipath_set_linkstate(dd, IPATH_IB_LINKDOWN);
+                               ipath_setup_pe_setextled(dd,
+                                       INFINIPATH_IBCS_L_STATE_DOWN,
+                                       INFINIPATH_IBCS_LT_STATE_DISABLED);
                                ipath_dev_err(dd, "Fatal Hardware Error (freeze "
                                              "mode), no longer usable, SN %.16s\n",
                                                  dd->ipath_serial);
                                 dd->ipath_hwerrmask);
        }
 
-       ipath_dev_err(dd, "%s hardware error\n", msg);
+       if (*msg)
+               ipath_dev_err(dd, "%s hardware error\n", msg);
        if (isfatal && !ipath_diag_inuse && dd->ipath_freezemsg) {
                /*
                 * for /sys status file ; if no trailing } is copied, we'll