aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wimax/i2400m/control.c12
-rw-r--r--drivers/net/wimax/i2400m/driver.c5
-rw-r--r--drivers/net/wimax/i2400m/i2400m.h4
3 files changed, 16 insertions, 5 deletions
diff --git a/drivers/net/wimax/i2400m/control.c b/drivers/net/wimax/i2400m/control.c
index ac8fb6d07e61..c8b3a68b72b8 100644
--- a/drivers/net/wimax/i2400m/control.c
+++ b/drivers/net/wimax/i2400m/control.c
@@ -52,7 +52,6 @@
52 * 52 *
53 * i2400m_dev_initalize() Called by i2400m_dev_start() 53 * i2400m_dev_initalize() Called by i2400m_dev_start()
54 * i2400m_set_init_config() 54 * i2400m_set_init_config()
55 * i2400m_firmware_check()
56 * i2400m_cmd_get_state() 55 * i2400m_cmd_get_state()
57 * i2400m_dev_shutdown() Called by i2400m_dev_stop() 56 * i2400m_dev_shutdown() Called by i2400m_dev_stop()
58 * i2400m->bus_reset() 57 * i2400m->bus_reset()
@@ -959,6 +958,10 @@ enum {
959 * Long function, but quite simple; first chunk launches the command 958 * Long function, but quite simple; first chunk launches the command
960 * and double checks the reply for the right TLV. Then we process the 959 * and double checks the reply for the right TLV. Then we process the
961 * TLV (where the meat is). 960 * TLV (where the meat is).
961 *
962 * Once we process the TLV that gives us the firmware's interface
963 * version, we encode it and save it in i2400m->fw_version for future
964 * reference.
962 */ 965 */
963int i2400m_firmware_check(struct i2400m *i2400m) 966int i2400m_firmware_check(struct i2400m *i2400m)
964{ 967{
@@ -1018,9 +1021,11 @@ int i2400m_firmware_check(struct i2400m *i2400m)
1018 if (minor < I2400M_HDIv_MINOR_2 && minor > I2400M_HDIv_MINOR) 1021 if (minor < I2400M_HDIv_MINOR_2 && minor > I2400M_HDIv_MINOR)
1019 dev_warn(dev, "untested minor fw version %u.%u.%u\n", 1022 dev_warn(dev, "untested minor fw version %u.%u.%u\n",
1020 major, minor, branch); 1023 major, minor, branch);
1021error_bad_major: 1024 /* Yes, we ignore the branch -- we don't have to track it */
1025 i2400m->fw_version = major << 16 | minor;
1022 dev_info(dev, "firmware interface version %u.%u.%u\n", 1026 dev_info(dev, "firmware interface version %u.%u.%u\n",
1023 major, minor, branch); 1027 major, minor, branch);
1028error_bad_major:
1024error_no_tlv: 1029error_no_tlv:
1025error_cmd_failed: 1030error_cmd_failed:
1026 kfree_skb(ack_skb); 1031 kfree_skb(ack_skb);
@@ -1251,9 +1256,6 @@ int i2400m_dev_initialize(struct i2400m *i2400m)
1251 result = i2400m_set_init_config(i2400m, args, argc); 1256 result = i2400m_set_init_config(i2400m, args, argc);
1252 if (result < 0) 1257 if (result < 0)
1253 goto error; 1258 goto error;
1254 result = i2400m_firmware_check(i2400m); /* fw versions ok? */
1255 if (result < 0)
1256 goto error;
1257 /* 1259 /*
1258 * Update state: Here it just calls a get state; parsing the 1260 * Update state: Here it just calls a get state; parsing the
1259 * result (System State TLV and RF Status TLV [done in the rx 1261 * result (System State TLV and RF Status TLV [done in the rx
diff --git a/drivers/net/wimax/i2400m/driver.c b/drivers/net/wimax/i2400m/driver.c
index e80a0b65a754..69a816e7c5db 100644
--- a/drivers/net/wimax/i2400m/driver.c
+++ b/drivers/net/wimax/i2400m/driver.c
@@ -48,6 +48,7 @@
48 * i2400m_dev_bootstrap() 48 * i2400m_dev_bootstrap()
49 * i2400m_tx_setup() 49 * i2400m_tx_setup()
50 * i2400m->bus_dev_start() 50 * i2400m->bus_dev_start()
51 * i2400m_firmware_check()
51 * i2400m_check_mac_addr() 52 * i2400m_check_mac_addr()
52 * wimax_dev_add() 53 * wimax_dev_add()
53 * 54 *
@@ -404,6 +405,9 @@ retry:
404 dev_err(dev, "cannot create workqueue\n"); 405 dev_err(dev, "cannot create workqueue\n");
405 goto error_create_workqueue; 406 goto error_create_workqueue;
406 } 407 }
408 result = i2400m_firmware_check(i2400m); /* fw versions ok? */
409 if (result < 0)
410 goto error_fw_check;
407 /* At this point is ok to send commands to the device */ 411 /* At this point is ok to send commands to the device */
408 result = i2400m_check_mac_addr(i2400m); 412 result = i2400m_check_mac_addr(i2400m);
409 if (result < 0) 413 if (result < 0)
@@ -421,6 +425,7 @@ retry:
421 425
422error_dev_initialize: 426error_dev_initialize:
423error_check_mac_addr: 427error_check_mac_addr:
428error_fw_check:
424 destroy_workqueue(i2400m->work_queue); 429 destroy_workqueue(i2400m->work_queue);
425error_create_workqueue: 430error_create_workqueue:
426 i2400m->bus_dev_stop(i2400m); 431 i2400m->bus_dev_stop(i2400m);
diff --git a/drivers/net/wimax/i2400m/i2400m.h b/drivers/net/wimax/i2400m/i2400m.h
index ad71ad1086ea..5008cdb12b42 100644
--- a/drivers/net/wimax/i2400m/i2400m.h
+++ b/drivers/net/wimax/i2400m/i2400m.h
@@ -366,6 +366,9 @@ struct i2400m_reset_ctx;
366 * module unloads, as we don't keep each dentry. 366 * module unloads, as we don't keep each dentry.
367 * 367 *
368 * @fw_name: name of the firmware image that is currently being used. 368 * @fw_name: name of the firmware image that is currently being used.
369 *
370 * @fw_version: version of the firmware interface, Major.minor,
371 * encoded in the high word and low word (major << 16 | minor).
369 */ 372 */
370struct i2400m { 373struct i2400m {
371 struct wimax_dev wimax_dev; /* FIRST! See doc */ 374 struct wimax_dev wimax_dev; /* FIRST! See doc */
@@ -424,6 +427,7 @@ struct i2400m {
424 427
425 struct dentry *debugfs_dentry; 428 struct dentry *debugfs_dentry;
426 const char *fw_name; /* name of the current firmware image */ 429 const char *fw_name; /* name of the current firmware image */
430 unsigned long fw_version; /* version of the firmware interface */
427}; 431};
428 432
429 433