*
  * i2400m_dev_initalize()       Called by i2400m_dev_start()
  *   i2400m_set_init_config()
- *   i2400m_firmware_check()
  *   i2400m_cmd_get_state()
  * i2400m_dev_shutdown()        Called by i2400m_dev_stop()
  *   i2400m->bus_reset()
  * Long function, but quite simple; first chunk launches the command
  * and double checks the reply for the right TLV. Then we process the
  * 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)
 {
        if (minor < I2400M_HDIv_MINOR_2 && minor > I2400M_HDIv_MINOR)
                dev_warn(dev, "untested minor fw version %u.%u.%u\n",
                         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",
                 major, minor, branch);
+error_bad_major:
 error_no_tlv:
 error_cmd_failed:
        kfree_skb(ack_skb);
                args[argc++] = &idle_params.hdr;
        }
        result = i2400m_set_init_config(i2400m, args, argc);
-       if (result < 0)
-               goto error;
-       result = i2400m_firmware_check(i2400m); /* fw versions ok? */
        if (result < 0)
                goto error;
        /*
 
  *       i2400m_dev_bootstrap()
  *       i2400m_tx_setup()
  *       i2400m->bus_dev_start()
+ *       i2400m_firmware_check()
  *       i2400m_check_mac_addr()
  *   wimax_dev_add()
  *
                dev_err(dev, "cannot create workqueue\n");
                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 */
        result = i2400m_check_mac_addr(i2400m);
        if (result < 0)
 
 error_dev_initialize:
 error_check_mac_addr:
+error_fw_check:
        destroy_workqueue(i2400m->work_queue);
 error_create_workqueue:
        i2400m->bus_dev_stop(i2400m);
 
  *     module unloads, as we don't keep each dentry.
  *
  * @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 wimax_dev wimax_dev;     /* FIRST! See doc */
 
        struct dentry *debugfs_dentry;
        const char *fw_name;            /* name of the current firmware image */
+       unsigned long fw_version;       /* version of the firmware interface */
 };