static
 int i2400m_dnload_init_nonsigned(struct i2400m *i2400m)
 {
-#define POKE(a, d) {                                   \
-       .address = cpu_to_le32(a),              \
-       .data = cpu_to_le32(d)          \
-}
-       static const struct {
-               __le32 address;
-               __le32 data;
-       } i2400m_pokes[] = {
-               POKE(0x081A58, 0xA7810230),
-               POKE(0x080040, 0x00000000),
-               POKE(0x080048, 0x00000082),
-               POKE(0x08004C, 0x0000081F),
-               POKE(0x080054, 0x00000085),
-               POKE(0x080058, 0x00000180),
-               POKE(0x08005C, 0x00000018),
-               POKE(0x080060, 0x00000010),
-               POKE(0x080574, 0x00000001),
-               POKE(0x080550, 0x00000005),
-               POKE(0xAE0000, 0x00000000),
-       };
-#undef POKE
-       unsigned i;
-       int ret;
+       unsigned i = 0;
+       int ret = 0;
        struct device *dev = i2400m_dev(i2400m);
-
-       dev_warn(dev, "WARNING!!! non-signed boot UNTESTED PATH!\n");
-
        d_fnstart(5, dev, "(i2400m %p)\n", i2400m);
-       for (i = 0; i < ARRAY_SIZE(i2400m_pokes); i++) {
-               ret = i2400m_download_chunk(i2400m, &i2400m_pokes[i].data,
-                                           sizeof(i2400m_pokes[i].data),
-                                           i2400m_pokes[i].address, 1, 1);
-               if (ret < 0)
-                       break;
+       if (i2400m->bus_bm_pokes_table) {
+               while (i2400m->bus_bm_pokes_table[i].address) {
+                       ret = i2400m_download_chunk(
+                               i2400m,
+                               &i2400m->bus_bm_pokes_table[i].data,
+                               sizeof(i2400m->bus_bm_pokes_table[i].data),
+                               i2400m->bus_bm_pokes_table[i].address, 1, 1);
+                       if (ret < 0)
+                               break;
+                       i++;
+               }
        }
        d_fnend(5, dev, "(i2400m %p) = %d\n", i2400m, ret);
        return ret;
 
        I2400M_BM_ACK_BUF_SIZE = 256,
 };
 
+/**
+ * struct i2400m_poke_table - Hardware poke table for the Intel 2400m
+ *
+ * This structure will be used to create a device specific poke table
+ * to put the device in a consistant state at boot time.
+ *
+ * @address: The device address to poke
+ *
+ * @data: The data value to poke to the device address
+ *
+ */
+struct i2400m_poke_table{
+       __le32 address;
+       __le32 data;
+};
+
+#define I2400M_FW_POKE(a, d) {         \
+       .address = cpu_to_le32(a),      \
+       .data = cpu_to_le32(d)          \
+}
+
 
 /**
  * i2400m_reset_type - methods to reset a device
  *     address provided in boot mode is kind of broken and needs to
  *     be re-read later on.
  *
+ * @bus_bm_pokes_table: [fill/optional] A table of device addresses
+ *     and values that will be poked at device init time to move the
+ *     device to the correct state for the type of boot/firmware being
+ *     used.  This table MUST be terminated with (0x000000,
+ *     0x00000000) or bad things will happen.
+ *
  *
  * @wimax_dev: WiMAX generic device for linkage into the kernel WiMAX
  *     stack. Due to the way a net_device is allocated, we need to
                                       struct i2400m_bootrom_header *, size_t);
        const char **bus_fw_names;
        unsigned bus_bm_mac_addr_impaired:1;
+       const struct i2400m_poke_table *bus_bm_pokes_table;
 
        spinlock_t tx_lock;             /* protect TX state */
        void *tx_buf;