staging/rdma/hfi1: Reset firmware instead of reloading Sbus
authorCaz Yokoyama <caz.yokoyama@intel.com>
Mon, 26 Oct 2015 14:28:34 +0000 (10:28 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 27 Oct 2015 08:19:22 +0000 (17:19 +0900)
Reset firmware instead of reloading Sbus firmware if it's already done for this
ASIC.  To work around thermal polling problem in firmware, don't reload Sbus
firmware, instead, reset the firmware on the initialization of the second HFI.

Reviewed-by: Easwar Hariharan <easwar.hariharan@intel.com>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: Dean Luick <dean.luick@intel.com>
Signed-off-by: Caz Yokoyama <caz.yokoyama@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rdma/hfi1/chip.h
drivers/staging/rdma/hfi1/firmware.c
drivers/staging/rdma/hfi1/pcie.c

index f89a432c7334eef851c8b675f5e7660c2f4fea8d..497c5de23d533082ca67a5c0f087ce0b5adf4f1e 100644 (file)
@@ -609,6 +609,7 @@ static inline void write_uctxt_csr(struct hfi1_devdata *dd, int ctxt,
 u64 create_pbc(struct hfi1_pportdata *ppd, u64, int, u32, u32);
 
 /* firmware.c */
+#define SBUS_MASTER_BROADCAST 0xfd
 #define NUM_PCIE_SERDES 16     /* number of PCIe serdes on the SBus */
 extern const u8 pcie_serdes_broadcast[];
 extern const u8 pcie_pcs_addrs[2][NUM_PCIE_SERDES];
index 15c9cb7a3150b78a245694fe05b94b036573d0fb..ace75ce3da3fe8b6a72d44051221ec5d9d1d9af0 100644 (file)
@@ -924,9 +924,6 @@ static int load_8051_firmware(struct hfi1_devdata *dd,
        return 0;
 }
 
-/* SBus Master broadcast address */
-#define SBUS_MASTER_BROADCAST 0xfd
-
 /*
  * Write the SBus request register
  *
@@ -1255,6 +1252,7 @@ int load_firmware(struct hfi1_devdata *dd)
                        ret = load_sbus_firmware(dd, &fw_sbus);
                        if (ret)
                                goto clear;
+                       fw_sbus_load = 0;
                }
 
                if (fw_fabric_serdes_load) {
index ac5653c0f65e0fe032327a55706e810a267ea827..3b50cdda1c0aa18b2330ec654f0ed061ca944d97 100644 (file)
@@ -946,9 +946,20 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
                            __func__);
        }
 
+retry:
+       if (therm) {
+               /* toggle SPICO_ENABLE to get back to the state
+                  just after the firmware load */
+               sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
+                       WRITE_SBUS_RECEIVER, 0x00000040);
+               sbus_request(dd, SBUS_MASTER_BROADCAST, 0x01,
+                       WRITE_SBUS_RECEIVER, 0x00000140);
+               dd_dev_info(dd, "%s: toggle SPICO_ENABLE to reset the bus\n",
+                           __func__);
+       }
+
        /* step 3: download SBus Master firmware */
        /* step 4: download PCIe Gen3 SerDes firmware */
-retry:
        dd_dev_info(dd, "%s: downloading firmware\n", __func__);
        ret = load_pcie_firmware(dd);
        if (ret)