struct wimax_dev *wimax_dev = &i2400m->wimax_dev;
        struct net_device *net_dev = wimax_dev->net_dev;
        struct device *dev = i2400m_dev(i2400m);
-       int times = 3;
+       int times = i2400m->bus_bm_retries;
 
        d_fnstart(3, dev, "(i2400m %p)\n", i2400m);
 retry:
 
 {
        int ret = 0;
        struct device *dev = i2400m_dev(i2400m);
-       int count = I2400M_BOOT_RETRIES;
+       int count = i2400m->bus_bm_retries;
 
        d_fnstart(5, dev, "(i2400m %p bcf %p size %zu)\n",
                  i2400m, bcf, bcf_size);
 
 enum {
        /* Firmware uploading */
        I2400M_BOOT_RETRIES = 3,
+       I3200_BOOT_RETRIES = 3,
        /* Size of the Boot Mode Command buffer */
        I2400M_BM_CMD_BUF_SIZE = 16 * 1024,
        I2400M_BM_ACK_BUF_SIZE = 256,
  *     process, so it cannot rely on common infrastructure being laid
  *     out.
  *
+ * @bus_bm_retries: [fill] How many times shall a firmware upload /
+ *     device initialization be retried? Different models of the same
+ *     device might need different values, hence it is set by the
+ *     bus-specific driver. Note this value is used in two places,
+ *     i2400m_fw_dnload() and __i2400m_dev_start(); they won't become
+ *     multiplicative (__i2400m_dev_start() calling N times
+ *     i2400m_fw_dnload() and this trying N times to download the
+ *     firmware), as if __i2400m_dev_start() only retries if the
+ *     firmware crashed while initializing the device (not in a
+ *     general case).
+ *
  * @bus_bm_cmd_send: [fill] Function called to send a boot-mode
  *     command. Flags are defined in 'enum i2400m_bm_cmd_flags'. This
  *     is synchronous and has to return 0 if ok or < 0 errno code in
 
        size_t bus_tx_block_size;
        size_t bus_pl_size_max;
+       unsigned bus_bm_retries;
+
        int (*bus_dev_start)(struct i2400m *);
        void (*bus_dev_stop)(struct i2400m *);
        void (*bus_tx_kick)(struct i2400m *);
 
        i2400m->bus_dev_stop = i2400ms_bus_dev_stop;
        i2400m->bus_tx_kick = i2400ms_bus_tx_kick;
        i2400m->bus_reset = i2400ms_bus_reset;
+       /* The iwmc3200-wimax sometimes requires the driver to try
+        * hard when we paint it into a corner. */
+       i2400m->bus_bm_retries = I3200_BOOT_RETRIES;
        i2400m->bus_bm_cmd_send = i2400ms_bus_bm_cmd_send;
        i2400m->bus_bm_wait_for_ack = i2400ms_bus_bm_wait_for_ack;
        i2400m->bus_fw_names = i2400ms_bus_fw_names;
 
        i2400m->bus_dev_stop = i2400mu_bus_dev_stop;
        i2400m->bus_tx_kick = i2400mu_bus_tx_kick;
        i2400m->bus_reset = i2400mu_bus_reset;
+       i2400m->bus_bm_retries = I2400M_BOOT_RETRIES;
        i2400m->bus_bm_cmd_send = i2400mu_bus_bm_cmd_send;
        i2400m->bus_bm_wait_for_ack = i2400mu_bus_bm_wait_for_ack;
        i2400m->bus_fw_names = i2400mu_bus_fw_names;