Merge 3.6-rc3 into tty-next
This picks up all of the different fixes in Linus's tree that we also need here. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -565,6 +565,33 @@ bail_out_error:
|
||||
}
|
||||
EXPORT_SYMBOL(usb_wwan_startup);
|
||||
|
||||
int usb_wwan_port_remove(struct usb_serial_port *port)
|
||||
{
|
||||
int i;
|
||||
struct usb_wwan_port_private *portdata;
|
||||
|
||||
portdata = usb_get_serial_port_data(port);
|
||||
usb_set_serial_port_data(port, NULL);
|
||||
|
||||
/* Stop reading/writing urbs and free them */
|
||||
for (i = 0; i < N_IN_URB; i++) {
|
||||
usb_kill_urb(portdata->in_urbs[i]);
|
||||
usb_free_urb(portdata->in_urbs[i]);
|
||||
free_page((unsigned long)portdata->in_buffer[i]);
|
||||
}
|
||||
for (i = 0; i < N_OUT_URB; i++) {
|
||||
usb_kill_urb(portdata->out_urbs[i]);
|
||||
usb_free_urb(portdata->out_urbs[i]);
|
||||
kfree(portdata->out_buffer[i]);
|
||||
}
|
||||
|
||||
/* Now free port private data */
|
||||
kfree(portdata);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(usb_wwan_port_remove);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static void stop_read_write_urbs(struct usb_serial *serial)
|
||||
{
|
||||
int i, j;
|
||||
@@ -575,6 +602,8 @@ static void stop_read_write_urbs(struct usb_serial *serial)
|
||||
for (i = 0; i < serial->num_ports; ++i) {
|
||||
port = serial->port[i];
|
||||
portdata = usb_get_serial_port_data(port);
|
||||
if (!portdata)
|
||||
continue;
|
||||
for (j = 0; j < N_IN_URB; j++)
|
||||
usb_kill_urb(portdata->in_urbs[j]);
|
||||
for (j = 0; j < N_OUT_URB; j++)
|
||||
@@ -582,45 +611,6 @@ static void stop_read_write_urbs(struct usb_serial *serial)
|
||||
}
|
||||
}
|
||||
|
||||
void usb_wwan_disconnect(struct usb_serial *serial)
|
||||
{
|
||||
stop_read_write_urbs(serial);
|
||||
}
|
||||
EXPORT_SYMBOL(usb_wwan_disconnect);
|
||||
|
||||
void usb_wwan_release(struct usb_serial *serial)
|
||||
{
|
||||
int i, j;
|
||||
struct usb_serial_port *port;
|
||||
struct usb_wwan_port_private *portdata;
|
||||
|
||||
/* Now free them */
|
||||
for (i = 0; i < serial->num_ports; ++i) {
|
||||
port = serial->port[i];
|
||||
portdata = usb_get_serial_port_data(port);
|
||||
|
||||
for (j = 0; j < N_IN_URB; j++) {
|
||||
usb_free_urb(portdata->in_urbs[j]);
|
||||
free_page((unsigned long)
|
||||
portdata->in_buffer[j]);
|
||||
portdata->in_urbs[j] = NULL;
|
||||
}
|
||||
for (j = 0; j < N_OUT_URB; j++) {
|
||||
usb_free_urb(portdata->out_urbs[j]);
|
||||
kfree(portdata->out_buffer[j]);
|
||||
portdata->out_urbs[j] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now free per port private data */
|
||||
for (i = 0; i < serial->num_ports; i++) {
|
||||
port = serial->port[i];
|
||||
kfree(usb_get_serial_port_data(port));
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(usb_wwan_release);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
int usb_wwan_suspend(struct usb_serial *serial, pm_message_t message)
|
||||
{
|
||||
struct usb_wwan_intf_private *intfdata = serial->private;
|
||||
@@ -712,7 +702,7 @@ int usb_wwan_resume(struct usb_serial *serial)
|
||||
|
||||
/* skip closed ports */
|
||||
spin_lock_irq(&intfdata->susp_lock);
|
||||
if (!portdata->opened) {
|
||||
if (!portdata || !portdata->opened) {
|
||||
spin_unlock_irq(&intfdata->susp_lock);
|
||||
continue;
|
||||
}
|
||||
|
Reference in New Issue
Block a user