void rmnet_usb_ctrl_stop_all(void) { int id; for (id = 0; id < NUM_CTRL_CHANNELS; id++) { if (is_dev_connected(ctrl_dev[id])) rmnet_usb_ctrl_stop_rx(ctrl_dev[id]); } }
static int rmnet_usb_suspend(struct usb_interface *iface, pm_message_t message) { struct usbnet *unet; struct rmnet_ctrl_dev *dev; int time = 0; int retval = 0; //htc_dbg if (get_radio_flag() & 0x0001) pr_info("%s intf %p\n", __func__, iface); unet = usb_get_intfdata(iface); if (!unet) { pr_err("%s:data device not found\n", __func__); retval = -ENODEV; goto fail; } dev = (struct rmnet_ctrl_dev *)unet->data[1]; if (!dev) { dev_err(&iface->dev, "%s: ctrl device not found\n", __func__); retval = -ENODEV; goto fail; } retval = usbnet_suspend(iface, message); if (!retval) { if (message.event & PM_EVENT_SUSPEND) { time = usb_wait_anchor_empty_timeout(&dev->tx_submitted, 1000); if (!time) { pr_info("%s :+usb_kill_anchored_urbs\n", __func__); usb_kill_anchored_urbs(&dev->tx_submitted); pr_info("%s :-usb_kill_anchored_urbs\n", __func__); } retval = rmnet_usb_ctrl_stop_rx(dev); iface->dev.power.power_state.event = message.event; } /* TBD : do we need to set/clear usbnet->udev->reset_resume*/ } else dev_err(&iface->dev, "%s: device is busy can not suspend\n", __func__); fail: return retval; }
static int rmnet_usb_suspend(struct usb_interface *iface, pm_message_t message) { struct usbnet *unet; struct rmnet_ctrl_dev *dev; int time = 0; int retval = 0; unet = usb_get_intfdata(iface); if (!unet) { pr_err("%s:data device not found\n", __func__); retval = -ENODEV; goto fail; } dev = (struct rmnet_ctrl_dev *)unet->data[1]; if (!dev) { dev_err(&iface->dev, "%s: ctrl device not found\n", __func__); retval = -ENODEV; goto fail; } retval = usbnet_suspend(iface, message); if (!retval) { if (message.event & PM_EVENT_SUSPEND) { time = usb_wait_anchor_empty_timeout(&dev->tx_submitted, 1000); if (!time) usb_kill_anchored_urbs(&dev->tx_submitted); retval = rmnet_usb_ctrl_stop_rx(dev); iface->dev.power.power_state.event = message.event; } } else dev_info(&iface->dev, "%s: device is busy can not suspend\n", __func__); fail: return retval; }
void rmnet_usb_ctrl_disconnect(struct rmnet_ctrl_dev *dev) { rmnet_usb_ctrl_stop_rx(dev); mutex_lock(&dev->dev_lock); /*TBD: for now just update CD status*/ dev->cbits_tolocal = ~ACM_CTRL_CD; dev->cbits_tomdm = ~ACM_CTRL_DTR; dev->intf = NULL; mutex_unlock(&dev->dev_lock); usb_free_urb(dev->inturb); dev->inturb = NULL; kfree(dev->intbuf); dev->intbuf = NULL; usb_kill_anchored_urbs(&dev->tx_submitted); }
static int rmnet_ctl_release(struct inode *inode, struct file *file) { struct ctrl_pkt_list_elem *list_elem = NULL; struct rmnet_ctrl_dev *dev; unsigned long flag; dev = file->private_data; if (!dev) return -ENODEV; DBG("%s Called on %s device\n", __func__, dev->name); spin_lock_irqsave(&dev->rx_lock, flag); while (!list_empty(&dev->rx_list)) { list_elem = list_first_entry( &dev->rx_list, struct ctrl_pkt_list_elem, list); list_del(&list_elem->list); kfree(list_elem->cpkt.data); kfree(list_elem); } spin_unlock_irqrestore(&dev->rx_lock, flag); mutex_lock(&dev->dev_lock); dev->is_opened = 0; mutex_unlock(&dev->dev_lock); rmnet_usb_ctrl_stop_rx(dev); if (is_dev_connected(dev)) usb_kill_anchored_urbs(&dev->tx_submitted); file->private_data = NULL; return 0; }