Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: ISC
0002 /*
0003  * Copyright (c) 2011 Broadcom Corporation
0004  */
0005 
0006 #include <linux/kernel.h>
0007 #include <linux/module.h>
0008 #include <linux/firmware.h>
0009 #include <linux/usb.h>
0010 #include <linux/vmalloc.h>
0011 
0012 #include <brcmu_utils.h>
0013 #include <brcm_hw_ids.h>
0014 #include <brcmu_wifi.h>
0015 #include "bus.h"
0016 #include "debug.h"
0017 #include "firmware.h"
0018 #include "usb.h"
0019 #include "core.h"
0020 #include "common.h"
0021 #include "bcdc.h"
0022 
0023 
0024 #define IOCTL_RESP_TIMEOUT      msecs_to_jiffies(2000)
0025 
0026 #define BRCMF_USB_RESET_GETVER_SPINWAIT 100 /* in unit of ms */
0027 #define BRCMF_USB_RESET_GETVER_LOOP_CNT 10
0028 
0029 #define BRCMF_POSTBOOT_ID       0xA123  /* ID to detect if dongle
0030                            has boot up */
0031 #define BRCMF_USB_NRXQ          50
0032 #define BRCMF_USB_NTXQ          50
0033 
0034 #define BRCMF_USB_CBCTL_WRITE       0
0035 #define BRCMF_USB_CBCTL_READ        1
0036 #define BRCMF_USB_MAX_PKT_SIZE      1600
0037 
0038 BRCMF_FW_DEF(43143, "brcmfmac43143");
0039 BRCMF_FW_DEF(43236B, "brcmfmac43236b");
0040 BRCMF_FW_DEF(43242A, "brcmfmac43242a");
0041 BRCMF_FW_DEF(43569, "brcmfmac43569");
0042 BRCMF_FW_DEF(4373, "brcmfmac4373");
0043 
0044 static const struct brcmf_firmware_mapping brcmf_usb_fwnames[] = {
0045     BRCMF_FW_ENTRY(BRCM_CC_43143_CHIP_ID, 0xFFFFFFFF, 43143),
0046     BRCMF_FW_ENTRY(BRCM_CC_43235_CHIP_ID, 0x00000008, 43236B),
0047     BRCMF_FW_ENTRY(BRCM_CC_43236_CHIP_ID, 0x00000008, 43236B),
0048     BRCMF_FW_ENTRY(BRCM_CC_43238_CHIP_ID, 0x00000008, 43236B),
0049     BRCMF_FW_ENTRY(BRCM_CC_43242_CHIP_ID, 0xFFFFFFFF, 43242A),
0050     BRCMF_FW_ENTRY(BRCM_CC_43566_CHIP_ID, 0xFFFFFFFF, 43569),
0051     BRCMF_FW_ENTRY(BRCM_CC_43569_CHIP_ID, 0xFFFFFFFF, 43569),
0052     BRCMF_FW_ENTRY(CY_CC_4373_CHIP_ID, 0xFFFFFFFF, 4373)
0053 };
0054 
0055 #define TRX_MAGIC       0x30524448  /* "HDR0" */
0056 #define TRX_MAX_OFFSET      3       /* Max number of file offsets */
0057 #define TRX_UNCOMP_IMAGE    0x20        /* Trx holds uncompressed img */
0058 #define TRX_RDL_CHUNK       1500        /* size of each dl transfer */
0059 #define TRX_OFFSETS_DLFWLEN_IDX 0
0060 
0061 /* Control messages: bRequest values */
0062 #define DL_GETSTATE 0   /* returns the rdl_state_t struct */
0063 #define DL_CHECK_CRC    1   /* currently unused */
0064 #define DL_GO       2   /* execute downloaded image */
0065 #define DL_START    3   /* initialize dl state */
0066 #define DL_REBOOT   4   /* reboot the device in 2 seconds */
0067 #define DL_GETVER   5   /* returns the bootrom_id_t struct */
0068 #define DL_GO_PROTECTED 6   /* execute the downloaded code and set reset
0069                  * event to occur in 2 seconds.  It is the
0070                  * responsibility of the downloaded code to
0071                  * clear this event
0072                  */
0073 #define DL_EXEC     7   /* jump to a supplied address */
0074 #define DL_RESETCFG 8   /* To support single enum on dongle
0075                  * - Not used by bootloader
0076                  */
0077 #define DL_DEFER_RESP_OK 9  /* Potentially defer the response to setup
0078                  * if resp unavailable
0079                  */
0080 
0081 /* states */
0082 #define DL_WAITING  0   /* waiting to rx first pkt */
0083 #define DL_READY    1   /* hdr was good, waiting for more of the
0084                  * compressed image
0085                  */
0086 #define DL_BAD_HDR  2   /* hdr was corrupted */
0087 #define DL_BAD_CRC  3   /* compressed image was corrupted */
0088 #define DL_RUNNABLE 4   /* download was successful,waiting for go cmd */
0089 #define DL_START_FAIL   5   /* failed to initialize correctly */
0090 #define DL_NVRAM_TOOBIG 6   /* host specified nvram data exceeds DL_NVRAM
0091                  * value
0092                  */
0093 #define DL_IMAGE_TOOBIG 7   /* firmware image too big */
0094 
0095 
0096 struct trx_header_le {
0097     __le32 magic;       /* "HDR0" */
0098     __le32 len;     /* Length of file including header */
0099     __le32 crc32;       /* CRC from flag_version to end of file */
0100     __le32 flag_version;    /* 0:15 flags, 16:31 version */
0101     __le32 offsets[TRX_MAX_OFFSET]; /* Offsets of partitions from start of
0102                      * header
0103                      */
0104 };
0105 
0106 struct rdl_state_le {
0107     __le32 state;
0108     __le32 bytes;
0109 };
0110 
0111 struct bootrom_id_le {
0112     __le32 chip;        /* Chip id */
0113     __le32 chiprev;     /* Chip rev */
0114     __le32 ramsize;     /* Size of  RAM */
0115     __le32 remapbase;   /* Current remap base address */
0116     __le32 boardtype;   /* Type of board */
0117     __le32 boardrev;    /* Board revision */
0118 };
0119 
0120 struct brcmf_usb_image {
0121     struct list_head list;
0122     s8 *fwname;
0123     u8 *image;
0124     int image_len;
0125 };
0126 
0127 struct brcmf_usbdev_info {
0128     struct brcmf_usbdev bus_pub; /* MUST BE FIRST */
0129     spinlock_t qlock;
0130     struct list_head rx_freeq;
0131     struct list_head rx_postq;
0132     struct list_head tx_freeq;
0133     struct list_head tx_postq;
0134     uint rx_pipe, tx_pipe;
0135 
0136     int rx_low_watermark;
0137     int tx_low_watermark;
0138     int tx_high_watermark;
0139     int tx_freecount;
0140     bool tx_flowblock;
0141     spinlock_t tx_flowblock_lock;
0142 
0143     struct brcmf_usbreq *tx_reqs;
0144     struct brcmf_usbreq *rx_reqs;
0145 
0146     char fw_name[BRCMF_FW_NAME_LEN];
0147     const u8 *image;    /* buffer for combine fw and nvram */
0148     int image_len;
0149 
0150     struct usb_device *usbdev;
0151     struct device *dev;
0152     struct completion dev_init_done;
0153 
0154     int ctl_in_pipe, ctl_out_pipe;
0155     struct urb *ctl_urb; /* URB for control endpoint */
0156     struct usb_ctrlrequest ctl_write;
0157     struct usb_ctrlrequest ctl_read;
0158     u32 ctl_urb_actual_length;
0159     int ctl_urb_status;
0160     int ctl_completed;
0161     wait_queue_head_t ioctl_resp_wait;
0162     ulong ctl_op;
0163     u8 ifnum;
0164 
0165     struct urb *bulk_urb; /* used for FW download */
0166 
0167     struct brcmf_mp_device *settings;
0168 };
0169 
0170 static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
0171                 struct brcmf_usbreq  *req);
0172 
0173 static struct brcmf_usbdev *brcmf_usb_get_buspub(struct device *dev)
0174 {
0175     struct brcmf_bus *bus_if = dev_get_drvdata(dev);
0176     return bus_if->bus_priv.usb;
0177 }
0178 
0179 static struct brcmf_usbdev_info *brcmf_usb_get_businfo(struct device *dev)
0180 {
0181     return brcmf_usb_get_buspub(dev)->devinfo;
0182 }
0183 
0184 static int brcmf_usb_ioctl_resp_wait(struct brcmf_usbdev_info *devinfo)
0185 {
0186     return wait_event_timeout(devinfo->ioctl_resp_wait,
0187                   devinfo->ctl_completed, IOCTL_RESP_TIMEOUT);
0188 }
0189 
0190 static void brcmf_usb_ioctl_resp_wake(struct brcmf_usbdev_info *devinfo)
0191 {
0192     wake_up(&devinfo->ioctl_resp_wait);
0193 }
0194 
0195 static void
0196 brcmf_usb_ctl_complete(struct brcmf_usbdev_info *devinfo, int type, int status)
0197 {
0198     brcmf_dbg(USB, "Enter, status=%d\n", status);
0199 
0200     if (unlikely(devinfo == NULL))
0201         return;
0202 
0203     if (type == BRCMF_USB_CBCTL_READ) {
0204         if (status == 0)
0205             devinfo->bus_pub.stats.rx_ctlpkts++;
0206         else
0207             devinfo->bus_pub.stats.rx_ctlerrs++;
0208     } else if (type == BRCMF_USB_CBCTL_WRITE) {
0209         if (status == 0)
0210             devinfo->bus_pub.stats.tx_ctlpkts++;
0211         else
0212             devinfo->bus_pub.stats.tx_ctlerrs++;
0213     }
0214 
0215     devinfo->ctl_urb_status = status;
0216     devinfo->ctl_completed = true;
0217     brcmf_usb_ioctl_resp_wake(devinfo);
0218 }
0219 
0220 static void
0221 brcmf_usb_ctlread_complete(struct urb *urb)
0222 {
0223     struct brcmf_usbdev_info *devinfo =
0224         (struct brcmf_usbdev_info *)urb->context;
0225 
0226     brcmf_dbg(USB, "Enter\n");
0227     devinfo->ctl_urb_actual_length = urb->actual_length;
0228     brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_READ,
0229         urb->status);
0230 }
0231 
0232 static void
0233 brcmf_usb_ctlwrite_complete(struct urb *urb)
0234 {
0235     struct brcmf_usbdev_info *devinfo =
0236         (struct brcmf_usbdev_info *)urb->context;
0237 
0238     brcmf_dbg(USB, "Enter\n");
0239     brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_WRITE,
0240         urb->status);
0241 }
0242 
0243 static int
0244 brcmf_usb_send_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
0245 {
0246     int ret;
0247     u16 size;
0248 
0249     brcmf_dbg(USB, "Enter\n");
0250     if (devinfo == NULL || buf == NULL ||
0251         len == 0 || devinfo->ctl_urb == NULL)
0252         return -EINVAL;
0253 
0254     size = len;
0255     devinfo->ctl_write.wLength = cpu_to_le16p(&size);
0256     devinfo->ctl_urb->transfer_buffer_length = size;
0257     devinfo->ctl_urb_status = 0;
0258     devinfo->ctl_urb_actual_length = 0;
0259 
0260     usb_fill_control_urb(devinfo->ctl_urb,
0261         devinfo->usbdev,
0262         devinfo->ctl_out_pipe,
0263         (unsigned char *) &devinfo->ctl_write,
0264         buf, size,
0265         (usb_complete_t)brcmf_usb_ctlwrite_complete,
0266         devinfo);
0267 
0268     ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
0269     if (ret < 0)
0270         brcmf_err("usb_submit_urb failed %d\n", ret);
0271 
0272     return ret;
0273 }
0274 
0275 static int
0276 brcmf_usb_recv_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
0277 {
0278     int ret;
0279     u16 size;
0280 
0281     brcmf_dbg(USB, "Enter\n");
0282     if ((devinfo == NULL) || (buf == NULL) || (len == 0)
0283         || (devinfo->ctl_urb == NULL))
0284         return -EINVAL;
0285 
0286     size = len;
0287     devinfo->ctl_read.wLength = cpu_to_le16p(&size);
0288     devinfo->ctl_urb->transfer_buffer_length = size;
0289 
0290     devinfo->ctl_read.bRequestType = USB_DIR_IN
0291         | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
0292     devinfo->ctl_read.bRequest = 1;
0293 
0294     usb_fill_control_urb(devinfo->ctl_urb,
0295         devinfo->usbdev,
0296         devinfo->ctl_in_pipe,
0297         (unsigned char *) &devinfo->ctl_read,
0298         buf, size,
0299         (usb_complete_t)brcmf_usb_ctlread_complete,
0300         devinfo);
0301 
0302     ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
0303     if (ret < 0)
0304         brcmf_err("usb_submit_urb failed %d\n", ret);
0305 
0306     return ret;
0307 }
0308 
0309 static int brcmf_usb_tx_ctlpkt(struct device *dev, u8 *buf, u32 len)
0310 {
0311     int err = 0;
0312     int timeout = 0;
0313     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
0314     struct usb_interface *intf = to_usb_interface(dev);
0315 
0316     brcmf_dbg(USB, "Enter\n");
0317 
0318     err = usb_autopm_get_interface(intf);
0319     if (err)
0320         goto out;
0321 
0322     if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
0323         err = -EIO;
0324         goto fail;
0325     }
0326 
0327     if (test_and_set_bit(0, &devinfo->ctl_op)) {
0328         err = -EIO;
0329         goto fail;
0330     }
0331 
0332     devinfo->ctl_completed = false;
0333     err = brcmf_usb_send_ctl(devinfo, buf, len);
0334     if (err) {
0335         brcmf_err("fail %d bytes: %d\n", err, len);
0336         clear_bit(0, &devinfo->ctl_op);
0337         goto fail;
0338     }
0339     timeout = brcmf_usb_ioctl_resp_wait(devinfo);
0340     if (!timeout) {
0341         brcmf_err("Txctl wait timed out\n");
0342         usb_kill_urb(devinfo->ctl_urb);
0343         err = -EIO;
0344         goto fail;
0345     }
0346     clear_bit(0, &devinfo->ctl_op);
0347 
0348 fail:
0349     usb_autopm_put_interface(intf);
0350 out:
0351     return err;
0352 }
0353 
0354 static int brcmf_usb_rx_ctlpkt(struct device *dev, u8 *buf, u32 len)
0355 {
0356     int err = 0;
0357     int timeout = 0;
0358     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
0359     struct usb_interface *intf = to_usb_interface(dev);
0360 
0361     brcmf_dbg(USB, "Enter\n");
0362 
0363     err = usb_autopm_get_interface(intf);
0364     if (err)
0365         goto out;
0366 
0367     if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
0368         err = -EIO;
0369         goto fail;
0370     }
0371 
0372     if (test_and_set_bit(0, &devinfo->ctl_op)) {
0373         err = -EIO;
0374         goto fail;
0375     }
0376 
0377     devinfo->ctl_completed = false;
0378     err = brcmf_usb_recv_ctl(devinfo, buf, len);
0379     if (err) {
0380         brcmf_err("fail %d bytes: %d\n", err, len);
0381         clear_bit(0, &devinfo->ctl_op);
0382         goto fail;
0383     }
0384     timeout = brcmf_usb_ioctl_resp_wait(devinfo);
0385     err = devinfo->ctl_urb_status;
0386     if (!timeout) {
0387         brcmf_err("rxctl wait timed out\n");
0388         usb_kill_urb(devinfo->ctl_urb);
0389         err = -EIO;
0390         goto fail;
0391     }
0392     clear_bit(0, &devinfo->ctl_op);
0393 fail:
0394     usb_autopm_put_interface(intf);
0395     if (!err)
0396         return devinfo->ctl_urb_actual_length;
0397 out:
0398     return err;
0399 }
0400 
0401 static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
0402                       struct list_head *q, int *counter)
0403 {
0404     unsigned long flags;
0405     struct brcmf_usbreq  *req;
0406     spin_lock_irqsave(&devinfo->qlock, flags);
0407     if (list_empty(q)) {
0408         spin_unlock_irqrestore(&devinfo->qlock, flags);
0409         return NULL;
0410     }
0411     req = list_entry(q->next, struct brcmf_usbreq, list);
0412     list_del_init(q->next);
0413     if (counter)
0414         (*counter)--;
0415     spin_unlock_irqrestore(&devinfo->qlock, flags);
0416     return req;
0417 
0418 }
0419 
0420 static void brcmf_usb_enq(struct brcmf_usbdev_info *devinfo,
0421               struct list_head *q, struct brcmf_usbreq *req,
0422               int *counter)
0423 {
0424     unsigned long flags;
0425     spin_lock_irqsave(&devinfo->qlock, flags);
0426     list_add_tail(&req->list, q);
0427     if (counter)
0428         (*counter)++;
0429     spin_unlock_irqrestore(&devinfo->qlock, flags);
0430 }
0431 
0432 static struct brcmf_usbreq *
0433 brcmf_usbdev_qinit(struct list_head *q, int qsize)
0434 {
0435     int i;
0436     struct brcmf_usbreq *req, *reqs;
0437 
0438     reqs = kcalloc(qsize, sizeof(struct brcmf_usbreq), GFP_ATOMIC);
0439     if (reqs == NULL)
0440         return NULL;
0441 
0442     req = reqs;
0443 
0444     for (i = 0; i < qsize; i++) {
0445         req->urb = usb_alloc_urb(0, GFP_ATOMIC);
0446         if (!req->urb)
0447             goto fail;
0448 
0449         INIT_LIST_HEAD(&req->list);
0450         list_add_tail(&req->list, q);
0451         req++;
0452     }
0453     return reqs;
0454 fail:
0455     brcmf_err("fail!\n");
0456     while (!list_empty(q)) {
0457         req = list_entry(q->next, struct brcmf_usbreq, list);
0458         if (req)
0459             usb_free_urb(req->urb);
0460         list_del(q->next);
0461     }
0462     kfree(reqs);
0463     return NULL;
0464 
0465 }
0466 
0467 static void brcmf_usb_free_q(struct list_head *q)
0468 {
0469     struct brcmf_usbreq *req, *next;
0470 
0471     list_for_each_entry_safe(req, next, q, list) {
0472         if (!req->urb) {
0473             brcmf_err("bad req\n");
0474             break;
0475         }
0476         usb_free_urb(req->urb);
0477         list_del_init(&req->list);
0478     }
0479 }
0480 
0481 static void brcmf_usb_del_fromq(struct brcmf_usbdev_info *devinfo,
0482                 struct brcmf_usbreq *req)
0483 {
0484     unsigned long flags;
0485 
0486     spin_lock_irqsave(&devinfo->qlock, flags);
0487     list_del_init(&req->list);
0488     spin_unlock_irqrestore(&devinfo->qlock, flags);
0489 }
0490 
0491 
0492 static void brcmf_usb_tx_complete(struct urb *urb)
0493 {
0494     struct brcmf_usbreq *req = (struct brcmf_usbreq *)urb->context;
0495     struct brcmf_usbdev_info *devinfo = req->devinfo;
0496     unsigned long flags;
0497 
0498     brcmf_dbg(USB, "Enter, urb->status=%d, skb=%p\n", urb->status,
0499           req->skb);
0500     brcmf_usb_del_fromq(devinfo, req);
0501 
0502     brcmf_proto_bcdc_txcomplete(devinfo->dev, req->skb, urb->status == 0);
0503     req->skb = NULL;
0504     brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_freecount);
0505     spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
0506     if (devinfo->tx_freecount > devinfo->tx_high_watermark &&
0507         devinfo->tx_flowblock) {
0508         brcmf_proto_bcdc_txflowblock(devinfo->dev, false);
0509         devinfo->tx_flowblock = false;
0510     }
0511     spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
0512 }
0513 
0514 static void brcmf_usb_rx_complete(struct urb *urb)
0515 {
0516     struct brcmf_usbreq  *req = (struct brcmf_usbreq *)urb->context;
0517     struct brcmf_usbdev_info *devinfo = req->devinfo;
0518     struct sk_buff *skb;
0519 
0520     brcmf_dbg(USB, "Enter, urb->status=%d\n", urb->status);
0521     brcmf_usb_del_fromq(devinfo, req);
0522     skb = req->skb;
0523     req->skb = NULL;
0524 
0525     /* zero length packets indicate usb "failure". Do not refill */
0526     if (urb->status != 0 || !urb->actual_length) {
0527         brcmu_pkt_buf_free_skb(skb);
0528         brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
0529         return;
0530     }
0531 
0532     if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP ||
0533         devinfo->bus_pub.state == BRCMFMAC_USB_STATE_SLEEP) {
0534         skb_put(skb, urb->actual_length);
0535         brcmf_rx_frame(devinfo->dev, skb, true, true);
0536         brcmf_usb_rx_refill(devinfo, req);
0537         usb_mark_last_busy(urb->dev);
0538     } else {
0539         brcmu_pkt_buf_free_skb(skb);
0540         brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
0541     }
0542     return;
0543 
0544 }
0545 
0546 static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
0547                 struct brcmf_usbreq  *req)
0548 {
0549     struct sk_buff *skb;
0550     int ret;
0551 
0552     if (!req || !devinfo)
0553         return;
0554 
0555     skb = dev_alloc_skb(devinfo->bus_pub.bus_mtu);
0556     if (!skb) {
0557         brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
0558         return;
0559     }
0560     req->skb = skb;
0561 
0562     usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe,
0563               skb->data, skb_tailroom(skb), brcmf_usb_rx_complete,
0564               req);
0565     req->devinfo = devinfo;
0566     brcmf_usb_enq(devinfo, &devinfo->rx_postq, req, NULL);
0567 
0568     ret = usb_submit_urb(req->urb, GFP_ATOMIC);
0569     if (ret) {
0570         brcmf_usb_del_fromq(devinfo, req);
0571         brcmu_pkt_buf_free_skb(req->skb);
0572         req->skb = NULL;
0573         brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
0574     }
0575     return;
0576 }
0577 
0578 static void brcmf_usb_rx_fill_all(struct brcmf_usbdev_info *devinfo)
0579 {
0580     struct brcmf_usbreq *req;
0581 
0582     if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
0583         brcmf_err("bus is not up=%d\n", devinfo->bus_pub.state);
0584         return;
0585     }
0586     while ((req = brcmf_usb_deq(devinfo, &devinfo->rx_freeq, NULL)) != NULL)
0587         brcmf_usb_rx_refill(devinfo, req);
0588 }
0589 
0590 static void
0591 brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state)
0592 {
0593     struct brcmf_bus *bcmf_bus = devinfo->bus_pub.bus;
0594 
0595     brcmf_dbg(USB, "Enter, current state=%d, new state=%d\n",
0596           devinfo->bus_pub.state, state);
0597 
0598     if (devinfo->bus_pub.state == state)
0599         return;
0600 
0601     devinfo->bus_pub.state = state;
0602 
0603     /* update state of upper layer */
0604     if (state == BRCMFMAC_USB_STATE_DOWN) {
0605         brcmf_dbg(USB, "DBUS is down\n");
0606         brcmf_bus_change_state(bcmf_bus, BRCMF_BUS_DOWN);
0607     } else if (state == BRCMFMAC_USB_STATE_UP) {
0608         brcmf_dbg(USB, "DBUS is up\n");
0609         brcmf_bus_change_state(bcmf_bus, BRCMF_BUS_UP);
0610     } else {
0611         brcmf_dbg(USB, "DBUS current state=%d\n", state);
0612     }
0613 }
0614 
0615 static int brcmf_usb_tx(struct device *dev, struct sk_buff *skb)
0616 {
0617     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
0618     struct brcmf_usbreq  *req;
0619     int ret;
0620     unsigned long flags;
0621     struct usb_interface *intf = to_usb_interface(dev);
0622 
0623     ret = usb_autopm_get_interface(intf);
0624     if (ret)
0625         goto out;
0626 
0627     brcmf_dbg(USB, "Enter, skb=%p\n", skb);
0628     if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
0629         ret = -EIO;
0630         goto fail;
0631     }
0632 
0633     req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq,
0634                     &devinfo->tx_freecount);
0635     if (!req) {
0636         brcmf_err("no req to send\n");
0637         ret = -ENOMEM;
0638         goto fail;
0639     }
0640 
0641     req->skb = skb;
0642     req->devinfo = devinfo;
0643     usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
0644               skb->data, skb->len, brcmf_usb_tx_complete, req);
0645     req->urb->transfer_flags |= URB_ZERO_PACKET;
0646     brcmf_usb_enq(devinfo, &devinfo->tx_postq, req, NULL);
0647     ret = usb_submit_urb(req->urb, GFP_ATOMIC);
0648     if (ret) {
0649         brcmf_err("brcmf_usb_tx usb_submit_urb FAILED\n");
0650         brcmf_usb_del_fromq(devinfo, req);
0651         req->skb = NULL;
0652         brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req,
0653                   &devinfo->tx_freecount);
0654         goto fail;
0655     }
0656 
0657     spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
0658     if (devinfo->tx_freecount < devinfo->tx_low_watermark &&
0659         !devinfo->tx_flowblock) {
0660         brcmf_proto_bcdc_txflowblock(dev, true);
0661         devinfo->tx_flowblock = true;
0662     }
0663     spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
0664 
0665 fail:
0666     usb_autopm_put_interface(intf);
0667 out:
0668     return ret;
0669 }
0670 
0671 
0672 static int brcmf_usb_up(struct device *dev)
0673 {
0674     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
0675 
0676     brcmf_dbg(USB, "Enter\n");
0677     if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP)
0678         return 0;
0679 
0680     /* Success, indicate devinfo is fully up */
0681     brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_UP);
0682 
0683     if (devinfo->ctl_urb) {
0684         devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0);
0685         devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0);
0686 
0687         /* CTL Write */
0688         devinfo->ctl_write.bRequestType =
0689             USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
0690         devinfo->ctl_write.bRequest = 0;
0691         devinfo->ctl_write.wValue = cpu_to_le16(0);
0692         devinfo->ctl_write.wIndex = cpu_to_le16(devinfo->ifnum);
0693 
0694         /* CTL Read */
0695         devinfo->ctl_read.bRequestType =
0696             USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE;
0697         devinfo->ctl_read.bRequest = 1;
0698         devinfo->ctl_read.wValue = cpu_to_le16(0);
0699         devinfo->ctl_read.wIndex = cpu_to_le16(devinfo->ifnum);
0700     }
0701     brcmf_usb_rx_fill_all(devinfo);
0702     return 0;
0703 }
0704 
0705 static void brcmf_cancel_all_urbs(struct brcmf_usbdev_info *devinfo)
0706 {
0707     int i;
0708 
0709     if (devinfo->ctl_urb)
0710         usb_kill_urb(devinfo->ctl_urb);
0711     if (devinfo->bulk_urb)
0712         usb_kill_urb(devinfo->bulk_urb);
0713     if (devinfo->tx_reqs)
0714         for (i = 0; i < devinfo->bus_pub.ntxq; i++)
0715             usb_kill_urb(devinfo->tx_reqs[i].urb);
0716     if (devinfo->rx_reqs)
0717         for (i = 0; i < devinfo->bus_pub.nrxq; i++)
0718             usb_kill_urb(devinfo->rx_reqs[i].urb);
0719 }
0720 
0721 static void brcmf_usb_down(struct device *dev)
0722 {
0723     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
0724 
0725     brcmf_dbg(USB, "Enter\n");
0726     if (devinfo == NULL)
0727         return;
0728 
0729     if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_DOWN)
0730         return;
0731 
0732     brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_DOWN);
0733 
0734     brcmf_cancel_all_urbs(devinfo);
0735 }
0736 
0737 static void
0738 brcmf_usb_sync_complete(struct urb *urb)
0739 {
0740     struct brcmf_usbdev_info *devinfo =
0741             (struct brcmf_usbdev_info *)urb->context;
0742 
0743     devinfo->ctl_completed = true;
0744     brcmf_usb_ioctl_resp_wake(devinfo);
0745 }
0746 
0747 static int brcmf_usb_dl_cmd(struct brcmf_usbdev_info *devinfo, u8 cmd,
0748                 void *buffer, int buflen)
0749 {
0750     int ret;
0751     char *tmpbuf;
0752     u16 size;
0753 
0754     if ((!devinfo) || (devinfo->ctl_urb == NULL))
0755         return -EINVAL;
0756 
0757     tmpbuf = kmalloc(buflen, GFP_ATOMIC);
0758     if (!tmpbuf)
0759         return -ENOMEM;
0760 
0761     size = buflen;
0762     devinfo->ctl_urb->transfer_buffer_length = size;
0763 
0764     devinfo->ctl_read.wLength = cpu_to_le16p(&size);
0765     devinfo->ctl_read.bRequestType = USB_DIR_IN | USB_TYPE_VENDOR |
0766         USB_RECIP_INTERFACE;
0767     devinfo->ctl_read.bRequest = cmd;
0768 
0769     usb_fill_control_urb(devinfo->ctl_urb,
0770         devinfo->usbdev,
0771         usb_rcvctrlpipe(devinfo->usbdev, 0),
0772         (unsigned char *) &devinfo->ctl_read,
0773         (void *) tmpbuf, size,
0774         (usb_complete_t)brcmf_usb_sync_complete, devinfo);
0775 
0776     devinfo->ctl_completed = false;
0777     ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
0778     if (ret < 0) {
0779         brcmf_err("usb_submit_urb failed %d\n", ret);
0780         goto finalize;
0781     }
0782 
0783     if (!brcmf_usb_ioctl_resp_wait(devinfo)) {
0784         usb_kill_urb(devinfo->ctl_urb);
0785         ret = -ETIMEDOUT;
0786     } else {
0787         memcpy(buffer, tmpbuf, buflen);
0788     }
0789 
0790 finalize:
0791     kfree(tmpbuf);
0792     return ret;
0793 }
0794 
0795 static bool
0796 brcmf_usb_dlneeded(struct brcmf_usbdev_info *devinfo)
0797 {
0798     struct bootrom_id_le id;
0799     u32 chipid, chiprev;
0800 
0801     brcmf_dbg(USB, "Enter\n");
0802 
0803     if (devinfo == NULL)
0804         return false;
0805 
0806     /* Check if firmware downloaded already by querying runtime ID */
0807     id.chip = cpu_to_le32(0xDEAD);
0808     brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id, sizeof(id));
0809 
0810     chipid = le32_to_cpu(id.chip);
0811     chiprev = le32_to_cpu(id.chiprev);
0812 
0813     if ((chipid & 0x4300) == 0x4300)
0814         brcmf_dbg(USB, "chip %x rev 0x%x\n", chipid, chiprev);
0815     else
0816         brcmf_dbg(USB, "chip %d rev 0x%x\n", chipid, chiprev);
0817     if (chipid == BRCMF_POSTBOOT_ID) {
0818         brcmf_dbg(USB, "firmware already downloaded\n");
0819         brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id, sizeof(id));
0820         return false;
0821     } else {
0822         devinfo->bus_pub.devid = chipid;
0823         devinfo->bus_pub.chiprev = chiprev;
0824     }
0825     return true;
0826 }
0827 
0828 static int
0829 brcmf_usb_resetcfg(struct brcmf_usbdev_info *devinfo)
0830 {
0831     struct bootrom_id_le id;
0832     u32 loop_cnt;
0833     int err;
0834 
0835     brcmf_dbg(USB, "Enter\n");
0836 
0837     loop_cnt = 0;
0838     do {
0839         mdelay(BRCMF_USB_RESET_GETVER_SPINWAIT);
0840         loop_cnt++;
0841         id.chip = cpu_to_le32(0xDEAD);       /* Get the ID */
0842         err = brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id, sizeof(id));
0843         if ((err) && (err != -ETIMEDOUT))
0844             return err;
0845         if (id.chip == cpu_to_le32(BRCMF_POSTBOOT_ID))
0846             break;
0847     } while (loop_cnt < BRCMF_USB_RESET_GETVER_LOOP_CNT);
0848 
0849     if (id.chip == cpu_to_le32(BRCMF_POSTBOOT_ID)) {
0850         brcmf_dbg(USB, "postboot chip 0x%x/rev 0x%x\n",
0851               le32_to_cpu(id.chip), le32_to_cpu(id.chiprev));
0852 
0853         brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id, sizeof(id));
0854         return 0;
0855     } else {
0856         brcmf_err("Cannot talk to Dongle. Firmware is not UP, %d ms\n",
0857               BRCMF_USB_RESET_GETVER_SPINWAIT * loop_cnt);
0858         return -EINVAL;
0859     }
0860 }
0861 
0862 
0863 static int
0864 brcmf_usb_dl_send_bulk(struct brcmf_usbdev_info *devinfo, void *buffer, int len)
0865 {
0866     int ret;
0867 
0868     if ((devinfo == NULL) || (devinfo->bulk_urb == NULL))
0869         return -EINVAL;
0870 
0871     /* Prepare the URB */
0872     usb_fill_bulk_urb(devinfo->bulk_urb, devinfo->usbdev,
0873               devinfo->tx_pipe, buffer, len,
0874               (usb_complete_t)brcmf_usb_sync_complete, devinfo);
0875 
0876     devinfo->bulk_urb->transfer_flags |= URB_ZERO_PACKET;
0877 
0878     devinfo->ctl_completed = false;
0879     ret = usb_submit_urb(devinfo->bulk_urb, GFP_ATOMIC);
0880     if (ret) {
0881         brcmf_err("usb_submit_urb failed %d\n", ret);
0882         return ret;
0883     }
0884     ret = brcmf_usb_ioctl_resp_wait(devinfo);
0885     return (ret == 0);
0886 }
0887 
0888 static int
0889 brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
0890 {
0891     unsigned int sendlen, sent, dllen;
0892     char *bulkchunk = NULL, *dlpos;
0893     struct rdl_state_le state;
0894     u32 rdlstate, rdlbytes;
0895     int err = 0;
0896 
0897     brcmf_dbg(USB, "Enter, fw %p, len %d\n", fw, fwlen);
0898 
0899     bulkchunk = kmalloc(TRX_RDL_CHUNK, GFP_ATOMIC);
0900     if (bulkchunk == NULL) {
0901         err = -ENOMEM;
0902         goto fail;
0903     }
0904 
0905     /* 1) Prepare USB boot loader for runtime image */
0906     brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
0907 
0908     rdlstate = le32_to_cpu(state.state);
0909     rdlbytes = le32_to_cpu(state.bytes);
0910 
0911     /* 2) Check we are in the Waiting state */
0912     if (rdlstate != DL_WAITING) {
0913         brcmf_err("Failed to DL_START\n");
0914         err = -EINVAL;
0915         goto fail;
0916     }
0917     sent = 0;
0918     dlpos = fw;
0919     dllen = fwlen;
0920 
0921     /* Get chip id and rev */
0922     while (rdlbytes != dllen) {
0923         /* Wait until the usb device reports it received all
0924          * the bytes we sent */
0925         if ((rdlbytes == sent) && (rdlbytes != dllen)) {
0926             if ((dllen-sent) < TRX_RDL_CHUNK)
0927                 sendlen = dllen-sent;
0928             else
0929                 sendlen = TRX_RDL_CHUNK;
0930 
0931             /* simply avoid having to send a ZLP by ensuring we
0932              * never have an even
0933              * multiple of 64
0934              */
0935             if (!(sendlen % 64))
0936                 sendlen -= 4;
0937 
0938             /* send data */
0939             memcpy(bulkchunk, dlpos, sendlen);
0940             if (brcmf_usb_dl_send_bulk(devinfo, bulkchunk,
0941                            sendlen)) {
0942                 brcmf_err("send_bulk failed\n");
0943                 err = -EINVAL;
0944                 goto fail;
0945             }
0946 
0947             dlpos += sendlen;
0948             sent += sendlen;
0949         }
0950         err = brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state,
0951                        sizeof(state));
0952         if (err) {
0953             brcmf_err("DL_GETSTATE Failed\n");
0954             goto fail;
0955         }
0956 
0957         rdlstate = le32_to_cpu(state.state);
0958         rdlbytes = le32_to_cpu(state.bytes);
0959 
0960         /* restart if an error is reported */
0961         if (rdlstate == DL_BAD_HDR || rdlstate == DL_BAD_CRC) {
0962             brcmf_err("Bad Hdr or Bad CRC state %d\n",
0963                   rdlstate);
0964             err = -EINVAL;
0965             goto fail;
0966         }
0967     }
0968 
0969 fail:
0970     kfree(bulkchunk);
0971     brcmf_dbg(USB, "Exit, err=%d\n", err);
0972     return err;
0973 }
0974 
0975 static int brcmf_usb_dlstart(struct brcmf_usbdev_info *devinfo, u8 *fw, int len)
0976 {
0977     int err;
0978 
0979     brcmf_dbg(USB, "Enter\n");
0980 
0981     if (devinfo == NULL)
0982         return -EINVAL;
0983 
0984     if (devinfo->bus_pub.devid == 0xDEAD)
0985         return -EINVAL;
0986 
0987     err = brcmf_usb_dl_writeimage(devinfo, fw, len);
0988     if (err == 0)
0989         devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DL_DONE;
0990     else
0991         devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DL_FAIL;
0992     brcmf_dbg(USB, "Exit, err=%d\n", err);
0993 
0994     return err;
0995 }
0996 
0997 static int brcmf_usb_dlrun(struct brcmf_usbdev_info *devinfo)
0998 {
0999     struct rdl_state_le state;
1000 
1001     brcmf_dbg(USB, "Enter\n");
1002     if (!devinfo)
1003         return -EINVAL;
1004 
1005     if (devinfo->bus_pub.devid == 0xDEAD)
1006         return -EINVAL;
1007 
1008     /* Check we are runnable */
1009     state.state = 0;
1010     brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state, sizeof(state));
1011 
1012     /* Start the image */
1013     if (state.state == cpu_to_le32(DL_RUNNABLE)) {
1014         if (brcmf_usb_dl_cmd(devinfo, DL_GO, &state, sizeof(state)))
1015             return -ENODEV;
1016         if (brcmf_usb_resetcfg(devinfo))
1017             return -ENODEV;
1018         /* The Dongle may go for re-enumeration. */
1019     } else {
1020         brcmf_err("Dongle not runnable\n");
1021         return -EINVAL;
1022     }
1023     brcmf_dbg(USB, "Exit\n");
1024     return 0;
1025 }
1026 
1027 static int
1028 brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
1029 {
1030     int err;
1031     struct usb_interface *intf;
1032 
1033     brcmf_dbg(USB, "Enter\n");
1034     if (!devinfo) {
1035         err = -ENODEV;
1036         goto out;
1037     }
1038 
1039     if (!devinfo->image) {
1040         brcmf_err("No firmware!\n");
1041         err = -ENOENT;
1042         goto out;
1043     }
1044 
1045     intf = to_usb_interface(devinfo->dev);
1046     err = usb_autopm_get_interface(intf);
1047     if (err)
1048         goto out;
1049 
1050     err = brcmf_usb_dlstart(devinfo,
1051         (u8 *)devinfo->image, devinfo->image_len);
1052     if (err == 0)
1053         err = brcmf_usb_dlrun(devinfo);
1054 
1055     usb_autopm_put_interface(intf);
1056 out:
1057     return err;
1058 }
1059 
1060 
1061 static void brcmf_usb_detach(struct brcmf_usbdev_info *devinfo)
1062 {
1063     brcmf_dbg(USB, "Enter, devinfo %p\n", devinfo);
1064 
1065     /* free the URBS */
1066     brcmf_usb_free_q(&devinfo->rx_freeq);
1067     brcmf_usb_free_q(&devinfo->tx_freeq);
1068 
1069     usb_free_urb(devinfo->ctl_urb);
1070     usb_free_urb(devinfo->bulk_urb);
1071 
1072     kfree(devinfo->tx_reqs);
1073     kfree(devinfo->rx_reqs);
1074 
1075     if (devinfo->settings)
1076         brcmf_release_module_param(devinfo->settings);
1077 }
1078 
1079 
1080 static int check_file(const u8 *headers)
1081 {
1082     struct trx_header_le *trx;
1083     int actual_len = -1;
1084 
1085     brcmf_dbg(USB, "Enter\n");
1086     /* Extract trx header */
1087     trx = (struct trx_header_le *) headers;
1088     if (trx->magic != cpu_to_le32(TRX_MAGIC))
1089         return -1;
1090 
1091     headers += sizeof(struct trx_header_le);
1092 
1093     if (le32_to_cpu(trx->flag_version) & TRX_UNCOMP_IMAGE) {
1094         actual_len = le32_to_cpu(trx->offsets[TRX_OFFSETS_DLFWLEN_IDX]);
1095         return actual_len + sizeof(struct trx_header_le);
1096     }
1097     return -1;
1098 }
1099 
1100 
1101 static
1102 struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
1103                       int nrxq, int ntxq)
1104 {
1105     brcmf_dbg(USB, "Enter\n");
1106 
1107     devinfo->bus_pub.nrxq = nrxq;
1108     devinfo->rx_low_watermark = nrxq / 2;
1109     devinfo->bus_pub.devinfo = devinfo;
1110     devinfo->bus_pub.ntxq = ntxq;
1111     devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DOWN;
1112 
1113     /* flow control when too many tx urbs posted */
1114     devinfo->tx_low_watermark = ntxq / 4;
1115     devinfo->tx_high_watermark = devinfo->tx_low_watermark * 3;
1116     devinfo->bus_pub.bus_mtu = BRCMF_USB_MAX_PKT_SIZE;
1117 
1118     /* Initialize other structure content */
1119     init_waitqueue_head(&devinfo->ioctl_resp_wait);
1120 
1121     /* Initialize the spinlocks */
1122     spin_lock_init(&devinfo->qlock);
1123     spin_lock_init(&devinfo->tx_flowblock_lock);
1124 
1125     INIT_LIST_HEAD(&devinfo->rx_freeq);
1126     INIT_LIST_HEAD(&devinfo->rx_postq);
1127 
1128     INIT_LIST_HEAD(&devinfo->tx_freeq);
1129     INIT_LIST_HEAD(&devinfo->tx_postq);
1130 
1131     devinfo->tx_flowblock = false;
1132 
1133     devinfo->rx_reqs = brcmf_usbdev_qinit(&devinfo->rx_freeq, nrxq);
1134     if (!devinfo->rx_reqs)
1135         goto error;
1136 
1137     devinfo->tx_reqs = brcmf_usbdev_qinit(&devinfo->tx_freeq, ntxq);
1138     if (!devinfo->tx_reqs)
1139         goto error;
1140     devinfo->tx_freecount = ntxq;
1141 
1142     devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC);
1143     if (!devinfo->ctl_urb)
1144         goto error;
1145     devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC);
1146     if (!devinfo->bulk_urb)
1147         goto error;
1148 
1149     return &devinfo->bus_pub;
1150 
1151 error:
1152     brcmf_err("failed!\n");
1153     brcmf_usb_detach(devinfo);
1154     return NULL;
1155 }
1156 
1157 static
1158 int brcmf_usb_get_fwname(struct device *dev, const char *ext, u8 *fw_name)
1159 {
1160     struct brcmf_bus *bus = dev_get_drvdata(dev);
1161     struct brcmf_fw_request *fwreq;
1162     struct brcmf_fw_name fwnames[] = {
1163         { ext, fw_name },
1164     };
1165 
1166     fwreq = brcmf_fw_alloc_request(bus->chip, bus->chiprev,
1167                        brcmf_usb_fwnames,
1168                        ARRAY_SIZE(brcmf_usb_fwnames),
1169                        fwnames, ARRAY_SIZE(fwnames));
1170     if (!fwreq)
1171         return -ENOMEM;
1172 
1173     kfree(fwreq);
1174     return 0;
1175 }
1176 
1177 static const struct brcmf_bus_ops brcmf_usb_bus_ops = {
1178     .preinit = brcmf_usb_up,
1179     .stop = brcmf_usb_down,
1180     .txdata = brcmf_usb_tx,
1181     .txctl = brcmf_usb_tx_ctlpkt,
1182     .rxctl = brcmf_usb_rx_ctlpkt,
1183     .get_fwname = brcmf_usb_get_fwname,
1184 };
1185 
1186 #define BRCMF_USB_FW_CODE   0
1187 
1188 static void brcmf_usb_probe_phase2(struct device *dev, int ret,
1189                    struct brcmf_fw_request *fwreq)
1190 {
1191     struct brcmf_bus *bus = dev_get_drvdata(dev);
1192     struct brcmf_usbdev_info *devinfo = bus->bus_priv.usb->devinfo;
1193     const struct firmware *fw;
1194 
1195     if (ret)
1196         goto error;
1197 
1198     brcmf_dbg(USB, "Start fw downloading\n");
1199 
1200     fw = fwreq->items[BRCMF_USB_FW_CODE].binary;
1201     kfree(fwreq);
1202 
1203     ret = check_file(fw->data);
1204     if (ret < 0) {
1205         brcmf_err("invalid firmware\n");
1206         release_firmware(fw);
1207         goto error;
1208     }
1209 
1210     devinfo->image = fw->data;
1211     devinfo->image_len = fw->size;
1212 
1213     ret = brcmf_usb_fw_download(devinfo);
1214     release_firmware(fw);
1215     if (ret)
1216         goto error;
1217 
1218     ret = brcmf_alloc(devinfo->dev, devinfo->settings);
1219     if (ret)
1220         goto error;
1221 
1222     /* Attach to the common driver interface */
1223     ret = brcmf_attach(devinfo->dev);
1224     if (ret)
1225         goto error;
1226 
1227     complete(&devinfo->dev_init_done);
1228     return;
1229 error:
1230     brcmf_dbg(TRACE, "failed: dev=%s, err=%d\n", dev_name(dev), ret);
1231     complete(&devinfo->dev_init_done);
1232     device_release_driver(dev);
1233 }
1234 
1235 static struct brcmf_fw_request *
1236 brcmf_usb_prepare_fw_request(struct brcmf_usbdev_info *devinfo)
1237 {
1238     struct brcmf_fw_request *fwreq;
1239     struct brcmf_fw_name fwnames[] = {
1240         { ".bin", devinfo->fw_name },
1241     };
1242 
1243     fwreq = brcmf_fw_alloc_request(devinfo->bus_pub.devid,
1244                        devinfo->bus_pub.chiprev,
1245                        brcmf_usb_fwnames,
1246                        ARRAY_SIZE(brcmf_usb_fwnames),
1247                        fwnames, ARRAY_SIZE(fwnames));
1248     if (!fwreq)
1249         return NULL;
1250 
1251     fwreq->items[BRCMF_USB_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
1252 
1253     return fwreq;
1254 }
1255 
1256 static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo)
1257 {
1258     struct brcmf_bus *bus = NULL;
1259     struct brcmf_usbdev *bus_pub = NULL;
1260     struct device *dev = devinfo->dev;
1261     struct brcmf_fw_request *fwreq;
1262     int ret;
1263 
1264     brcmf_dbg(USB, "Enter\n");
1265     bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ);
1266     if (!bus_pub)
1267         return -ENODEV;
1268 
1269     bus = kzalloc(sizeof(struct brcmf_bus), GFP_ATOMIC);
1270     if (!bus) {
1271         ret = -ENOMEM;
1272         goto fail;
1273     }
1274 
1275     bus->dev = dev;
1276     bus_pub->bus = bus;
1277     bus->bus_priv.usb = bus_pub;
1278     dev_set_drvdata(dev, bus);
1279     bus->ops = &brcmf_usb_bus_ops;
1280     bus->proto_type = BRCMF_PROTO_BCDC;
1281     bus->always_use_fws_queue = true;
1282 #ifdef CONFIG_PM
1283     bus->wowl_supported = true;
1284 #endif
1285 
1286     devinfo->settings = brcmf_get_module_param(bus->dev, BRCMF_BUSTYPE_USB,
1287                            bus_pub->devid,
1288                            bus_pub->chiprev);
1289     if (!devinfo->settings) {
1290         ret = -ENOMEM;
1291         goto fail;
1292     }
1293 
1294     if (!brcmf_usb_dlneeded(devinfo)) {
1295         ret = brcmf_alloc(devinfo->dev, devinfo->settings);
1296         if (ret)
1297             goto fail;
1298         ret = brcmf_attach(devinfo->dev);
1299         if (ret)
1300             goto fail;
1301         /* we are done */
1302         complete(&devinfo->dev_init_done);
1303         return 0;
1304     }
1305     bus->chip = bus_pub->devid;
1306     bus->chiprev = bus_pub->chiprev;
1307 
1308     fwreq = brcmf_usb_prepare_fw_request(devinfo);
1309     if (!fwreq) {
1310         ret = -ENOMEM;
1311         goto fail;
1312     }
1313 
1314     /* request firmware here */
1315     ret = brcmf_fw_get_firmwares(dev, fwreq, brcmf_usb_probe_phase2);
1316     if (ret) {
1317         brcmf_err("firmware request failed: %d\n", ret);
1318         kfree(fwreq);
1319         goto fail;
1320     }
1321 
1322     return 0;
1323 
1324 fail:
1325     /* Release resources in reverse order */
1326     brcmf_free(devinfo->dev);
1327     kfree(bus);
1328     brcmf_usb_detach(devinfo);
1329     return ret;
1330 }
1331 
1332 static void
1333 brcmf_usb_disconnect_cb(struct brcmf_usbdev_info *devinfo)
1334 {
1335     if (!devinfo)
1336         return;
1337     brcmf_dbg(USB, "Enter, bus_pub %p\n", devinfo);
1338 
1339     brcmf_detach(devinfo->dev);
1340     brcmf_free(devinfo->dev);
1341     kfree(devinfo->bus_pub.bus);
1342     brcmf_usb_detach(devinfo);
1343 }
1344 
1345 static int
1346 brcmf_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
1347 {
1348     struct usb_device *usb = interface_to_usbdev(intf);
1349     struct brcmf_usbdev_info *devinfo;
1350     struct usb_interface_descriptor *desc;
1351     struct usb_endpoint_descriptor *endpoint;
1352     int ret = 0;
1353     u32 num_of_eps;
1354     u8 endpoint_num, ep;
1355 
1356     brcmf_dbg(USB, "Enter 0x%04x:0x%04x\n", id->idVendor, id->idProduct);
1357 
1358     devinfo = kzalloc(sizeof(*devinfo), GFP_ATOMIC);
1359     if (devinfo == NULL)
1360         return -ENOMEM;
1361 
1362     devinfo->usbdev = usb;
1363     devinfo->dev = &usb->dev;
1364     /* Init completion, to protect for disconnect while still loading.
1365      * Necessary because of the asynchronous firmware load construction
1366      */
1367     init_completion(&devinfo->dev_init_done);
1368 
1369     usb_set_intfdata(intf, devinfo);
1370 
1371     intf->needs_remote_wakeup = 1;
1372 
1373     /* Check that the device supports only one configuration */
1374     if (usb->descriptor.bNumConfigurations != 1) {
1375         brcmf_err("Number of configurations: %d not supported\n",
1376               usb->descriptor.bNumConfigurations);
1377         ret = -ENODEV;
1378         goto fail;
1379     }
1380 
1381     if ((usb->descriptor.bDeviceClass != USB_CLASS_VENDOR_SPEC) &&
1382         (usb->descriptor.bDeviceClass != USB_CLASS_MISC) &&
1383         (usb->descriptor.bDeviceClass != USB_CLASS_WIRELESS_CONTROLLER)) {
1384         brcmf_err("Device class: 0x%x not supported\n",
1385               usb->descriptor.bDeviceClass);
1386         ret = -ENODEV;
1387         goto fail;
1388     }
1389 
1390     desc = &intf->cur_altsetting->desc;
1391     if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
1392         (desc->bInterfaceSubClass != 2) ||
1393         (desc->bInterfaceProtocol != 0xff)) {
1394         brcmf_err("non WLAN interface %d: 0x%x:0x%x:0x%x\n",
1395               desc->bInterfaceNumber, desc->bInterfaceClass,
1396               desc->bInterfaceSubClass, desc->bInterfaceProtocol);
1397         ret = -ENODEV;
1398         goto fail;
1399     }
1400 
1401     num_of_eps = desc->bNumEndpoints;
1402     for (ep = 0; ep < num_of_eps; ep++) {
1403         endpoint = &intf->cur_altsetting->endpoint[ep].desc;
1404         endpoint_num = usb_endpoint_num(endpoint);
1405         if (!usb_endpoint_xfer_bulk(endpoint))
1406             continue;
1407         if (usb_endpoint_dir_in(endpoint)) {
1408             if (!devinfo->rx_pipe)
1409                 devinfo->rx_pipe =
1410                     usb_rcvbulkpipe(usb, endpoint_num);
1411         } else {
1412             if (!devinfo->tx_pipe)
1413                 devinfo->tx_pipe =
1414                     usb_sndbulkpipe(usb, endpoint_num);
1415         }
1416     }
1417     if (devinfo->rx_pipe == 0) {
1418         brcmf_err("No RX (in) Bulk EP found\n");
1419         ret = -ENODEV;
1420         goto fail;
1421     }
1422     if (devinfo->tx_pipe == 0) {
1423         brcmf_err("No TX (out) Bulk EP found\n");
1424         ret = -ENODEV;
1425         goto fail;
1426     }
1427 
1428     devinfo->ifnum = desc->bInterfaceNumber;
1429 
1430     if (usb->speed == USB_SPEED_SUPER_PLUS)
1431         brcmf_dbg(USB, "Broadcom super speed plus USB WLAN interface detected\n");
1432     else if (usb->speed == USB_SPEED_SUPER)
1433         brcmf_dbg(USB, "Broadcom super speed USB WLAN interface detected\n");
1434     else if (usb->speed == USB_SPEED_HIGH)
1435         brcmf_dbg(USB, "Broadcom high speed USB WLAN interface detected\n");
1436     else
1437         brcmf_dbg(USB, "Broadcom full speed USB WLAN interface detected\n");
1438 
1439     ret = brcmf_usb_probe_cb(devinfo);
1440     if (ret)
1441         goto fail;
1442 
1443     /* Success */
1444     return 0;
1445 
1446 fail:
1447     complete(&devinfo->dev_init_done);
1448     kfree(devinfo);
1449     usb_set_intfdata(intf, NULL);
1450     return ret;
1451 }
1452 
1453 static void
1454 brcmf_usb_disconnect(struct usb_interface *intf)
1455 {
1456     struct brcmf_usbdev_info *devinfo;
1457 
1458     brcmf_dbg(USB, "Enter\n");
1459     devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
1460 
1461     if (devinfo) {
1462         wait_for_completion(&devinfo->dev_init_done);
1463         /* Make sure that devinfo still exists. Firmware probe routines
1464          * may have released the device and cleared the intfdata.
1465          */
1466         if (!usb_get_intfdata(intf))
1467             goto done;
1468 
1469         brcmf_usb_disconnect_cb(devinfo);
1470         kfree(devinfo);
1471     }
1472 done:
1473     brcmf_dbg(USB, "Exit\n");
1474 }
1475 
1476 /*
1477  * only need to signal the bus being down and update the state.
1478  */
1479 static int brcmf_usb_suspend(struct usb_interface *intf, pm_message_t state)
1480 {
1481     struct usb_device *usb = interface_to_usbdev(intf);
1482     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
1483 
1484     brcmf_dbg(USB, "Enter\n");
1485     devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
1486     brcmf_cancel_all_urbs(devinfo);
1487     device_set_wakeup_enable(devinfo->dev, true);
1488     return 0;
1489 }
1490 
1491 /*
1492  * (re-) start the bus.
1493  */
1494 static int brcmf_usb_resume(struct usb_interface *intf)
1495 {
1496     struct usb_device *usb = interface_to_usbdev(intf);
1497     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
1498 
1499     brcmf_dbg(USB, "Enter\n");
1500 
1501     devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
1502     brcmf_usb_rx_fill_all(devinfo);
1503     device_set_wakeup_enable(devinfo->dev, false);
1504     return 0;
1505 }
1506 
1507 static int brcmf_usb_reset_resume(struct usb_interface *intf)
1508 {
1509     struct usb_device *usb = interface_to_usbdev(intf);
1510     struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
1511     struct brcmf_fw_request *fwreq;
1512     int ret;
1513 
1514     brcmf_dbg(USB, "Enter\n");
1515 
1516     fwreq = brcmf_usb_prepare_fw_request(devinfo);
1517     if (!fwreq)
1518         return -ENOMEM;
1519 
1520     ret = brcmf_fw_get_firmwares(&usb->dev, fwreq, brcmf_usb_probe_phase2);
1521     if (ret < 0)
1522         kfree(fwreq);
1523 
1524     return ret;
1525 }
1526 
1527 #define BRCMF_USB_DEVICE(dev_id)    \
1528     { USB_DEVICE(BRCM_USB_VENDOR_ID_BROADCOM, dev_id) }
1529 
1530 #define LINKSYS_USB_DEVICE(dev_id)  \
1531     { USB_DEVICE(BRCM_USB_VENDOR_ID_LINKSYS, dev_id) }
1532 
1533 #define CYPRESS_USB_DEVICE(dev_id)  \
1534     { USB_DEVICE(CY_USB_VENDOR_ID_CYPRESS, dev_id) }
1535 
1536 static const struct usb_device_id brcmf_usb_devid_table[] = {
1537     BRCMF_USB_DEVICE(BRCM_USB_43143_DEVICE_ID),
1538     BRCMF_USB_DEVICE(BRCM_USB_43236_DEVICE_ID),
1539     BRCMF_USB_DEVICE(BRCM_USB_43242_DEVICE_ID),
1540     BRCMF_USB_DEVICE(BRCM_USB_43569_DEVICE_ID),
1541     LINKSYS_USB_DEVICE(BRCM_USB_43235_LINKSYS_DEVICE_ID),
1542     CYPRESS_USB_DEVICE(CY_USB_4373_DEVICE_ID),
1543     { USB_DEVICE(BRCM_USB_VENDOR_ID_LG, BRCM_USB_43242_LG_DEVICE_ID) },
1544     /* special entry for device with firmware loaded and running */
1545     BRCMF_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID),
1546     CYPRESS_USB_DEVICE(BRCM_USB_BCMFW_DEVICE_ID),
1547     { /* end: all zeroes */ }
1548 };
1549 
1550 MODULE_DEVICE_TABLE(usb, brcmf_usb_devid_table);
1551 
1552 static struct usb_driver brcmf_usbdrvr = {
1553     .name = KBUILD_MODNAME,
1554     .probe = brcmf_usb_probe,
1555     .disconnect = brcmf_usb_disconnect,
1556     .id_table = brcmf_usb_devid_table,
1557     .suspend = brcmf_usb_suspend,
1558     .resume = brcmf_usb_resume,
1559     .reset_resume = brcmf_usb_reset_resume,
1560     .supports_autosuspend = true,
1561     .disable_hub_initiated_lpm = 1,
1562 };
1563 
1564 static int brcmf_usb_reset_device(struct device *dev, void *notused)
1565 {
1566     /* device past is the usb interface so we
1567      * need to use parent here.
1568      */
1569     brcmf_dev_reset(dev->parent);
1570     return 0;
1571 }
1572 
1573 void brcmf_usb_exit(void)
1574 {
1575     struct device_driver *drv = &brcmf_usbdrvr.drvwrap.driver;
1576     int ret;
1577 
1578     brcmf_dbg(USB, "Enter\n");
1579     ret = driver_for_each_device(drv, NULL, NULL,
1580                      brcmf_usb_reset_device);
1581     if (ret)
1582         brcmf_err("failed to reset all usb devices %d\n", ret);
1583 
1584     usb_deregister(&brcmf_usbdrvr);
1585 }
1586 
1587 int brcmf_usb_register(void)
1588 {
1589     brcmf_dbg(USB, "Enter\n");
1590     return usb_register(&brcmf_usbdrvr);
1591 }