Commit 5d7969bf authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

iwlagn: separate firmware version warning

We sometimes need to support new firmware API for
a while before we can publish them since testing
them fully takes a long time. We could keep all
the new code private, but that causes plenty of
problems and sometimes we can give a pre-release
version of firmware to people who need to test.
However, when we just bump the API version, the
driver will warn everybody that their firmware is
outdated, when in fact it isn't. (Currently our
case for this doesn't really change the API but
bumping the API version is necessary because the
firmware isn't fully backward compatible)

In order to handle this in the future, add a new
"api_ok" version; only below this will the driver
warn that the uCode is too old.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarWey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 306584c0
...@@ -951,6 +951,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) ...@@ -951,6 +951,7 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
int err; int err;
struct iwlagn_firmware_pieces pieces; struct iwlagn_firmware_pieces pieces;
const unsigned int api_max = priv->cfg->ucode_api_max; const unsigned int api_max = priv->cfg->ucode_api_max;
unsigned int api_ok = priv->cfg->ucode_api_ok;
const unsigned int api_min = priv->cfg->ucode_api_min; const unsigned int api_min = priv->cfg->ucode_api_min;
u32 api_ver; u32 api_ver;
char buildstr[25]; char buildstr[25];
...@@ -961,10 +962,13 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) ...@@ -961,10 +962,13 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE, IWL_DEFAULT_STANDARD_PHY_CALIBRATE_TBL_SIZE,
}; };
if (!api_ok)
api_ok = api_max;
memset(&pieces, 0, sizeof(pieces)); memset(&pieces, 0, sizeof(pieces));
if (!ucode_raw) { if (!ucode_raw) {
if (priv->fw_index <= priv->cfg->ucode_api_max) if (priv->fw_index <= api_ok)
IWL_ERR(priv, IWL_ERR(priv,
"request for firmware file '%s' failed.\n", "request for firmware file '%s' failed.\n",
priv->firmware_name); priv->firmware_name);
...@@ -1010,12 +1014,18 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context) ...@@ -1010,12 +1014,18 @@ static void iwl_ucode_callback(const struct firmware *ucode_raw, void *context)
goto try_again; goto try_again;
} }
if (api_ver != api_max) if (api_ver < api_ok) {
IWL_ERR(priv, if (api_ok != api_max)
"Firmware has old API version. Expected v%u, " IWL_ERR(priv, "Firmware has old API version, "
"got v%u. New firmware can be obtained " "expected v%u through v%u, got v%u.\n",
"from http://www.intellinuxwireless.org.\n", api_ok, api_max, api_ver);
else
IWL_ERR(priv, "Firmware has old API version, "
"expected v%u, got v%u.\n",
api_max, api_ver); api_max, api_ver);
IWL_ERR(priv, "New firmware can be obtained from "
"http://www.intellinuxwireless.org/.\n");
}
} }
if (build) if (build)
......
...@@ -194,6 +194,8 @@ struct iwl_ht_params { ...@@ -194,6 +194,8 @@ struct iwl_ht_params {
* (.ucode) will be added to filename before loading from disk. The * (.ucode) will be added to filename before loading from disk. The
* filename is constructed as fw_name_pre<api>.ucode. * filename is constructed as fw_name_pre<api>.ucode.
* @ucode_api_max: Highest version of uCode API supported by driver. * @ucode_api_max: Highest version of uCode API supported by driver.
* @ucode_api_ok: oldest version of the uCode API that is OK to load
* without a warning, for use in transitions
* @ucode_api_min: Lowest version of uCode API supported by driver. * @ucode_api_min: Lowest version of uCode API supported by driver.
* @valid_tx_ant: valid transmit antenna * @valid_tx_ant: valid transmit antenna
* @valid_rx_ant: valid receive antenna * @valid_rx_ant: valid receive antenna
...@@ -237,6 +239,7 @@ struct iwl_cfg { ...@@ -237,6 +239,7 @@ struct iwl_cfg {
const char *name; const char *name;
const char *fw_name_pre; const char *fw_name_pre;
const unsigned int ucode_api_max; const unsigned int ucode_api_max;
const unsigned int ucode_api_ok;
const unsigned int ucode_api_min; const unsigned int ucode_api_min;
u8 valid_tx_ant; u8 valid_tx_ant;
u8 valid_rx_ant; u8 valid_rx_ant;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment