mirror of https://gitee.com/openkylin/linux.git
staging/rdma/hfi1: Make EPROM check per device
Add a variable eprom_available to each device, replacing the global of the same name. This is to allow multiple HFI devices with different EPROM availability to operate correctly on the the same system. Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com> Signed-off-by: Dean Luick <dean.luick@intel.com> Signed-off-by: Jubin John <jubin.john@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:
parent
3fafebb6f6
commit
e154f12716
|
@ -106,10 +106,8 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Use the EP mutex to guard against other callers from within the driver.
|
* Use the EP mutex to guard against other callers from within the driver.
|
||||||
* Also covers usage of eprom_available.
|
|
||||||
*/
|
*/
|
||||||
static DEFINE_MUTEX(eprom_mutex);
|
static DEFINE_MUTEX(eprom_mutex);
|
||||||
static int eprom_available; /* default: not available */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Turn on external enable line that allows writing on the flash.
|
* Turn on external enable line that allows writing on the flash.
|
||||||
|
@ -376,15 +374,13 @@ int handle_eprom_command(struct file *fp, const struct hfi1_cmd *cmd)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* some devices do not have an EPROM */
|
||||||
|
if (!dd->eprom_available)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
/* lock against other callers touching the ASIC block */
|
/* lock against other callers touching the ASIC block */
|
||||||
mutex_lock(&eprom_mutex);
|
mutex_lock(&eprom_mutex);
|
||||||
|
|
||||||
/* some platforms do not have an EPROM */
|
|
||||||
if (!eprom_available) {
|
|
||||||
ret = -ENOSYS;
|
|
||||||
goto done_asic;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* lock against the other HFI on another OS */
|
/* lock against the other HFI on another OS */
|
||||||
ret = acquire_hw_mutex(dd);
|
ret = acquire_hw_mutex(dd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -458,8 +454,6 @@ int eprom_init(struct hfi1_devdata *dd)
|
||||||
|
|
||||||
/* lock against other callers */
|
/* lock against other callers */
|
||||||
mutex_lock(&eprom_mutex);
|
mutex_lock(&eprom_mutex);
|
||||||
if (eprom_available) /* already initialized */
|
|
||||||
goto done_asic;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Lock against the other HFI on another OS - the mutex above
|
* Lock against the other HFI on another OS - the mutex above
|
||||||
|
@ -487,7 +481,7 @@ int eprom_init(struct hfi1_devdata *dd)
|
||||||
/* wake the device with command "release powerdown NoID" */
|
/* wake the device with command "release powerdown NoID" */
|
||||||
write_csr(dd, ASIC_EEP_ADDR_CMD, CMD_RELEASE_POWERDOWN_NOID);
|
write_csr(dd, ASIC_EEP_ADDR_CMD, CMD_RELEASE_POWERDOWN_NOID);
|
||||||
|
|
||||||
eprom_available = 1;
|
dd->eprom_available = true;
|
||||||
release_hw_mutex(dd);
|
release_hw_mutex(dd);
|
||||||
done_asic:
|
done_asic:
|
||||||
mutex_unlock(&eprom_mutex);
|
mutex_unlock(&eprom_mutex);
|
||||||
|
|
|
@ -1145,6 +1145,7 @@ struct hfi1_devdata {
|
||||||
__le64 *rcvhdrtail_dummy_kvaddr;
|
__le64 *rcvhdrtail_dummy_kvaddr;
|
||||||
dma_addr_t rcvhdrtail_dummy_physaddr;
|
dma_addr_t rcvhdrtail_dummy_physaddr;
|
||||||
|
|
||||||
|
bool eprom_available; /* true if EPROM is available for this device */
|
||||||
bool aspm_supported; /* Does HW support ASPM */
|
bool aspm_supported; /* Does HW support ASPM */
|
||||||
bool aspm_enabled; /* ASPM state: enabled/disabled */
|
bool aspm_enabled; /* ASPM state: enabled/disabled */
|
||||||
/* Serialize ASPM enable/disable between multiple verbs contexts */
|
/* Serialize ASPM enable/disable between multiple verbs contexts */
|
||||||
|
|
Loading…
Reference in New Issue