Add an isp(4) tunable to default to ispfw(4) firmware.

ispfw(4) recently gained firmware for Qlogic 27XX and 28XX
FC controllers, and isp(4) now selects the newer of firmware in
flash or in ispfw(4) to load for those controllers.

This differs from the previous behavior (which remains for older
controllers), which was to always load the ispfw(4) firmware if it
is available.

This adds a loader tunable, hint.isp.N.fwload_force to default to
loading the ispfw(4) firmware, whether or not it is newer than the
firmware in flash.  This allows the user to always use the known
firmware version included with the kernel.

Note that there is an existing fwload_disable tunable that tells
the driver to always load the firmware from flash and ignore
ispfw(4).  If fwload_disable is set, fwload_force will be ignored.
So users with existing fwload_disable tunables will have the same
behavior.

If a user specifies both fwload_force and fwload_disable for the
same controller, the isp(4) driver prints a warning message,
and fwload_disable will be honored.

The user can see which firmware is active through the
dev.isp.N.fw_version* sysctl variables.

share/man/man4/isp.4:
	Document the new loader tunable.

sys/dev/isp/isp.c:
	In isp_load_risc_flash(), changet the decision logic to
	also consider ISP_CFG_FWLOAD_ONLY.  Load the flash firmware
	and get the version, so the user knows what it is, but if
	the user set fwload_force, honor that.  If the user didn't
	set fwload_force, the behavior remains to select the newer
	firmware version.

sys/dev/isp/isp_pci.c:
	Add a new fwload_force tunable.  Print out a warning if the
	user sets both fwload_disable and fwload_force.

sys/dev/isp/ispvar.h:
	Add a new ISP_CFG_FWLOAD_FORCE configuration bit.

Reviewed by:	mav
MFC after:	1 week
Sponsored by:	Spectra Logic
Differential Revision:	<https://reviews.freebsd.org/D45688>
This commit is contained in:
Kenneth D. Merry 2024-06-24 15:42:41 -04:00
parent 137b004e2b
commit 31354813f3
4 changed files with 43 additions and 2 deletions

View file

@ -24,7 +24,7 @@
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
.\"
.Dd October 27, 2023
.Dd June 24, 2024
.Dt ISP 4
.Os
.Sh NAME
@ -141,6 +141,21 @@ Limit on number of Extended Message Signaled Interrupts (MSI-X) to be used.
.It Va hint.isp. Ns Ar N Ns Va .fwload_disable
A hint value to disable loading of firmware provided by
.Xr ispfw 4 .
.It Va hint.isp. Ns Ar N Ns Va .fwload_force
A hint value to prefer firmware provided by
.Xr ispfw 4 ,
even if it is older than the firmware in flash on the board.
If fwload_disable is also specified, fwload_force will be ignored.
.Pp
By default, with 27XX and newer controllers, the
.Xr isp 4
driver will use the newer
firmware.
For older controllers, the
.Xr isp 4
driver will use the firmware provided by
.Xr ispfw 4
if it is available, and otherwise use the firmware in flash on the board.
.It Va hint.isp. Ns Ar N Ns Va .ignore_nvram
A hint value to ignore board NVRAM settings for.
Otherwise use NVRAM settings.

View file

@ -457,7 +457,10 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults)
if (IS_27XX(isp)) {
switch (isp_load_risc(isp, 0)) {
case ISP_ABORTED:
/* download ispfw(4) as it's newer than flash */
/*
* download ispfw(4) as it's newer than flash, or
* the user requested it.
*/
dodnld = 1;
break;
case ISP_SUCCESS:
@ -5222,7 +5225,20 @@ isp_load_risc_flash(ispsoftc_t *isp, uint32_t *srisc_addr, uint32_t faddr)
/* If ispfw(4) is loaded compare versions and use the newest */
if (isp->isp_osinfo.ispfw != NULL) {
int ispfw_newer = 0;
if (ISP_FW_NEWER_THANX(fcp->fw_ispfwrev, fcp->fw_flashrev)) {
ispfw_newer = 1;
}
if (isp->isp_confopts & ISP_CFG_FWLOAD_FORCE) {
isp_prt(isp, ISP_LOGCONFIG,
"Loading RISC with %s ispfw(4) firmware %s",
(ispfw_newer == 0) ? "older" : "newer",
"because fwload_force is set");
return (ISP_ABORTED);
}
if (ispfw_newer != 0) {
isp_prt(isp, ISP_LOGCONFIG,
"Loading RISC with newer ispfw(4) firmware");
return (ISP_ABORTED);

View file

@ -291,6 +291,15 @@ isp_get_generic_options(device_t dev, ispsoftc_t *isp)
isp->isp_confopts |= ISP_CFG_NORELOAD;
}
tval = 0;
if (resource_int_value(device_get_name(dev), device_get_unit(dev), "fwload_force", &tval) == 0 && tval != 0) {
isp->isp_confopts |= ISP_CFG_FWLOAD_FORCE;
}
if ((isp->isp_confopts & (ISP_CFG_NORELOAD|ISP_CFG_FWLOAD_FORCE)) ==
(ISP_CFG_NORELOAD|ISP_CFG_FWLOAD_FORCE)) {
device_printf(dev, "WARNING: both fwload_disable and "
"fwload_force set, ispfw(4) loading disabled\n");
}
tval = 0;
if (resource_int_value(device_get_name(dev), device_get_unit(dev), "ignore_nvram", &tval) == 0 && tval != 0) {
isp->isp_confopts |= ISP_CFG_NONVRAM;
}

View file

@ -612,6 +612,7 @@ struct ispsoftc {
#define ISP_CFG_16GB 0x8000 /* force 16Gb connection (26XX only) */
#define ISP_CFG_32GB 0x10000 /* force 32Gb connection (27XX only) */
#define ISP_CFG_64GB 0x20000 /* force 64Gb connection (28XX only) */
#define ISP_CFG_FWLOAD_FORCE 0x40000 /* Prefer ispfw(4) even if older */
/*
* For each channel, the outer layers should know what role that channel