forked from Minki/linux
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:
parent
f4f30031c3
commit
abfc4459c9
@ -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)
|
||||
|
@ -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 @@ retry:
|
||||
|
||||
/* clear the DC reset */
|
||||
write_csr(dd, CCE_DC_CTRL, 0);
|
||||
|
||||
/* Set the LED off */
|
||||
if (is_a0(dd))
|
||||
setextled(dd, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user