static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) { struct brcmf_bus *bus = NULL; struct brcmf_usbdev *bus_pub = NULL; struct device *dev = devinfo->dev; int ret; brcmf_dbg(USB, "Enter\n"); bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ); if (!bus_pub) return -ENODEV; bus = kzalloc(sizeof(struct brcmf_bus), GFP_ATOMIC); if (!bus) { ret = -ENOMEM; goto fail; } bus->dev = dev; bus_pub->bus = bus; bus->bus_priv.usb = bus_pub; dev_set_drvdata(dev, bus); bus->ops = &brcmf_usb_bus_ops; bus->proto_type = BRCMF_PROTO_BCDC; bus->always_use_fws_queue = true; #ifdef CONFIG_PM bus->wowl_supported = true; #endif if (!brcmf_usb_dlneeded(devinfo)) { ret = brcmf_usb_bus_setup(devinfo); if (ret) goto fail; /* we are done */ mutex_unlock(&devinfo->dev_init_lock); return 0; } bus->chip = bus_pub->devid; bus->chiprev = bus_pub->chiprev; /* request firmware here */ ret = brcmf_fw_get_firmwares(dev, 0, brcmf_usb_get_fwname(devinfo), NULL, brcmf_usb_probe_phase2); if (ret) { brcmf_err("firmware request failed: %d\n", ret); goto fail; } return 0; fail: /* Release resources in reverse order */ kfree(bus); brcmf_usb_detach(devinfo); return ret; }
static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo) { struct brcmf_bus *bus = NULL; struct brcmf_usbdev *bus_pub = NULL; struct device *dev = devinfo->dev; struct brcmf_fw_request *fwreq; int ret; brcmf_dbg(USB, "Enter\n"); bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ); if (!bus_pub) return -ENODEV; bus = kzalloc(sizeof(struct brcmf_bus), GFP_ATOMIC); if (!bus) { ret = -ENOMEM; goto fail; } bus->dev = dev; bus_pub->bus = bus; bus->bus_priv.usb = bus_pub; dev_set_drvdata(dev, bus); bus->ops = &brcmf_usb_bus_ops; bus->proto_type = BRCMF_PROTO_BCDC; bus->always_use_fws_queue = true; #ifdef CONFIG_PM bus->wowl_supported = true; #endif devinfo->settings = brcmf_get_module_param(bus->dev, BRCMF_BUSTYPE_USB, bus_pub->devid, bus_pub->chiprev); if (!devinfo->settings) { ret = -ENOMEM; goto fail; } if (!brcmf_usb_dlneeded(devinfo)) { ret = brcmf_attach(devinfo->dev, devinfo->settings); if (ret) goto fail; /* we are done */ complete(&devinfo->dev_init_done); return 0; } bus->chip = bus_pub->devid; bus->chiprev = bus_pub->chiprev; fwreq = brcmf_usb_prepare_fw_request(devinfo); if (!fwreq) { ret = -ENOMEM; goto fail; } /* request firmware here */ ret = brcmf_fw_get_firmwares(dev, fwreq, brcmf_usb_probe_phase2); if (ret) { brcmf_err("firmware request failed: %d\n", ret); kfree(fwreq); goto fail; } return 0; fail: /* Release resources in reverse order */ kfree(bus); brcmf_usb_detach(devinfo); return ret; }
static struct brcmf_usbdev *brcmf_usb_attach(int nrxq, int ntxq, struct device *dev) { struct brcmf_usbdev_info *devinfo; devinfo = kzalloc(sizeof(struct brcmf_usbdev_info), GFP_ATOMIC); if (devinfo == NULL) return NULL; devinfo->bus_pub.nrxq = nrxq; devinfo->rx_low_watermark = nrxq / 2; devinfo->bus_pub.devinfo = devinfo; devinfo->bus_pub.ntxq = ntxq; /* flow control when too many tx urbs posted */ devinfo->tx_low_watermark = ntxq / 4; devinfo->tx_high_watermark = devinfo->tx_low_watermark * 3; devinfo->dev = dev; devinfo->usbdev = usbdev_probe_info.usb; devinfo->tx_pipe = usbdev_probe_info.tx_pipe; devinfo->rx_pipe = usbdev_probe_info.rx_pipe; devinfo->rx_pipe2 = usbdev_probe_info.rx_pipe2; devinfo->intr_pipe = usbdev_probe_info.intr_pipe; devinfo->interval = usbdev_probe_info.interval; devinfo->intr_size = usbdev_probe_info.intr_size; memcpy(&devinfo->probe_info, &usbdev_probe_info, sizeof(struct brcmf_usb_probe_info)); devinfo->bus_pub.bus_mtu = BRCMF_USB_MAX_PKT_SIZE; /* Initialize other structure content */ init_waitqueue_head(&devinfo->ioctl_resp_wait); /* Initialize the spinlocks */ spin_lock_init(&devinfo->qlock); INIT_LIST_HEAD(&devinfo->rx_freeq); INIT_LIST_HEAD(&devinfo->rx_postq); INIT_LIST_HEAD(&devinfo->tx_freeq); INIT_LIST_HEAD(&devinfo->tx_postq); devinfo->rx_reqs = brcmf_usbdev_qinit(&devinfo->rx_freeq, nrxq); if (!devinfo->rx_reqs) goto error; devinfo->tx_reqs = brcmf_usbdev_qinit(&devinfo->tx_freeq, ntxq); if (!devinfo->tx_reqs) goto error; devinfo->intr_urb = usb_alloc_urb(0, GFP_ATOMIC); if (!devinfo->intr_urb) { brcmf_dbg(ERROR, "usb_alloc_urb (intr) failed\n"); goto error; } devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC); if (!devinfo->ctl_urb) { brcmf_dbg(ERROR, "usb_alloc_urb (ctl) failed\n"); goto error; } devinfo->rxctl_deferrespok = 0; devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC); if (!devinfo->bulk_urb) { brcmf_dbg(ERROR, "usb_alloc_urb (bulk) failed\n"); goto error; } init_waitqueue_head(&devinfo->wait); if (!brcmf_usb_dlneeded(devinfo)) return &devinfo->bus_pub; brcmf_dbg(TRACE, "start fw downloading\n"); if (brcmf_usb_get_fw(devinfo)) goto error; if (brcmf_usb_fw_download(devinfo)) goto error; return &devinfo->bus_pub; error: brcmf_dbg(ERROR, "failed!\n"); brcmf_usb_detach(&devinfo->bus_pub); return NULL; }