staging/rdma/hfi1: Load SBus firmware once per ASIC

Using fw_sbus_load to control SBus firmware load doesn't scale across multiple
HFI1 cards in a single system. This patch ensures that the SBus firmware is
loaded once per ASIC.

Reviewed-by: Dean Luick <dean.luick@intel.com>
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Easwar Hariharan <easwar.hariharan@intel.com>
Signed-off-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Easwar Hariharan 2015-10-26 10:28:46 -04:00 committed by Greg Kroah-Hartman
parent f4f30031c3
commit abfc4459c9
2 changed files with 14 additions and 27 deletions

View File

@ -1236,35 +1236,20 @@ int load_firmware(struct hfi1_devdata *dd)
{
int ret;
if (fw_sbus_load || fw_fabric_serdes_load) {
if (fw_fabric_serdes_load) {
ret = acquire_hw_mutex(dd);
if (ret)
return ret;
set_sbus_fast_mode(dd);
/*
* The SBus contains part of the fabric firmware and so must
* also be downloaded.
*/
if (fw_sbus_load) {
turn_off_spicos(dd, SPICO_SBUS);
ret = load_sbus_firmware(dd, &fw_sbus);
if (ret)
goto clear;
fw_sbus_load = 0;
}
set_serdes_broadcast(dd, all_fabric_serdes_broadcast,
fabric_serdes_broadcast[dd->hfi1_id],
fabric_serdes_addrs[dd->hfi1_id],
NUM_FABRIC_SERDES);
turn_off_spicos(dd, SPICO_FABRIC);
ret = load_fabric_serdes_firmware(dd, &fw_fabric);
if (fw_fabric_serdes_load) {
set_serdes_broadcast(dd, all_fabric_serdes_broadcast,
fabric_serdes_broadcast[dd->hfi1_id],
fabric_serdes_addrs[dd->hfi1_id],
NUM_FABRIC_SERDES);
turn_off_spicos(dd, SPICO_FABRIC);
ret = load_fabric_serdes_firmware(dd, &fw_fabric);
}
clear:
clear_sbus_fast_mode(dd);
release_hw_mutex(dd);
if (ret)
@ -1583,7 +1568,7 @@ int load_pcie_firmware(struct hfi1_devdata *dd)
/* both firmware loads below use the SBus */
set_sbus_fast_mode(dd);
if (fw_sbus_load) {
if (fw_sbus_load && (dd->flags & HFI1_DO_INIT_ASIC)) {
turn_off_spicos(dd, SPICO_SBUS);
ret = load_sbus_firmware(dd, &fw_sbus);
if (ret)

View File

@ -947,15 +947,16 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
}
retry:
if (therm) {
/* toggle SPICO_ENABLE to get back to the state
just after the firmware load */
/*
* 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 */
@ -1198,6 +1199,7 @@ int do_pcie_gen3_transition(struct hfi1_devdata *dd)
/* clear the DC reset */
write_csr(dd, CCE_DC_CTRL, 0);
/* Set the LED off */
if (is_a0(dd))
setextled(dd, 0);