Esempio n. 1
0
static int acm_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct acm *acm = usb_get_intfdata(intf);
	int cnt;

	if (message.event & PM_EVENT_AUTO) {
		int b;

		spin_lock_irq(&acm->write_lock);
		b = acm->transmitting;
		spin_unlock_irq(&acm->write_lock);
		if (b)
			return -EBUSY;
	}

	spin_lock_irq(&acm->read_lock);
	spin_lock(&acm->write_lock);
	cnt = acm->susp_count++;
	spin_unlock(&acm->write_lock);
	spin_unlock_irq(&acm->read_lock);

	if (cnt)
		return 0;
	/*
	we treat opened interfaces differently,
	we must guard against open
	*/
	mutex_lock(&acm->mutex);

	if (acm->port.count)
		stop_data_traffic(acm);

	mutex_unlock(&acm->mutex);
	return 0;
}
Esempio n. 2
0
static int acm_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct acm *acm = usb_get_intfdata(intf);
	int cnt;

	spin_lock_irq(&acm->read_lock);
	spin_lock(&acm->write_lock);
	if (PMSG_IS_AUTO(message)) {
		if (acm->transmitting) {
			spin_unlock(&acm->write_lock);
			spin_unlock_irq(&acm->read_lock);
			return -EBUSY;
		}
	}
	cnt = acm->susp_count++;
	spin_unlock(&acm->write_lock);
	spin_unlock_irq(&acm->read_lock);

	if (cnt)
		return 0;

	stop_data_traffic(acm);

	return 0;
}
static void modem_close(struct usb_serial_port *port)
{
	struct modem_port *modem_port_ptr = usb_get_serial_data(port->serial);
	if (!modem_port_ptr) {
		dev_err(&port->dev,
			 "%s: null modem port pointer.\n",
			 __func__);
		return;
	}

	if (cdma_modem_debug)
		dev_info(&port->dev, "%s: Enter. Close Port %d\n",
			 __func__, modem_port_ptr->number);

	modem_port_ptr->port_closing = 1;

	/*  For the data modem port, the pm interface needs to be get here
	 *  and will be put back at serial_close() of usb-serial.c
	 */
	if (modem_port_ptr->number == MODEM_INTERFACE_NUM)
		usb_autopm_get_interface(
				modem_port_ptr->port->serial->interface);

	stop_data_traffic(modem_port_ptr);
	cancel_work_sync(&modem_port_ptr->wake_and_write);
	modem_port_ptr->port = 0;
	modem_port_ptr->modem_status = 0;
	if (modem_port_ptr->delayed_wb)
		modem_port_ptr->delayed_wb->use = 0;

	if (cdma_modem_debug)
		dev_info(&port->dev, "%s: Exit.\n", __func__);
}
Esempio n. 4
0
static int acm_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct acm *acm = usb_get_intfdata(intf);
	int cnt;

	if (PMSG_IS_AUTO(message)) {
		int b;

		spin_lock_irq(&acm->write_lock);
		b = acm->transmitting;
		spin_unlock_irq(&acm->write_lock);
		if (b)
			return -EBUSY;
	}

	spin_lock_irq(&acm->read_lock);
	spin_lock(&acm->write_lock);
	cnt = acm->susp_count++;
	spin_unlock(&acm->write_lock);
	spin_unlock_irq(&acm->read_lock);

	if (cnt)
		return 0;

	if (test_bit(ASYNCB_INITIALIZED, &acm->port.flags))
		stop_data_traffic(acm);

	return 0;
}
Esempio n. 5
0
static void acm_disconnect(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);
	struct usb_device *usb_dev = interface_to_usbdev(intf);
	struct tty_struct *tty;
	struct urb *res;
	u32 project_info = tegra3_get_project_id();

	/* sibling interface is already cleaning up */
	if (!acm)
		return;

	mutex_lock(&open_mutex);
	if (acm->country_codes) {
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
	}
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
	acm->dev = NULL;
	usb_set_intfdata(acm->control, NULL);
	usb_set_intfdata(acm->data, NULL);

	stop_data_traffic(acm);

	/* decrement ref count of anchored urbs */
	while ((res = usb_get_from_anchor(&acm->deferred)))
		usb_put_urb(res);

	acm_write_buffers_free(acm);
	usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer,
			  acm->ctrl_dma);
	acm_read_buffers_free(acm);

	if (!acm->combined_interfaces)
		usb_driver_release_interface(&acm_driver, intf == acm->control ?
					acm->data : acm->control);

	if (acm->port.count == 0) {
		acm_tty_unregister(acm);
		mutex_unlock(&open_mutex);
		return;
	}

	mutex_unlock(&open_mutex);
	tty = tty_port_tty_get(&acm->port);
	if (tty) {
		tty_hangup(tty);
		tty_kref_put(tty);
	}

	if (project_info == TEGRA3_PROJECT_TF201) {
		if(gps_dongle_flag == true) {
			dev_info(&usb_dev->dev, "ublox - GPS Receiver Dongle unplug.\n");
			gps_dongle_flag = false;
		}
	}
}
static void acm_disconnect(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);
	struct usb_device *usb_dev = interface_to_usbdev(intf);
	struct tty_struct *tty;
	int i;

	dev_dbg(&intf->dev, "%s\n", __func__);

	/* sibling interface is already cleaning up */
	if (!acm)
		return;

	mutex_lock(&acm->mutex);
	acm->disconnected = true;
	if (acm->country_codes) {
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
		kfree(acm->country_codes);
	}
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
	usb_set_intfdata(acm->control, NULL);
	usb_set_intfdata(acm->data, NULL);
	mutex_unlock(&acm->mutex);

	tty = tty_port_tty_get(&acm->port);
	if (tty) {
		tty_vhangup(tty);
		tty_kref_put(tty);
	}

	stop_data_traffic(acm);

	tty_unregister_device(acm_tty_driver, acm->minor);

	usb_free_urb(acm->ctrlurb);
	for (i = 0; i < ACM_NW; i++)
		usb_free_urb(acm->wb[i].urb);
	for (i = 0; i < acm->rx_buflimit; i++)
		usb_free_urb(acm->read_urbs[i]);
	acm_write_buffers_free(acm);
	usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
	acm_read_buffers_free(acm);

	if (!acm->combined_interfaces)
		usb_driver_release_interface(&acm_driver, intf == acm->control ?
					acm->data : acm->control);

	tty_port_put(&acm->port);
}
Esempio n. 7
0
static void acm_disconnect(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);
	struct usb_device *usb_dev = interface_to_usbdev(intf);
	int i;

	if (!acm || !acm->dev) {
		dbg("disconnect on nonexisting interface");
		return;
	}

	mutex_lock(&open_mutex);
	if (!usb_get_intfdata(intf)) {
		mutex_unlock(&open_mutex);
		return;
	}
	if (acm->country_codes){
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
	}
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
	acm->dev = NULL;
	usb_set_intfdata(acm->control, NULL);
	usb_set_intfdata(acm->data, NULL);

	stop_data_traffic(acm);

	acm_write_buffers_free(acm);
	usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
	for (i = 0; i < acm->rx_buflimit; i++)
		usb_buffer_free(usb_dev, acm->readsize, acm->rb[i].base, acm->rb[i].dma);

	usb_driver_release_interface(&acm_driver, intf == acm->control ? acm->data : intf);

	if (!acm->used) {
		acm_tty_unregister(acm);
		mutex_unlock(&open_mutex);
		return;
	}

	mutex_unlock(&open_mutex);

	if (acm->tty)
		tty_hangup(acm->tty);
}
Esempio n. 8
0
static void acm_disconnect(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);
	struct usb_device *usb_dev = interface_to_usbdev(intf);
	struct tty_struct *tty;

	/* sibling interface is already cleaning up */
	if (!acm)
		return;

	mutex_lock(&open_mutex);
	if (acm->country_codes) {
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
	}
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
	acm->dev = NULL;
	usb_set_intfdata(acm->control, NULL);
	usb_set_intfdata(acm->data, NULL);

	stop_data_traffic(acm);

	usb_kill_anchored_urbs(&acm->deferred);
	acm_write_buffers_free(acm);
	usb_free_coherent(usb_dev, acm->ctrlsize, acm->ctrl_buffer,
			  acm->ctrl_dma);
	acm_read_buffers_free(acm);

	if (!acm->combined_interfaces)
		usb_driver_release_interface(&acm_driver, intf == acm->control ?
					acm->data : acm->control);

	if (acm->port.count == 0) {
		acm_tty_unregister(acm);
		mutex_unlock(&open_mutex);
		return;
	}

	mutex_unlock(&open_mutex);
	tty = tty_port_tty_get(&acm->port);
	if (tty) {
		tty_hangup(tty);
		tty_kref_put(tty);
	}
}
Esempio n. 9
0
static int acm_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct acm *acm = usb_get_intfdata(intf);

	if (acm->susp_count++)
		return 0;
	/*
	we treat opened interfaces differently,
	we must guard against open
	*/
	mutex_lock(&acm->mutex);

	if (acm->used)
		stop_data_traffic(acm);

	mutex_unlock(&acm->mutex);
	return 0;
}
Esempio n. 10
0
static void acm_disconnect(struct usb_interface *intf)
{
	struct acm *acm = usb_get_intfdata(intf);
	struct usb_device *usb_dev = interface_to_usbdev(intf);

	/* sibling interface is already cleaning up */
	if (!acm)
		return;

	mutex_lock(&open_mutex);
	if (acm->country_codes){
		device_remove_file(&acm->control->dev,
				&dev_attr_wCountryCodes);
		device_remove_file(&acm->control->dev,
				&dev_attr_iCountryCodeRelDate);
	}
	device_remove_file(&acm->control->dev, &dev_attr_bmCapabilities);
	acm->dev = NULL;
	usb_set_intfdata(acm->control, NULL);
	usb_set_intfdata(acm->data, NULL);

	stop_data_traffic(acm);

	acm_write_buffers_free(acm);
	usb_buffer_free(usb_dev, acm->ctrlsize, acm->ctrl_buffer, acm->ctrl_dma);
	acm_read_buffers_free(acm);

	usb_driver_release_interface(&acm_driver, intf == acm->control ?
					acm->data : acm->control);

	if (!acm->used) {
		acm_tty_unregister(acm);
		mutex_unlock(&open_mutex);
		return;
	}

	mutex_unlock(&open_mutex);

	if (acm->tty)
		tty_hangup(acm->tty);
}
Esempio n. 11
0
static void modem_disconnect(struct usb_serial *serial)
{
	unsigned long flags;
	struct modem_port *modem_port_ptr =
	    usb_get_serial_data(serial);

	uint8_t interface_num =
		serial->interface->cur_altsetting->desc.bInterfaceNumber;

	if (cdma_modem_debug)
		dev_info(&serial->dev->dev,
			 "%s: Disconnect Interface %d\n", __func__,
			interface_num);

	if (modem_port_ptr->number == MODEM_INTERFACE_NUM) {
		/* free BP GPIO wakeup irq */
		if (modem_wake_irq) {
			disable_irq_wake(modem_wake_irq);
			free_irq(modem_wake_irq, modem_port_ptr);
		}
		wake_lock_destroy(&modem.wakelock);
		destroy_workqueue(modem.wq);
	}

	stop_data_traffic(modem_port_ptr);
	cancel_work_sync(&modem_port_ptr->wake_and_write);
	/* Request the regulator be shutdown after a timeout.  This allows the
	   other interfaces time to shutdown as well as the BP time to restart
	   in the case of a panic or some other malfunction. */
	spin_lock_irqsave(&modem.lock, flags);
	if (modem.connected == true)
	{
		modem.connected = false;
		(void)schedule_delayed_work(&modem.delayed_pwr_shutdown,
									msecs_to_jiffies(PWR_DOWN_TIMEOUT_MS));
	}
	spin_unlock_irqrestore(&modem.lock, flags);

	modem_attached_ports--;
}
Esempio n. 12
0
static int acm_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct acm *acm = usb_get_intfdata(intf);
	int cnt;
