};
 
 struct brcmf_usb_image {
-       void *data;
-       u32 len;
+       struct list_head list;
+       s8 *fwname;
+       u8 *image;
+       int image_len;
 };
-static struct brcmf_usb_image g_image = { NULL, 0 };
+static struct list_head fw_image_list;
 
 struct intr_transfer_buf {
        u32 notification;
 {
        brcmf_dbg(TRACE, "devinfo %p\n", devinfo);
 
-       /* store the image globally */
-       g_image.data = devinfo->image;
-       g_image.len = devinfo->image_len;
-
        /* free the URBS */
        brcmf_usb_free_q(&devinfo->rx_freeq, false);
        brcmf_usb_free_q(&devinfo->tx_freeq, false);
 {
        s8 *fwname;
        const struct firmware *fw;
+       struct brcmf_usb_image *fw_image;
        int err;
 
-       devinfo->image = g_image.data;
-       devinfo->image_len = g_image.len;
-
-       /*
-        * if we have an image we can leave here.
-        */
-       if (devinfo->image)
-               return 0;
-
        switch (devinfo->bus_pub.devid) {
        case 43143:
                fwname = BRCMF_USB_43143_FW_NAME;
                break;
        }
 
+       list_for_each_entry(fw_image, &fw_image_list, list) {
+               if (fw_image->fwname == fwname) {
+                       devinfo->image = fw_image->image;
+                       devinfo->image_len = fw_image->image_len;
+                       return 0;
+               }
+       }
+       /* fw image not yet loaded. Load it now and add to list */
        err = request_firmware(&fw, fwname, devinfo->dev);
        if (!fw) {
                brcmf_dbg(ERROR, "fail to request firmware %s\n", fwname);
                return -EINVAL;
        }
 
-       devinfo->image = vmalloc(fw->size); /* plus nvram */
-       if (!devinfo->image)
+       fw_image = kzalloc(sizeof(*fw_image), GFP_ATOMIC);
+       if (!fw_image)
+               return -ENOMEM;
+       INIT_LIST_HEAD(&fw_image->list);
+       list_add_tail(&fw_image->list, &fw_image_list);
+       fw_image->fwname = fwname;
+       fw_image->image = vmalloc(fw->size);
+       if (!fw_image->image)
                return -ENOMEM;
 
-       memcpy(devinfo->image, fw->data, fw->size);
-       devinfo->image_len = fw->size;
+       memcpy(fw_image->image, fw->data, fw->size);
+       fw_image->image_len = fw->size;
 
        release_firmware(fw);
+
+       devinfo->image = fw_image->image;
+       devinfo->image_len = fw_image->image_len;
+
        return 0;
 }
 
        .disable_hub_initiated_lpm = 1,
 };
 
+static void brcmf_release_fw(struct list_head *q)
+{
+       struct brcmf_usb_image *fw_image, *next;
+
+       list_for_each_entry_safe(fw_image, next, q, list) {
+               vfree(fw_image->image);
+               list_del_init(&fw_image->list);
+       }
+}
+
+
 void brcmf_usb_exit(void)
 {
        usb_deregister(&brcmf_usbdrvr);
-       vfree(g_image.data);
-       g_image.data = NULL;
-       g_image.len = 0;
+       brcmf_release_fw(&fw_image_list);
 }
 
 void brcmf_usb_init(void)
 {
+       INIT_LIST_HEAD(&fw_image_list);
        usb_register(&brcmf_usbdrvr);
 }