static int brcmf_usb_up(struct device *dev) { struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); brcmf_dbg(USB, "Enter\n"); if (devinfo->bus_pub.state == BRCMFMAC_USB_STATE_UP) return 0; /* Success, indicate devinfo is fully up */ brcmf_usb_state_change(devinfo, BRCMFMAC_USB_STATE_UP); if (devinfo->ctl_urb) { devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0); devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0); /* CTL Write */ devinfo->ctl_write.bRequestType = USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE; devinfo->ctl_write.bRequest = 0; devinfo->ctl_write.wValue = cpu_to_le16(0); devinfo->ctl_write.wIndex = cpu_to_le16(devinfo->ifnum); /* CTL Read */ devinfo->ctl_read.bRequestType = USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE; devinfo->ctl_read.bRequest = 1; devinfo->ctl_read.wValue = cpu_to_le16(0); devinfo->ctl_read.wIndex = cpu_to_le16(devinfo->ifnum); } brcmf_usb_rx_fill_all(devinfo); return 0; }
static void brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state) { struct brcmf_bus *bcmf_bus = devinfo->bus_pub.bus; int old_state; if (devinfo->bus_pub.state == state) return; old_state = devinfo->bus_pub.state; brcmf_dbg(TRACE, "dbus state change from %d to to %d\n", old_state, state); /* Don't update state if it's PnP firmware re-download */ if (state != BCMFMAC_USB_STATE_PNP_FWDL) /* TODO */ devinfo->bus_pub.state = state; if ((old_state == BCMFMAC_USB_STATE_SLEEP) && (state == BCMFMAC_USB_STATE_UP)) { brcmf_usb_rx_fill_all(devinfo); } /* update state of upper layer */ if (state == BCMFMAC_USB_STATE_DOWN) { brcmf_dbg(INFO, "DBUS is down\n"); bcmf_bus->state = BRCMF_BUS_DOWN; } else { brcmf_dbg(INFO, "DBUS current state=%d\n", state); } }
/* * (re-) start the bus. */ static int brcmf_usb_resume(struct usb_interface *intf) { struct usb_device *usb = interface_to_usbdev(intf); struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(&usb->dev); brcmf_dbg(USB, "Enter\n"); if (!devinfo->wowl_enabled) return brcmf_usb_bus_setup(devinfo); devinfo->bus_pub.state = BRCMFMAC_USB_STATE_UP; brcmf_usb_rx_fill_all(devinfo); return 0; }
static int brcmf_usb_up(struct device *dev) { struct brcmf_usbdev_info *devinfo = brcmf_usb_get_businfo(dev); u16 ifnum; if (devinfo->bus_pub.state == BCMFMAC_USB_STATE_UP) return 0; /* If the USB/HSIC bus in sleep state, wake it up */ if (devinfo->suspend_state == USBOS_SUSPEND_STATE_SUSPENDED) { if (brcmf_usb_pnp(devinfo, BCMFMAC_USB_PNP_RESUME) != 0) { brcmf_dbg(ERROR, "Could not Resume the bus!\n"); return -EIO; } } devinfo->activity = true; /* Success, indicate devinfo is fully up */ brcmf_usb_state_change(devinfo, BCMFMAC_USB_STATE_UP); if (devinfo->intr_urb) { int ret; usb_fill_int_urb(devinfo->intr_urb, devinfo->usbdev, devinfo->intr_pipe, &devinfo->intr, devinfo->intr_size, (usb_complete_t)brcmf_usb_intr_complete, devinfo, devinfo->interval); ret = usb_submit_urb(devinfo->intr_urb, GFP_ATOMIC); if (ret) { brcmf_dbg(ERROR, "USB_SUBMIT_URB failed with status %d\n", ret); return -EINVAL; } } if (devinfo->ctl_urb) { devinfo->ctl_in_pipe = usb_rcvctrlpipe(devinfo->usbdev, 0); devinfo->ctl_out_pipe = usb_sndctrlpipe(devinfo->usbdev, 0); ifnum = IFDESC(devinfo->usbdev, CONTROL_IF).bInterfaceNumber; /* CTL Write */ devinfo->ctl_write.bRequestType = USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE; devinfo->ctl_write.bRequest = 0; devinfo->ctl_write.wValue = cpu_to_le16(0); devinfo->ctl_write.wIndex = cpu_to_le16p(&ifnum); /* CTL Read */ devinfo->ctl_read.bRequestType = USB_DIR_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE; devinfo->ctl_read.bRequest = 1; devinfo->ctl_read.wValue = cpu_to_le16(0); devinfo->ctl_read.wIndex = cpu_to_le16p(&ifnum); } brcmf_usb_rx_fill_all(devinfo); return 0; }