Lines Matching defs:devinfo

170 static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
181 return brcmf_usb_get_buspub(dev)->devinfo;
184 static int brcmf_usb_ioctl_resp_wait(struct brcmf_usbdev_info *devinfo)
186 return wait_event_timeout(devinfo->ioctl_resp_wait,
187 devinfo->ctl_completed, IOCTL_RESP_TIMEOUT);
190 static void brcmf_usb_ioctl_resp_wake(struct brcmf_usbdev_info *devinfo)
192 wake_up(&devinfo->ioctl_resp_wait);
196 brcmf_usb_ctl_complete(struct brcmf_usbdev_info *devinfo, int type, int status)
200 if (unlikely(devinfo == NULL))
205 devinfo->bus_pub.stats.rx_ctlpkts++;
207 devinfo->bus_pub.stats.rx_ctlerrs++;
210 devinfo->bus_pub.stats.tx_ctlpkts++;
212 devinfo->bus_pub.stats.tx_ctlerrs++;
215 devinfo->ctl_urb_status = status;
216 devinfo->ctl_completed = true;
217 brcmf_usb_ioctl_resp_wake(devinfo);
223 struct brcmf_usbdev_info *devinfo =
227 devinfo->ctl_urb_actual_length = urb->actual_length;
228 brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_READ,
235 struct brcmf_usbdev_info *devinfo =
239 brcmf_usb_ctl_complete(devinfo, BRCMF_USB_CBCTL_WRITE,
244 brcmf_usb_send_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
250 if (devinfo == NULL || buf == NULL ||
251 len == 0 || devinfo->ctl_urb == NULL)
255 devinfo->ctl_write.wLength = cpu_to_le16p(&size);
256 devinfo->ctl_urb->transfer_buffer_length = size;
257 devinfo->ctl_urb_status = 0;
258 devinfo->ctl_urb_actual_length = 0;
260 usb_fill_control_urb(devinfo->ctl_urb,
261 devinfo->usbdev,
262 devinfo->ctl_out_pipe,
263 (unsigned char *) &devinfo->ctl_write,
266 devinfo);
268 ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
276 brcmf_usb_recv_ctl(struct brcmf_usbdev_info *devinfo, u8 *buf, int len)
282 if ((devinfo == NULL) || (buf == NULL) || (len == 0)
283 || (devinfo->ctl_urb == NULL))
287 devinfo->ctl_read.wLength = cpu_to_le16p(&size);
288 devinfo->ctl_urb->transfer_buffer_length = size;
290 devinfo->ctl_read.bRequestType = USB_DIR_IN
292 devinfo->ctl_read.bRequest = 1;
294 usb_fill_control_urb(devinfo->ctl_urb,
295 devinfo->usbdev,
296 devinfo->ctl_in_pipe,
297 (unsigned char *) &devinfo->ctl_read,
300 devinfo);
302 ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
313 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
322 if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
327 if (test_and_set_bit(0, &devinfo->ctl_op)) {
332 devinfo->ctl_completed = false;
333 err = brcmf_usb_send_ctl(devinfo, buf, len);
336 clear_bit(0, &devinfo->ctl_op);
339 timeout = brcmf_usb_ioctl_resp_wait(devinfo);
342 usb_kill_urb(devinfo->ctl_urb);
346 clear_bit(0, &devinfo->ctl_op);
358 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
367 if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
372 if (test_and_set_bit(0, &devinfo->ctl_op)) {
377 devinfo->ctl_completed = false;
378 err = brcmf_usb_recv_ctl(devinfo, buf, len);
381 clear_bit(0, &devinfo->ctl_op);
384 timeout = brcmf_usb_ioctl_resp_wait(devinfo);
385 err = devinfo->ctl_urb_status;
388 usb_kill_urb(devinfo->ctl_urb);
392 clear_bit(0, &devinfo->ctl_op);
396 return devinfo->ctl_urb_actual_length;
401 static struct brcmf_usbreq *brcmf_usb_deq(struct brcmf_usbdev_info *devinfo,
406 spin_lock_irqsave(&devinfo->qlock, flags);
408 spin_unlock_irqrestore(&devinfo->qlock, flags);
415 spin_unlock_irqrestore(&devinfo->qlock, flags);
420 static void brcmf_usb_enq(struct brcmf_usbdev_info *devinfo,
425 spin_lock_irqsave(&devinfo->qlock, flags);
429 spin_unlock_irqrestore(&devinfo->qlock, flags);
481 static void brcmf_usb_del_fromq(struct brcmf_usbdev_info *devinfo,
486 spin_lock_irqsave(&devinfo->qlock, flags);
488 spin_unlock_irqrestore(&devinfo->qlock, flags);
495 struct brcmf_usbdev_info *devinfo = req->devinfo;
500 brcmf_usb_del_fromq(devinfo, req);
502 brcmf_proto_bcdc_txcomplete(devinfo->dev, req->skb, urb->status == 0);
504 brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req, &devinfo->tx_freecount);
505 spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
506 if (devinfo->tx_freecount > devinfo->tx_high_watermark &&
507 devinfo->tx_flowblock) {
508 brcmf_proto_bcdc_txflowblock(devinfo->dev, false);
509 devinfo->tx_flowblock = false;
511 spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
517 struct brcmf_usbdev_info *devinfo = req->devinfo;
521 brcmf_usb_del_fromq(devinfo, req);
528 brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
532 if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP ||
533 devinfo->bus_pub.state == BRCMFMAC_USB_STATE_SLEEP) {
535 brcmf_rx_frame(devinfo->dev, skb, true, true);
536 brcmf_usb_rx_refill(devinfo, req);
540 brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
546 static void brcmf_usb_rx_refill(struct brcmf_usbdev_info *devinfo,
552 if (!req || !devinfo)
555 skb = dev_alloc_skb(devinfo->bus_pub.bus_mtu);
557 brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
562 usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->rx_pipe,
565 req->devinfo = devinfo;
566 brcmf_usb_enq(devinfo, &devinfo->rx_postq, req, NULL);
570 brcmf_usb_del_fromq(devinfo, req);
573 brcmf_usb_enq(devinfo, &devinfo->rx_freeq, req, NULL);
578 static void brcmf_usb_rx_fill_all(struct brcmf_usbdev_info *devinfo)
582 if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
583 brcmf_err("bus is not up=%d\n", devinfo->bus_pub.state);
586 while ((req = brcmf_usb_deq(devinfo, &devinfo->rx_freeq, NULL)) != NULL)
587 brcmf_usb_rx_refill(devinfo, req);
591 brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state)
593 struct brcmf_bus *bcmf_bus = devinfo->bus_pub.bus;
596 devinfo->bus_pub.state, state);
598 if (devinfo->bus_pub.state == state)
601 devinfo->bus_pub.state = state;
617 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
628 if (devinfo->bus_pub.state != BRCMFMAC_USB_STATE_UP) {
633 req = brcmf_usb_deq(devinfo, &devinfo->tx_freeq,
634 &devinfo->tx_freecount);
642 req->devinfo = devinfo;
643 usb_fill_bulk_urb(req->urb, devinfo->usbdev, devinfo->tx_pipe,
646 brcmf_usb_enq(devinfo, &devinfo->tx_postq, req, NULL);
650 brcmf_usb_del_fromq(devinfo, req);
652 brcmf_usb_enq(devinfo, &devinfo->tx_freeq, req,
653 &devinfo->tx_freecount);
657 spin_lock_irqsave(&devinfo->tx_flowblock_lock, flags);
658 if (devinfo->tx_freecount < devinfo->tx_low_watermark &&
659 !devinfo->tx_flowblock) {
661 devinfo->tx_flowblock = true;
663 spin_unlock_irqrestore(&devinfo->tx_flowblock_lock, flags);
674 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
677 if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP)
680 /* Success, indicate devinfo is fully up */
681 brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_UP);
683 if (devinfo->ctl_urb) {
684 devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0);
685 devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0);
688 devinfo->ctl_write.bRequestType =
690 devinfo->ctl_write.bRequest = 0;
691 devinfo->ctl_write.wValue = cpu_to_le16(0);
692 devinfo->ctl_write.wIndex = cpu_to_le16(devinfo->ifnum);
695 devinfo->ctl_read.bRequestType =
697 devinfo->ctl_read.bRequest = 1;
698 devinfo->ctl_read.wValue = cpu_to_le16(0);
699 devinfo->ctl_read.wIndex = cpu_to_le16(devinfo->ifnum);
701 brcmf_usb_rx_fill_all(devinfo);
705 static void brcmf_cancel_all_urbs(struct brcmf_usbdev_info *devinfo)
709 if (devinfo->ctl_urb)
710 usb_kill_urb(devinfo->ctl_urb);
711 if (devinfo->bulk_urb)
712 usb_kill_urb(devinfo->bulk_urb);
713 if (devinfo->tx_reqs)
714 for (i = 0; i < devinfo->bus_pub.ntxq; i++)
715 usb_kill_urb(devinfo->tx_reqs[i].urb);
716 if (devinfo->rx_reqs)
717 for (i = 0; i < devinfo->bus_pub.nrxq; i++)
718 usb_kill_urb(devinfo->rx_reqs[i].urb);
723 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev);
726 if (devinfo == NULL)
729 if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_DOWN)
732 brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_DOWN);
734 brcmf_cancel_all_urbs(devinfo);
740 struct brcmf_usbdev_info *devinfo =
743 devinfo->ctl_completed = true;
744 brcmf_usb_ioctl_resp_wake(devinfo);
747 static int brcmf_usb_dl_cmd(struct brcmf_usbdev_info *devinfo, u8 cmd,
754 if ((!devinfo) || (devinfo->ctl_urb == NULL))
762 devinfo->ctl_urb->transfer_buffer_length = size;
764 devinfo->ctl_read.wLength = cpu_to_le16p(&size);
765 devinfo->ctl_read.bRequestType = USB_DIR_IN | USB_TYPE_VENDOR |
767 devinfo->ctl_read.bRequest = cmd;
769 usb_fill_control_urb(devinfo->ctl_urb,
770 devinfo->usbdev,
771 usb_rcvctrlpipe(devinfo->usbdev, 0),
772 (unsigned char *) &devinfo->ctl_read,
774 (usb_complete_t)brcmf_usb_sync_complete, devinfo);
776 devinfo->ctl_completed = false;
777 ret = usb_submit_urb(devinfo->ctl_urb, GFP_ATOMIC);
783 if (!brcmf_usb_ioctl_resp_wait(devinfo)) {
784 usb_kill_urb(devinfo->ctl_urb);
796 brcmf_usb_dlneeded(struct brcmf_usbdev_info *devinfo)
803 if (devinfo == NULL)
808 brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id, sizeof(id));
819 brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id, sizeof(id));
822 devinfo->bus_pub.devid = chipid;
823 devinfo->bus_pub.chiprev = chiprev;
829 brcmf_usb_resetcfg(struct brcmf_usbdev_info *devinfo)
842 err = brcmf_usb_dl_cmd(devinfo, DL_GETVER, &id, sizeof(id));
853 brcmf_usb_dl_cmd(devinfo, DL_RESETCFG, &id, sizeof(id));
864 brcmf_usb_dl_send_bulk(struct brcmf_usbdev_info *devinfo, void *buffer, int len)
868 if ((devinfo == NULL) || (devinfo->bulk_urb == NULL))
872 usb_fill_bulk_urb(devinfo->bulk_urb, devinfo->usbdev,
873 devinfo->tx_pipe, buffer, len,
874 (usb_complete_t)brcmf_usb_sync_complete, devinfo);
876 devinfo->bulk_urb->transfer_flags |= URB_ZERO_PACKET;
878 devinfo->ctl_completed = false;
879 ret = usb_submit_urb(devinfo->bulk_urb, GFP_ATOMIC);
884 ret = brcmf_usb_ioctl_resp_wait(devinfo);
889 brcmf_usb_dl_writeimage(struct brcmf_usbdev_info *devinfo, u8 *fw, int fwlen)
906 brcmf_usb_dl_cmd(devinfo, DL_START, &state, sizeof(state));
940 if (brcmf_usb_dl_send_bulk(devinfo, bulkchunk,
950 err = brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state,
975 static int brcmf_usb_dlstart(struct brcmf_usbdev_info *devinfo, u8 *fw, int len)
981 if (devinfo == NULL)
984 if (devinfo->bus_pub.devid == 0xDEAD)
987 err = brcmf_usb_dl_writeimage(devinfo, fw, len);
989 devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DL_DONE;
991 devinfo->bus_pub.state = BRCMFMAC_USB_STATE_DL_FAIL;
997 static int brcmf_usb_dlrun(struct brcmf_usbdev_info *devinfo)
1002 if (!devinfo)
1005 if (devinfo->bus_pub.devid == 0xDEAD)
1010 brcmf_usb_dl_cmd(devinfo, DL_GETSTATE, &state, sizeof(state));
1014 if (brcmf_usb_dl_cmd(devinfo, DL_GO, &state, sizeof(state)))
1016 if (brcmf_usb_resetcfg(devinfo))
1028 brcmf_usb_fw_download(struct brcmf_usbdev_info *devinfo)
1034 if (!devinfo) {
1039 if (!devinfo->image) {
1045 intf = to_usb_interface(devinfo->dev);
1050 err = brcmf_usb_dlstart(devinfo,
1051 (u8 *)devinfo->image, devinfo->image_len);
1053 err = brcmf_usb_dlrun(devinfo);
1061 static void brcmf_usb_detach(struct brcmf_usbdev_info *devinfo)
1063 brcmf_dbg(USB, "Enter, devinfo %p\n", devinfo);
1066 brcmf_usb_free_q(&devinfo->rx_freeq);
1067 brcmf_usb_free_q(&devinfo->tx_freeq);
1069 usb_free_urb(devinfo->ctl_urb);
1070 usb_free_urb(devinfo->bulk_urb);
1072 kfree(devinfo->tx_reqs);
1073 kfree(devinfo->rx_reqs);
1075 if (devinfo->settings)
1076 brcmf_release_module_param(devinfo->settings);
1102 struct brcmf_usbdev *brcmf_usb_attach(struct brcmf_usbdev_info *devinfo,
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;
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;
1119 init_waitqueue_head(&devinfo->ioctl_resp_wait);
1122 spin_lock_init(&devinfo->qlock);
1123 spin_lock_init(&devinfo->tx_flowblock_lock);
1125 INIT_LIST_HEAD(&devinfo->rx_freeq);
1126 INIT_LIST_HEAD(&devinfo->rx_postq);
1128 INIT_LIST_HEAD(&devinfo->tx_freeq);
1129 INIT_LIST_HEAD(&devinfo->tx_postq);
1131 devinfo->tx_flowblock = false;
1133 devinfo->rx_reqs = brcmf_usbdev_qinit(&devinfo->rx_freeq, nrxq);
1134 if (!devinfo->rx_reqs)
1137 devinfo->tx_reqs = brcmf_usbdev_qinit(&devinfo->tx_freeq, ntxq);
1138 if (!devinfo->tx_reqs)
1140 devinfo->tx_freecount = ntxq;
1142 devinfo->ctl_urb = usb_alloc_urb(0, GFP_ATOMIC);
1143 if (!devinfo->ctl_urb)
1145 devinfo->bulk_urb = usb_alloc_urb(0, GFP_ATOMIC);
1146 if (!devinfo->bulk_urb)
1149 return &devinfo->bus_pub;
1153 brcmf_usb_detach(devinfo);
1179 struct brcmf_usbdev_info *devinfo = bus->bus_priv.usb->devinfo;
1197 devinfo->image = fw->data;
1198 devinfo->image_len = fw->size;
1200 ret = brcmf_usb_fw_download(devinfo);
1205 ret = brcmf_alloc(devinfo->dev, devinfo->settings);
1210 ret = brcmf_attach(devinfo->dev);
1214 complete(&devinfo->dev_init_done);
1218 complete(&devinfo->dev_init_done);
1223 brcmf_usb_prepare_fw_request(struct brcmf_usbdev_info *devinfo)
1227 { ".bin", devinfo->fw_name },
1230 fwreq = brcmf_fw_alloc_request(devinfo->bus_pub.devid,
1231 devinfo->bus_pub.chiprev,
1243 static int brcmf_usb_probe_cb(struct brcmf_usbdev_info *devinfo,
1248 struct device *dev = devinfo->dev;
1253 bus_pub = brcmf_usb_attach(devinfo, BRCMF_USB_NRXQ, BRCMF_USB_NTXQ);
1275 devinfo->settings = brcmf_get_module_param(bus->dev, BRCMF_BUSTYPE_USB,
1278 if (!devinfo->settings) {
1283 if (!brcmf_usb_dlneeded(devinfo)) {
1284 ret = brcmf_alloc(devinfo->dev, devinfo->settings);
1287 ret = brcmf_attach(devinfo->dev);
1291 complete(&devinfo->dev_init_done);
1297 fwreq = brcmf_usb_prepare_fw_request(devinfo);
1315 brcmf_free(devinfo->dev);
1317 brcmf_usb_detach(devinfo);
1322 brcmf_usb_disconnect_cb(struct brcmf_usbdev_info *devinfo)
1324 if (!devinfo)
1326 brcmf_dbg(USB, "Enter, bus_pub %p\n", devinfo);
1328 brcmf_detach(devinfo->dev);
1329 brcmf_free(devinfo->dev);
1330 kfree(devinfo->bus_pub.bus);
1331 brcmf_usb_detach(devinfo);
1341 struct brcmf_usbdev_info *devinfo;
1358 devinfo = kzalloc(sizeof(*devinfo), GFP_ATOMIC);
1359 if (devinfo == NULL)
1362 devinfo->usbdev = usb;
1363 devinfo->dev = &usb->dev;
1367 init_completion(&devinfo->dev_init_done);
1369 usb_set_intfdata(intf, devinfo);
1408 if (!devinfo->rx_pipe)
1409 devinfo->rx_pipe =
1412 if (!devinfo->tx_pipe)
1413 devinfo->tx_pipe =
1417 if (devinfo->rx_pipe == 0) {
1422 if (devinfo->tx_pipe == 0) {
1428 devinfo->ifnum = desc->bInterfaceNumber;
1439 ret = brcmf_usb_probe_cb(devinfo, id->driver_info);
1447 complete(&devinfo->dev_init_done);
1448 kfree(devinfo);
1456 struct brcmf_usbdev_info *devinfo;
1459 devinfo = (struct brcmf_usbdev_info *)usb_get_intfdata(intf);
1461 if (devinfo) {
1462 wait_for_completion(&devinfo->dev_init_done);
1463 /* Make sure that devinfo still exists. Firmware probe routines
1469 brcmf_usb_disconnect_cb(devinfo);
1470 kfree(devinfo);
1482 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
1485 devinfo->bus_pub.state = BRCMFMAC_USB_STATE_SLEEP;
1486 brcmf_cancel_all_urbs(devinfo);
1487 device_set_wakeup_enable(devinfo->dev, true);
1497 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
1501 devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP;
1502 brcmf_usb_rx_fill_all(devinfo);
1503 device_set_wakeup_enable(devinfo->dev, false);
1510 struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev);
1516 fwreq = brcmf_usb_prepare_fw_request(devinfo);