aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/ice/ice_controlq.c
diff options
context:
space:
mode:
authorJacob Keller <jacob.e.keller@intel.com>2018-09-19 20:23:07 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2018-09-27 11:16:49 -0400
commit396fbf9cab5dc07f8f87773062a8d35f54b40a05 (patch)
tree929335ced4e0efcd9889381673e5659797806805 /drivers/net/ethernet/intel/ice/ice_controlq.c
parentc185e39afb4f3dea95597deba7d0d5c91aaed204 (diff)
ice: update fw version check logic
We have MAX_FW_API_VER_BRANCH, MAX_FW_API_VER_MAJOR, and MAX_FW_API_VER_MINOR that we use in ice_controlq.h to test when a firmware version is newer than expected. This is currently tested by comparing each field separately. Thus, we compare the branch field against the MAX_FW_API_VER_BRANCH, and so forth. This means that currently, if we suppose that the max firmware version is defined as 0.2.1, i.e. Then firmware 0.1.3 will fail to load. This is because the minor version 3 is greater than the max minor version 1. This is not intuitive, because of the notion that increasing the major firmware version to 2 should mean any firmware version with a major version is less than 2 should be considered older than 2... In order to allow both 0.2.1 and 0.1.3 to load, you would have to define the "max" firmware version as 0.2.3.. It is possible that such a firmware version doesn't even exist yet! Fix this by replacing the current logic with an updated check that behaves as follows: First, we check the major version. If it is greater than the expected version, then we prevent driver load. Additionally, a warning message is logged to indicate to the system administrator that they need to update their driver. This is now the only case where the driver will refuse to load. Second, if the major version is less than the expected version, we log an information message indicating the NVM should be updated. Third, if the major version is exact, we'll then check the minor version. If the minor version is more than two versions less than expected, we log an information message indicating the NVM should be updated. If it is more than two versions greater than the expected version, we log an information message that the driver should be updated. To support this, the ice_aq_ver_check function needs its signature updated to pass the HW structure. Since we now pass this structure, there is no need to pass the firmware API versions separately. Signed-off-by: Jacob Keller <jacob.e.keller@intel.com> Signed-off-by: Anirudh Venkataramanan <anirudh.venkataramanan@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_controlq.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_controlq.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c
index 6cd86cff6a23..b25ce4f587f5 100644
--- a/drivers/net/ethernet/intel/ice/ice_controlq.c
+++ b/drivers/net/ethernet/intel/ice/ice_controlq.c
@@ -518,22 +518,31 @@ shutdown_sq_out:
518 518
519/** 519/**
520 * ice_aq_ver_check - Check the reported AQ API version. 520 * ice_aq_ver_check - Check the reported AQ API version.
521 * @fw_branch: The "branch" of FW, typically describes the device type 521 * @hw: pointer to the hardware structure
522 * @fw_major: The major version of the FW API
523 * @fw_minor: The minor version increment of the FW API
524 * 522 *
525 * Checks if the driver should load on a given AQ API version. 523 * Checks if the driver should load on a given AQ API version.
526 * 524 *
527 * Return: 'true' iff the driver should attempt to load. 'false' otherwise. 525 * Return: 'true' iff the driver should attempt to load. 'false' otherwise.
528 */ 526 */
529static bool ice_aq_ver_check(u8 fw_branch, u8 fw_major, u8 fw_minor) 527static bool ice_aq_ver_check(struct ice_hw *hw)
530{ 528{
531 if (fw_branch != EXP_FW_API_VER_BRANCH) 529 if (hw->api_maj_ver > EXP_FW_API_VER_MAJOR) {
532 return false; 530 /* Major API version is newer than expected, don't load */
533 if (fw_major != EXP_FW_API_VER_MAJOR) 531 dev_warn(ice_hw_to_dev(hw),
534 return false; 532 "The driver for the device stopped because the NVM image is newer than expected. You must install the most recent version of the network driver.\n");
535 if (fw_minor != EXP_FW_API_VER_MINOR)
536 return false; 533 return false;
534 } else if (hw->api_maj_ver == EXP_FW_API_VER_MAJOR) {
535 if (hw->api_min_ver > (EXP_FW_API_VER_MINOR + 2))
536 dev_info(ice_hw_to_dev(hw),
537 "The driver for the device detected a newer version of the NVM image than expected. Please install the most recent version of the network driver.\n");
538 else if ((hw->api_min_ver + 2) < EXP_FW_API_VER_MINOR)
539 dev_info(ice_hw_to_dev(hw),
540 "The driver for the device detected an older version of the NVM image than expected. Please update the NVM image.\n");
541 } else {
542 /* Major API version is older than expected, log a warning */
543 dev_info(ice_hw_to_dev(hw),
544 "The driver for the device detected an older version of the NVM image than expected. Please update the NVM image.\n");
545 }
537 return true; 546 return true;
538} 547}
539 548
@@ -588,8 +597,7 @@ static enum ice_status ice_init_check_adminq(struct ice_hw *hw)
588 if (status) 597 if (status)
589 goto init_ctrlq_free_rq; 598 goto init_ctrlq_free_rq;
590 599
591 if (!ice_aq_ver_check(hw->api_branch, hw->api_maj_ver, 600 if (!ice_aq_ver_check(hw)) {
592 hw->api_min_ver)) {
593 status = ICE_ERR_FW_API_VER; 601 status = ICE_ERR_FW_API_VER;
594 goto init_ctrlq_free_rq; 602 goto init_ctrlq_free_rq;
595 } 603 }