Beispiel #1
0
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;
		}
	}
}
Beispiel #2
0
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);
}