#if 0
	if (acm->dev->auto_pm) {
		int b;

		spin_lock_irq(&acm->read_lock);
		spin_lock(&acm->write_lock);
		b = acm->processing + acm->transmitting;
		spin_unlock(&acm->write_lock);
		spin_unlock_irq(&acm->read_lock);
		if (b)
			return -EBUSY;
	}
#endif

	spin_lock_irq(&acm->read_lock);
	spin_lock(&acm->write_lock);
	cnt = acm->susp_count++;
	spin_unlock(&acm->write_lock);
	spin_unlock_irq(&acm->read_lock);

	if (cnt)
		return 0;
	/*
	we treat opened interfaces differently,
	we must guard against open
	*/
	mutex_lock(&acm->mutex);

	if (acm->used)
		stop_data_traffic(acm);

	mutex_unlock(&acm->mutex);
	return 0;
}
Esempio n. 13
0
static int modem_suspend(struct usb_interface *intf,
				   pm_message_t message)
{
	struct usb_serial *serial = usb_get_intfdata(intf);
	struct modem_port *modem_port_ptr =
	    usb_get_serial_data(serial);
	struct usb_serial_port *port;
	unsigned long flags;
	unsigned long threshold_time;
	int tmp;

	if (modem_port_ptr == NULL) {
		dev_err(&intf->dev, " NULL modem_port ptr \n");
		return 0;
	}

	if (cdma_modem_debug)
		dev_info(&intf->dev, "%s +++ \n", __func__);

	if (modem_port_ptr->number == MODEM_INTERFACE_NUM) {
		modem_usb_enable_wakeup_irq(intf);
		atomic_set(&modem_port_ptr->wakeup_flag, 0);
	}

	port = modem_port_ptr->port;

	if (port == NULL) {
		if (cdma_modem_debug)
			dev_info(&intf->dev,
				 "%s: port not open yet \n",
				 __func__);
		modem_port_ptr->susp_count++;
		return 0;
	}

	if (cdma_modem_debug)
		dev_info(&intf->dev, "%s: Suspend Port  num %d.\n",
			 __func__, modem_port_ptr->number);

	spin_lock_irqsave(&modem_port_ptr->read_lock, flags);
	spin_lock(&modem_port_ptr->write_lock);
	tmp = modem_port_ptr->processing + modem_port_ptr->sending;
	spin_unlock(&modem_port_ptr->write_lock);
	spin_unlock_irqrestore(&modem_port_ptr->read_lock, flags);

	if (tmp) {
		if (cdma_modem_debug)
			dev_info(&intf->dev,
				 "%s:  sending = %d, receiving = %d.\n",
				 __func__, modem_port_ptr->sending,
				 modem_port_ptr->processing);
		return -EBUSY;
	}

	threshold_time = modem_port_ptr->last_traffic + MODEM_NO_TRAFFIC_TIME;

	if (time_before(jiffies, threshold_time)) {
		if (cdma_modem_debug)
			dev_info(&intf->dev,
				 "%s: busy. suspend failed.\n", __func__);
		if (modem_port_ptr->number == MODEM_INTERFACE_NUM)
			modem_usb_disable_wakeup_irq(intf);
		return -EBUSY;
	}

	spin_lock_irqsave(&modem_port_ptr->read_lock, flags);
	spin_lock(&modem_port_ptr->write_lock);
	modem_port_ptr->susp_count++;
	spin_unlock(&modem_port_ptr->write_lock);
	spin_unlock_irqrestore(&modem_port_ptr->read_lock, flags);

	stop_data_traffic(modem_port_ptr);

	if (cdma_modem_debug)
		dev_info(&intf->dev, "%s: Port  num %d.suspended\n",
			 __func__, modem_port_ptr->number);

	return 0;
}