static int set_ether_config(struct eth_dev *dev, gfp_t gfp_flags) { int result = 0; if (dev->status_ep) usb_ept_enable(dev->status_ep, 1); result = alloc_requests(dev, qlen , gfp_flags); if (result == 0) DEBUG(dev, "qlen %d\n", qlen); return result; }
static int set_fastboot_config(struct fastboot_dev *dev, gfp_t gfp_flags) { int result = 0; struct usb_gadget *gadget = dev->gadget; dev->in = ep_choose(gadget, &hs_source_desc, &fs_source_desc); dev->in_ep->driver_data = dev; dev->out = ep_choose(gadget, &hs_sink_desc, &fs_sink_desc); dev->out_ep->driver_data = dev; result = usb_ep_enable(dev->in_ep, dev->in); if (result != 0) { debug("enable %s --> %d\n", dev->in_ep->name, result); goto done; } result = usb_ep_enable(dev->out_ep, dev->out); if (result != 0) { debug("enable %s --> %d\n", dev->out_ep->name, result); goto done; } done: if (result == 0) result = alloc_requests(dev, 1, gfp_flags); /* on error, disable any endpoints */ if (result < 0) { (void)usb_ep_disable(dev->in_ep); (void)usb_ep_disable(dev->out_ep); dev->in = NULL; dev->out = NULL; } /* caller is responsible for cleanup on error */ return result; }
/** * gether_connect - notify network layer that USB link is active * @link: the USB link, set up with endpoints, descriptors matching * current device speed, and any framing wrapper(s) set up. * Context: irqs blocked * * This is called to activate endpoints and let the network layer know * the connection is active ("carrier detect"). It may cause the I/O * queues to open and start letting network packets flow, but will in * any case activate the endpoints so that they respond properly to the * USB host. * * Verify net_device pointer returned using IS_ERR(). If it doesn't * indicate some error code (negative errno), ep->driver_data values * have been overwritten. */ struct net_device *gether_connect(struct gether *link) { struct eth_dev *dev = the_dev; int result = 0; if (!dev) return ERR_PTR(-EINVAL); link->in_ep->driver_data = dev; result = usb_ep_enable(link->in_ep, link->in); if (result != 0) { DBG(dev, "enable %s --> %d\n", link->in_ep->name, result); goto fail0; } link->out_ep->driver_data = dev; result = usb_ep_enable(link->out_ep, link->out); if (result != 0) { DBG(dev, "enable %s --> %d\n", link->out_ep->name, result); goto fail1; } if (result == 0) result = alloc_requests(dev, link, qlen(dev->gadget)); if (result == 0) { dev->zlp = link->is_zlp_ok; DBG(dev, "qlen %d\n", qlen(dev->gadget)); dev->header_len = link->header_len; dev->unwrap = link->unwrap; dev->wrap = link->wrap; spin_lock(&dev->lock); dev->port_usb = link; link->ioport = dev; if (netif_running(dev->net)) { if (link->open) link->open(link); } else { if (link->close) link->close(link); } spin_unlock(&dev->lock); netif_carrier_on(dev->net); if (netif_running(dev->net)) eth_start(dev, GFP_ATOMIC); /* on error, disable any endpoints */ } else { (void) usb_ep_disable(link->out_ep); fail1: (void) usb_ep_disable(link->in_ep); } fail0: /* caller is responsible for cleanup on error */ if (result < 0) return ERR_PTR(result); return dev->net; }