static void play_delayed(struct usb_serial_port *port) { struct hsictty_intf_private *data; struct hsictty_port_private *portdata; struct urb *urb; int err; portdata = usb_get_serial_port_data(port); data = usb_get_serial_data(port->serial); while ((urb = usb_get_from_anchor(&portdata->delayed_urb))) { err = usb_submit_urb(urb, GFP_ATOMIC); if (!err) { hsictty_dbg ("%s re-submit URB %p, write data may lost\n", __func__, urb); data->in_flight++; } else { /* we have to throw away the rest */ hsictty_error ("%s re-submit flight URB error, write data may lost\n", __func__); do { unbusy_queued_urb(urb, portdata); usb_autopm_put_interface_no_suspend (port->serial->interface); } while ((urb = usb_get_from_anchor(&portdata->delayed_urb))); break; } } }
static irqreturn_t bb_wake_irq(int irq, void *dev_id) { struct opsdata data; struct usb_interface *iface; int cwrlevel = bb_get_cwr(); bool pwrstate_l2 = false; bb_getdata(&data); pwrstate_l2 = ((data.powerstate == BBSTATE_L02L2) || (data.powerstate == BBSTATE_L2)); if (cwrlevel && pwrstate_l2) { if (dlevel & DLEVEL_PM) pr_info("%s: Modem wakeup request from L2.\n", __func__); if (data.usbdev) { usb_lock_device(data.usbdev); iface = usb_ifnum_to_if(data.usbdev, 0); if (iface) { /* Resume usb host activity. */ usb_autopm_get_interface(iface); usb_autopm_put_interface_no_suspend(iface); } usb_unlock_device(data.usbdev); } } if (!cwrlevel && data.powerstate == BBSTATE_UNKNOWN && data.usbdev) { data.powerstate = BBSTATE_L0; bb_setdata(&data); if (dlevel & DLEVEL_PM) pr_info("%s: Network interface up.\n", __func__); } return IRQ_HANDLED; }
static void quiesce_and_remove_host(struct us_data *us) { struct Scsi_Host *host = us_to_host(us); //--------------------------- pr_info("17 quiesce and remove host\n"); /* If the device is really gone, cut short reset delays */ if (us->pusb_dev->state == USB_STATE_NOTATTACHED) { set_bit(US_FLIDX_DISCONNECTING, &us->dflags); wake_up(&us->delay_wait); } /* Prevent SCSI scanning (if it hasn't started yet) * or wait for the SCSI-scanning routine to stop. */ cancel_delayed_work_sync(&us->scan_dwork); /* Balance autopm calls if scanning was cancelled */ if (test_bit(US_FLIDX_SCAN_PENDING, &us->dflags)) usb_autopm_put_interface_no_suspend(us->pusb_intf); /* Removing the host will perform an orderly shutdown: caches * synchronized, disks spun down, etc. */ scsi_remove_host(host); /* Prevent any new commands from being accepted and cut short * reset delays. */ scsi_lock(host); set_bit(US_FLIDX_DISCONNECTING, &us->dflags); scsi_unlock(host); wake_up(&us->delay_wait); }