Commit 6a0f7ab8 authored by Inaky Perez-Gonzalez's avatar Inaky Perez-Gonzalez Committed by David S. Miller

wimax/i2400m: firmware_check() encodes the firmware version in i2400m->fw_version

Upcoming modifications will need to test for the running firmware
version before activating a feature or not. This is helpful to
implement backward compatibility with older firmware versions.

Modify i2400m_firmware_check() to encode in i2400m->fw_version the
major and minor version numbers of the firmware interface.

As well, move the call to be done as the very first operation once we
have communication with the device during probe() [in
__i2400m_dev_start()]. This is needed so any operation that is
executed afterwards can determine which fw version it is talking to.
Signed-off-by: default avatarInaky Perez-Gonzalez <inaky@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent efa05d0f
...@@ -52,7 +52,6 @@ ...@@ -52,7 +52,6 @@
* *
* i2400m_dev_initalize() Called by i2400m_dev_start() * i2400m_dev_initalize() Called by i2400m_dev_start()
* i2400m_set_init_config() * i2400m_set_init_config()
* i2400m_firmware_check()
* i2400m_cmd_get_state() * i2400m_cmd_get_state()
* i2400m_dev_shutdown() Called by i2400m_dev_stop() * i2400m_dev_shutdown() Called by i2400m_dev_stop()
* i2400m->bus_reset() * i2400m->bus_reset()
...@@ -959,6 +958,10 @@ enum { ...@@ -959,6 +958,10 @@ enum {
* Long function, but quite simple; first chunk launches the command * Long function, but quite simple; first chunk launches the command
* and double checks the reply for the right TLV. Then we process the * and double checks the reply for the right TLV. Then we process the
* TLV (where the meat is). * TLV (where the meat is).
*
* Once we process the TLV that gives us the firmware's interface
* version, we encode it and save it in i2400m->fw_version for future
* reference.
*/ */
int i2400m_firmware_check(struct i2400m *i2400m) int i2400m_firmware_check(struct i2400m *i2400m)
{ {
...@@ -1018,9 +1021,11 @@ int i2400m_firmware_check(struct i2400m *i2400m) ...@@ -1018,9 +1021,11 @@ int i2400m_firmware_check(struct i2400m *i2400m)
if (minor < I2400M_HDIv_MINOR_2 && minor > I2400M_HDIv_MINOR) if (minor < I2400M_HDIv_MINOR_2 && minor > I2400M_HDIv_MINOR)
dev_warn(dev, "untested minor fw version %u.%u.%u\n", dev_warn(dev, "untested minor fw version %u.%u.%u\n",
major, minor, branch); major, minor, branch);
error_bad_major: /* Yes, we ignore the branch -- we don't have to track it */
i2400m->fw_version = major << 16 | minor;
dev_info(dev, "firmware interface version %u.%u.%u\n", dev_info(dev, "firmware interface version %u.%u.%u\n",
major, minor, branch); major, minor, branch);
error_bad_major:
error_no_tlv: error_no_tlv:
error_cmd_failed: error_cmd_failed:
kfree_skb(ack_skb); kfree_skb(ack_skb);
...@@ -1249,9 +1254,6 @@ int i2400m_dev_initialize(struct i2400m *i2400m) ...@@ -1249,9 +1254,6 @@ int i2400m_dev_initialize(struct i2400m *i2400m)
args[argc++] = &idle_params.hdr; args[argc++] = &idle_params.hdr;
} }
result = i2400m_set_init_config(i2400m, args, argc); result = i2400m_set_init_config(i2400m, args, argc);
if (result < 0)
goto error;
result = i2400m_firmware_check(i2400m); /* fw versions ok? */
if (result < 0) if (result < 0)
goto error; goto error;
/* /*
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
* i2400m_dev_bootstrap() * i2400m_dev_bootstrap()
* i2400m_tx_setup() * i2400m_tx_setup()
* i2400m->bus_dev_start() * i2400m->bus_dev_start()
* i2400m_firmware_check()
* i2400m_check_mac_addr() * i2400m_check_mac_addr()
* wimax_dev_add() * wimax_dev_add()
* *
...@@ -404,6 +405,9 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags) ...@@ -404,6 +405,9 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags)
dev_err(dev, "cannot create workqueue\n"); dev_err(dev, "cannot create workqueue\n");
goto error_create_workqueue; goto error_create_workqueue;
} }
result = i2400m_firmware_check(i2400m); /* fw versions ok? */
if (result < 0)
goto error_fw_check;
/* At this point is ok to send commands to the device */ /* At this point is ok to send commands to the device */
result = i2400m_check_mac_addr(i2400m); result = i2400m_check_mac_addr(i2400m);
if (result < 0) if (result < 0)
...@@ -421,6 +425,7 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags) ...@@ -421,6 +425,7 @@ int __i2400m_dev_start(struct i2400m *i2400m, enum i2400m_bri flags)
error_dev_initialize: error_dev_initialize:
error_check_mac_addr: error_check_mac_addr:
error_fw_check:
destroy_workqueue(i2400m->work_queue); destroy_workqueue(i2400m->work_queue);
error_create_workqueue: error_create_workqueue:
i2400m->bus_dev_stop(i2400m); i2400m->bus_dev_stop(i2400m);
......
...@@ -366,6 +366,9 @@ struct i2400m_reset_ctx; ...@@ -366,6 +366,9 @@ struct i2400m_reset_ctx;
* module unloads, as we don't keep each dentry. * module unloads, as we don't keep each dentry.
* *
* @fw_name: name of the firmware image that is currently being used. * @fw_name: name of the firmware image that is currently being used.
*
* @fw_version: version of the firmware interface, Major.minor,
* encoded in the high word and low word (major << 16 | minor).
*/ */
struct i2400m { struct i2400m {
struct wimax_dev wimax_dev; /* FIRST! See doc */ struct wimax_dev wimax_dev; /* FIRST! See doc */
...@@ -424,6 +427,7 @@ struct i2400m { ...@@ -424,6 +427,7 @@ struct i2400m {
struct dentry *debugfs_dentry; struct dentry *debugfs_dentry;
const char *fw_name; /* name of the current firmware image */ const char *fw_name; /* name of the current firmware image */
unsigned long fw_version; /* version of the firmware interface */
}; };
......
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