diff options
Diffstat (limited to 'drivers/usb/serial/cyberjack.c')
| -rw-r--r-- | drivers/usb/serial/cyberjack.c | 49 | 
1 files changed, 19 insertions, 30 deletions
diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c index 2a7aecc7223..4ee77dcbe69 100644 --- a/drivers/usb/serial/cyberjack.c +++ b/drivers/usb/serial/cyberjack.c @@ -55,9 +55,9 @@  #define CYBERJACK_PRODUCT_ID	0x0100  /* Function prototypes */ -static int cyberjack_startup(struct usb_serial *serial);  static void cyberjack_disconnect(struct usb_serial *serial); -static void cyberjack_release(struct usb_serial *serial); +static int cyberjack_port_probe(struct usb_serial_port *port); +static int cyberjack_port_remove(struct usb_serial_port *port);  static int  cyberjack_open(struct tty_struct *tty,  	struct usb_serial_port *port);  static void cyberjack_close(struct usb_serial_port *port); @@ -83,9 +83,9 @@ static struct usb_serial_driver cyberjack_device = {  	.description =		"Reiner SCT Cyberjack USB card reader",  	.id_table =		id_table,  	.num_ports =		1, -	.attach =		cyberjack_startup,  	.disconnect =		cyberjack_disconnect, -	.release =		cyberjack_release, +	.port_probe =		cyberjack_port_probe, +	.port_remove =		cyberjack_port_remove,  	.open =			cyberjack_open,  	.close =		cyberjack_close,  	.write =		cyberjack_write, @@ -107,56 +107,45 @@ struct cyberjack_private {  	short		wrsent;		/* Data already sent */  }; -/* do some startup allocations not currently performed by usb_serial_probe() */ -static int cyberjack_startup(struct usb_serial *serial) +static int cyberjack_port_probe(struct usb_serial_port *port)  {  	struct cyberjack_private *priv; -	int i; +	int result; -	/* allocate the private data structure */  	priv = kmalloc(sizeof(struct cyberjack_private), GFP_KERNEL);  	if (!priv)  		return -ENOMEM; -	/* set initial values */  	spin_lock_init(&priv->lock);  	priv->rdtodo = 0;  	priv->wrfilled = 0;  	priv->wrsent = 0; -	usb_set_serial_port_data(serial->port[0], priv); -	init_waitqueue_head(&serial->port[0]->write_wait); +	usb_set_serial_port_data(port, priv); -	for (i = 0; i < serial->num_ports; ++i) { -		int result; -		result = usb_submit_urb(serial->port[i]->interrupt_in_urb, -					GFP_KERNEL); -		if (result) -			dev_err(&serial->dev->dev, -				"usb_submit_urb(read int) failed\n"); -		dev_dbg(&serial->dev->dev, "%s - usb_submit_urb(int urb)\n", -			__func__); -	} +	result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL); +	if (result) +		dev_err(&port->dev, "usb_submit_urb(read int) failed\n");  	return 0;  } -static void cyberjack_disconnect(struct usb_serial *serial) +static int cyberjack_port_remove(struct usb_serial_port *port)  { -	int i; +	struct cyberjack_private *priv; -	for (i = 0; i < serial->num_ports; ++i) -		usb_kill_urb(serial->port[i]->interrupt_in_urb); +	priv = usb_get_serial_port_data(port); +	kfree(priv); + +	return 0;  } -static void cyberjack_release(struct usb_serial *serial) +static void cyberjack_disconnect(struct usb_serial *serial)  {  	int i; -	for (i = 0; i < serial->num_ports; ++i) { -		/* My special items, the standard routines free my urbs */ -		kfree(usb_get_serial_port_data(serial->port[i])); -	} +	for (i = 0; i < serial->num_ports; ++i) +		usb_kill_urb(serial->port[i]->interrupt_in_urb);  }  static int  cyberjack_open(struct tty_struct *tty,  |