示例#1
0
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;
}
示例#2
0
文件: usb.c 项目: serrvius/huawei-p6
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);
    }
}
示例#3
0
/*
 * (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;
}
示例#4
0
文件: usb.c 项目: serrvius/huawei-p6
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;
}