diff options
Diffstat (limited to 'drivers/usb/serial/keyspan.c')
| -rw-r--r-- | drivers/usb/serial/keyspan.c | 1056 | 
1 files changed, 404 insertions, 652 deletions
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 0791778a66f..93cb7cebda6 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c @@ -25,122 +25,51 @@    Tip 'o the hat to IBM (and previously Linuxcare :) for supporting    staff in their work on open source projects. - -  Change History - -    2003sep04	LPM (Keyspan) add support for new single port product USA19HS. -				Improve setup message handling for all devices. - -    Wed Feb 19 22:00:00 PST 2003 (Jeffrey S. Laing <keyspan@jsl.com>) -      Merged the current (1/31/03) Keyspan code with the current (2.4.21-pre4) -      Linux source tree.  The Linux tree lacked support for the 49WLC and -      others.  The Keyspan patches didn't work with the current kernel. - -    2003jan30	LPM	add support for the 49WLC and MPR - -    Wed Apr 25 12:00:00 PST 2002 (Keyspan) -      Started with Hugh Blemings' code dated Jan 17, 2002.  All adapters -      now supported (including QI and QW).  Modified port open, port -      close, and send setup() logic to fix various data and endpoint -      synchronization bugs and device LED status bugs.  Changed keyspan_ -      write_room() to accurately return transmit buffer availability. -      Changed forwardingLength from 1 to 16 for all adapters. - -    Fri Oct 12 16:45:00 EST 2001 -      Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV) - -    Wed Apr 25 12:00:00 PST 2002 (Keyspan) -      Started with Hugh Blemings' code dated Jan 17, 2002.  All adapters -      now supported (including QI and QW).  Modified port open, port -      close, and send setup() logic to fix various data and endpoint -      synchronization bugs and device LED status bugs.  Changed keyspan_ -      write_room() to accurately return transmit buffer availability. -      Changed forwardingLength from 1 to 16 for all adapters. - -    Fri Oct 12 16:45:00 EST 2001 -      Preliminary USA-19QI and USA-28 support (both test OK for me, YMMV) - -    Mon Oct  8 14:29:00 EST 2001 hugh -      Fixed bug that prevented mulitport devices operating correctly -      if they weren't the first unit attached. - -    Sat Oct  6 12:31:21 EST 2001 hugh -      Added support for USA-28XA and -28XB, misc cleanups, break support -      for usa26 based models thanks to David Gibson. - -    Thu May 31 11:56:42 PDT 2001 gkh -      switched from using spinlock to a semaphore - -    (04/08/2001) gb -	Identify version on module load. - -    (11/01/2000) Adam J. Richter -	usb_device_id table support. - -    Tue Oct 10 23:15:33 EST 2000 Hugh -      Merged Paul's changes with my USA-49W mods.  Work in progress -      still... - -    Wed Jul 19 14:00:42 EST 2000 gkh -      Added module_init and module_exit functions to handle the fact that -      this driver is a loadable module now. - -    Tue Jul 18 16:14:52 EST 2000 Hugh -      Basic character input/output for USA-19 now mostly works, -      fixed at 9600 baud for the moment. - -    Sat Jul  8 11:11:48 EST 2000 Hugh -      First public release - nothing works except the firmware upload. -      Tested on PPC and x86 architectures, seems to behave...  */  #include <linux/kernel.h>  #include <linux/jiffies.h>  #include <linux/errno.h> -#include <linux/init.h>  #include <linux/slab.h>  #include <linux/tty.h>  #include <linux/tty_driver.h>  #include <linux/tty_flip.h>  #include <linux/module.h>  #include <linux/spinlock.h> -#include <linux/firmware.h> -#include <linux/ihex.h>  #include <linux/uaccess.h>  #include <linux/usb.h>  #include <linux/usb/serial.h> +#include <linux/usb/ezusb.h>  #include "keyspan.h" -static int debug; - -/* - * Version Information - */ -#define DRIVER_VERSION "v1.1.5"  #define DRIVER_AUTHOR "Hugh Blemings <hugh@misc.nu"  #define DRIVER_DESC "Keyspan USB to Serial Converter Driver"  #define INSTAT_BUFLEN	32  #define GLOCONT_BUFLEN	64  #define INDAT49W_BUFLEN	512 +#define IN_BUFLEN	64 +#define OUT_BUFLEN	64 +#define INACK_BUFLEN	1 +#define OUTCONT_BUFLEN	64  	/* Per device and per port private data */  struct keyspan_serial_private {  	const struct keyspan_device_details	*device_details;  	struct urb	*instat_urb; -	char		instat_buf[INSTAT_BUFLEN]; +	char		*instat_buf;  	/* added to support 49wg, where data from all 4 ports comes in  	   on 1 EP and high-speed supported */  	struct urb	*indat_urb; -	char		indat_buf[INDAT49W_BUFLEN]; +	char		*indat_buf;  	/* XXX this one probably will need a lock */  	struct urb	*glocont_urb; -	char		glocont_buf[GLOCONT_BUFLEN]; -	char		ctrl_buf[8];	/* for EP0 control message */ +	char		*glocont_buf; +	char		*ctrl_buf;	/* for EP0 control message */  };  struct keyspan_port_private { @@ -155,18 +84,18 @@ struct keyspan_port_private {  	/* Input endpoints and buffer for this port */  	struct urb	*in_urbs[2]; -	char		in_buffer[2][64]; +	char		*in_buffer[2];  	/* Output endpoints and buffer for this port */  	struct urb	*out_urbs[2]; -	char		out_buffer[2][64]; +	char		*out_buffer[2];  	/* Input ack endpoint */  	struct urb	*inack_urb; -	char		inack_buffer[1]; +	char		*inack_buffer;  	/* Output control endpoint */  	struct urb	*outcont_urb; -	char		outcont_buffer[64]; +	char		*outcont_buffer;  	/* Settings for the port */  	int		baud; @@ -197,61 +126,13 @@ struct keyspan_port_private {  #include "keyspan_usa67msg.h" -/* Functions used by new usb-serial code. */ -static int __init keyspan_init(void) -{ -	int retval; -	retval = usb_serial_register(&keyspan_pre_device); -	if (retval) -		goto failed_pre_device_register; -	retval = usb_serial_register(&keyspan_1port_device); -	if (retval) -		goto failed_1port_device_register; -	retval = usb_serial_register(&keyspan_2port_device); -	if (retval) -		goto failed_2port_device_register; -	retval = usb_serial_register(&keyspan_4port_device); -	if (retval) -		goto failed_4port_device_register; -	retval = usb_register(&keyspan_driver); -	if (retval) -		goto failed_usb_register; - -	printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":" -	       DRIVER_DESC "\n"); - -	return 0; -failed_usb_register: -	usb_serial_deregister(&keyspan_4port_device); -failed_4port_device_register: -	usb_serial_deregister(&keyspan_2port_device); -failed_2port_device_register: -	usb_serial_deregister(&keyspan_1port_device); -failed_1port_device_register: -	usb_serial_deregister(&keyspan_pre_device); -failed_pre_device_register: -	return retval; -} - -static void __exit keyspan_exit(void) -{ -	usb_deregister(&keyspan_driver); -	usb_serial_deregister(&keyspan_pre_device); -	usb_serial_deregister(&keyspan_1port_device); -	usb_serial_deregister(&keyspan_2port_device); -	usb_serial_deregister(&keyspan_4port_device); -} - -module_init(keyspan_init); -module_exit(keyspan_exit); +module_usb_serial_driver(serial_drivers, keyspan_ids_combined);  static void keyspan_break_ctl(struct tty_struct *tty, int break_state)  {  	struct usb_serial_port *port = tty->driver_data;  	struct keyspan_port_private 	*p_priv; -	dbg("%s", __func__); -  	p_priv = usb_get_serial_port_data(port);  	if (break_state == -1) @@ -271,21 +152,19 @@ static void keyspan_set_termios(struct tty_struct *tty,  	const struct keyspan_device_details	*d_details;  	unsigned int 			cflag; -	dbg("%s", __func__); -  	p_priv = usb_get_serial_port_data(port);  	d_details = p_priv->device_details; -	cflag = tty->termios->c_cflag; -	device_port = port->number - port->serial->minor; +	cflag = tty->termios.c_cflag; +	device_port = port->port_number;  	/* Baud rate calculation takes baud rate as an integer  	   so other rates can be generated if desired. */  	baud_rate = tty_get_baud_rate(tty);  	/* If no match or invalid, don't change */ -	if (d_details->calculate_baud_rate(baud_rate, d_details->baudclk, +	if (d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,  				NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {  		/* FIXME - more to do here to ensure rate changes cleanly */ -		/* FIXME - calcuate exact rate from divisor ? */ +		/* FIXME - calculate exact rate from divisor ? */  		p_priv->baud = baud_rate;  	} else  		baud_rate = tty_termios_baud_rate(old_termios); @@ -293,15 +172,15 @@ static void keyspan_set_termios(struct tty_struct *tty,  	tty_encode_baud_rate(tty, baud_rate, baud_rate);  	/* set CTS/RTS handshake etc. */  	p_priv->cflag = cflag; -	p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none; +	p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;  	/* Mark/Space not supported */ -	tty->termios->c_cflag &= ~CMSPAR; +	tty->termios.c_cflag &= ~CMSPAR;  	keyspan_send_setup(port, 0);  } -static int keyspan_tiocmget(struct tty_struct *tty, struct file *file) +static int keyspan_tiocmget(struct tty_struct *tty)  {  	struct usb_serial_port *port = tty->driver_data;  	struct keyspan_port_private *p_priv = usb_get_serial_port_data(port); @@ -317,7 +196,7 @@ static int keyspan_tiocmget(struct tty_struct *tty, struct file *file)  	return value;  } -static int keyspan_tiocmset(struct tty_struct *tty, struct file *file, +static int keyspan_tiocmset(struct tty_struct *tty,  			    unsigned int set, unsigned int clear)  {  	struct usb_serial_port *port = tty->driver_data; @@ -358,8 +237,8 @@ static int keyspan_write(struct tty_struct *tty,  		dataOffset = 1;  	} -	dbg("%s - for port %d (%d chars), flip=%d", -	    __func__, port->number, count, p_priv->out_flip); +	dev_dbg(&port->dev, "%s - %d chars, flip=%d\n", __func__, count, +		p_priv->out_flip);  	for (left = count; left > 0; left -= todo) {  		todo = left; @@ -372,11 +251,11 @@ static int keyspan_write(struct tty_struct *tty,  		this_urb = p_priv->out_urbs[flip];  		if (this_urb == NULL) {  			/* no bulk out, so return 0 bytes written */ -			dbg("%s - no output urb :(", __func__); +			dev_dbg(&port->dev, "%s - no output urb :(\n", __func__);  			return count;  		} -		dbg("%s - endpoint %d flip %d", +		dev_dbg(&port->dev, "%s - endpoint %d flip %d\n",  			__func__, usb_pipeendpoint(this_urb->pipe), flip);  		if (this_urb->status == -EINPROGRESS) { @@ -397,10 +276,9 @@ static int keyspan_write(struct tty_struct *tty,  		/* send the data out the bulk port */  		this_urb->transfer_buffer_length = todo + dataOffset; -		this_urb->dev = port->serial->dev;  		err = usb_submit_urb(this_urb, GFP_ATOMIC);  		if (err != 0) -			dbg("usb_submit_urb(write bulk) failed (%d)", err); +			dev_dbg(&port->dev, "usb_submit_urb(write bulk) failed (%d)\n", err);  		p_priv->tx_start_time[flip] = jiffies;  		/* Flip for next time if usa26 or usa28 interface @@ -416,23 +294,19 @@ static void	usa26_indat_callback(struct urb *urb)  	int			i, err;  	int			endpoint;  	struct usb_serial_port	*port; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; -	dbg("%s", __func__); -  	endpoint = usb_pipeendpoint(urb->pipe);  	if (status) { -		dbg("%s - nonzero status: %x on endpoint %d.", -		    __func__, status, endpoint); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n", +			__func__, status, endpoint);  		return;  	}  	port =  urb->context; -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		/* 0x80 bit is error flag */  		if ((data[0] & 0x80) == 0) {  			/* no errors on individual bytes, only @@ -442,10 +316,10 @@ static void	usa26_indat_callback(struct urb *urb)  			else  				err = 0;  			for (i = 1; i < urb->actual_length ; ++i) -				tty_insert_flip_char(tty, data[i], err); +				tty_insert_flip_char(&port->port, data[i], err);  		} else {  			/* some bytes had errors, every byte has status */ -			dbg("%s - RX error!!!!", __func__); +			dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);  			for (i = 0; i + 1 < urb->actual_length; i += 2) {  				int stat = data[i], flag = 0;  				if (stat & RXERROR_OVERRUN) @@ -455,18 +329,17 @@ static void	usa26_indat_callback(struct urb *urb)  				if (stat & RXERROR_PARITY)  					flag |= TTY_PARITY;  				/* XXX should handle break (0x10) */ -				tty_insert_flip_char(tty, data[i+1], flag); +				tty_insert_flip_char(&port->port, data[i+1], +						flag);  			}  		} -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	/* Resubmit urb so we continue receiving */ -	urb->dev = port->serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  }  /* Outdat handling is common for all devices */ @@ -477,15 +350,13 @@ static void	usa2x_outdat_callback(struct urb *urb)  	port =  urb->context;  	p_priv = usb_get_serial_port_data(port); -	dbg("%s - urb %d", __func__, urb == p_priv->out_urbs[1]); +	dev_dbg(&port->dev, "%s - urb %d\n", __func__, urb == p_priv->out_urbs[1]);  	usb_serial_port_softint(port);  }  static void	usa26_inack_callback(struct urb *urb)  { -	dbg("%s", __func__); -  }  static void	usa26_outcont_callback(struct urb *urb) @@ -497,7 +368,7 @@ static void	usa26_outcont_callback(struct urb *urb)  	p_priv = usb_get_serial_port_data(port);  	if (p_priv->resend_cont) { -		dbg("%s - sending setup", __func__); +		dev_dbg(&port->dev, "%s - sending setup\n", __func__);  		keyspan_usa26_send_setup(port->serial, port,  						p_priv->resend_cont - 1);  	} @@ -510,35 +381,25 @@ static void	usa26_instat_callback(struct urb *urb)  	struct usb_serial			*serial;  	struct usb_serial_port			*port;  	struct keyspan_port_private	 	*p_priv; -	struct tty_struct			*tty;  	int old_dcd_state, err;  	int status = urb->status;  	serial =  urb->context;  	if (status) { -		dbg("%s - nonzero status: %x", __func__, status); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);  		return;  	}  	if (urb->actual_length != 9) { -		dbg("%s - %d byte report??", __func__, urb->actual_length); +		dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);  		goto exit;  	}  	msg = (struct keyspan_usa26_portStatusMessage *)data; -#if 0 -	dbg("%s - port status: port %d cts %d dcd %d dsr %d ri %d toff %d txoff %d rxen %d cr %d", -	    __func__, msg->port, msg->hskia_cts, msg->gpia_dcd, msg->dsr, msg->ri, msg->_txOff, -	    msg->_txXoff, msg->rxEnabled, msg->controlResponse); -#endif - -	/* Now do something useful with the data */ - -  	/* Check port number from message and retrieve private data */  	if (msg->port >= serial->num_ports) { -		dbg("%s - Unexpected port number %d", __func__, msg->port); +		dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);  		goto exit;  	}  	port = serial->port[msg->port]; @@ -551,24 +412,18 @@ static void	usa26_instat_callback(struct urb *urb)  	p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);  	p_priv->ri_state = ((msg->ri) ? 1 : 0); -	if (old_dcd_state != p_priv->dcd_state) { -		tty = tty_port_tty_get(&port->port); -		if (tty && !C_CLOCAL(tty)) -			tty_hangup(tty); -		tty_kref_put(tty); -	} +	if (old_dcd_state != p_priv->dcd_state) +		tty_port_tty_hangup(&port->port, true);  	/* Resubmit urb so we continue receiving */ -	urb->dev = serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  exit: ;  }  static void	usa26_glocont_callback(struct urb *urb)  { -	dbg("%s", __func__);  } @@ -576,13 +431,10 @@ static void usa28_indat_callback(struct urb *urb)  {  	int                     err;  	struct usb_serial_port  *port; -	struct tty_struct       *tty;  	unsigned char           *data;  	struct keyspan_port_private             *p_priv;  	int status = urb->status; -	dbg("%s", __func__); -  	port =  urb->context;  	p_priv = usb_get_serial_port_data(port);  	data = urb->transfer_buffer; @@ -592,8 +444,8 @@ static void usa28_indat_callback(struct urb *urb)  	do {  		if (status) { -			dbg("%s - nonzero status: %x on endpoint %d.", -			    __func__, status, usb_pipeendpoint(urb->pipe)); +			dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n", +				__func__, status, usb_pipeendpoint(urb->pipe));  			return;  		} @@ -601,18 +453,16 @@ static void usa28_indat_callback(struct urb *urb)  		p_priv = usb_get_serial_port_data(port);  		data = urb->transfer_buffer; -		tty =tty_port_tty_get(&port->port); -		if (tty && urb->actual_length) { -			tty_insert_flip_string(tty, data, urb->actual_length); -			tty_flip_buffer_push(tty); +		if (urb->actual_length) { +			tty_insert_flip_string(&port->port, data, +					urb->actual_length); +			tty_flip_buffer_push(&port->port);  		} -		tty_kref_put(tty);  		/* Resubmit urb so we continue receiving */ -		urb->dev = port->serial->dev;  		err = usb_submit_urb(urb, GFP_ATOMIC);  		if (err != 0) -			dbg("%s - resubmit read urb failed. (%d)", +			dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n",  							__func__, err);  		p_priv->in_flip ^= 1; @@ -622,7 +472,6 @@ static void usa28_indat_callback(struct urb *urb)  static void	usa28_inack_callback(struct urb *urb)  { -	dbg("%s", __func__);  }  static void	usa28_outcont_callback(struct urb *urb) @@ -634,7 +483,7 @@ static void	usa28_outcont_callback(struct urb *urb)  	p_priv = usb_get_serial_port_data(port);  	if (p_priv->resend_cont) { -		dbg("%s - sending setup", __func__); +		dev_dbg(&port->dev, "%s - sending setup\n", __func__);  		keyspan_usa28_send_setup(port->serial, port,  						p_priv->resend_cont - 1);  	} @@ -648,32 +497,26 @@ static void	usa28_instat_callback(struct urb *urb)  	struct usb_serial			*serial;  	struct usb_serial_port			*port;  	struct keyspan_port_private	 	*p_priv; -	struct tty_struct			*tty;  	int old_dcd_state;  	int status = urb->status;  	serial =  urb->context;  	if (status) { -		dbg("%s - nonzero status: %x", __func__, status); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);  		return;  	}  	if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) { -		dbg("%s - bad length %d", __func__, urb->actual_length); +		dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);  		goto exit;  	} -	/*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __func__ -	    data[0], data[1], data[2], data[3], data[4], data[5], -	    data[6], data[7], data[8], data[9], data[10], data[11]);*/ - -	/* Now do something useful with the data */  	msg = (struct keyspan_usa28_portStatusMessage *)data;  	/* Check port number from message and retrieve private data */  	if (msg->port >= serial->num_ports) { -		dbg("%s - Unexpected port number %d", __func__, msg->port); +		dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);  		goto exit;  	}  	port = serial->port[msg->port]; @@ -686,24 +529,18 @@ static void	usa28_instat_callback(struct urb *urb)  	p_priv->dcd_state = ((msg->dcd) ? 1 : 0);  	p_priv->ri_state = ((msg->ri) ? 1 : 0); -	if( old_dcd_state != p_priv->dcd_state && old_dcd_state) { -		tty = tty_port_tty_get(&port->port); -		if (tty && !C_CLOCAL(tty))  -			tty_hangup(tty); -		tty_kref_put(tty); -	} +	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) +		tty_port_tty_hangup(&port->port, true);  		/* Resubmit urb so we continue receiving */ -	urb->dev = serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  exit: ;  }  static void	usa28_glocont_callback(struct urb *urb)  { -	dbg("%s", __func__);  } @@ -714,15 +551,13 @@ static void	usa49_glocont_callback(struct urb *urb)  	struct keyspan_port_private *p_priv;  	int i; -	dbg("%s", __func__); -  	serial =  urb->context;  	for (i = 0; i < serial->num_ports; ++i) {  		port = serial->port[i];  		p_priv = usb_get_serial_port_data(port);  		if (p_priv->resend_cont) { -			dbg("%s - sending setup", __func__); +			dev_dbg(&port->dev, "%s - sending setup\n", __func__);  			keyspan_usa49_send_setup(serial, port,  						p_priv->resend_cont - 1);  			break; @@ -743,32 +578,25 @@ static void	usa49_instat_callback(struct urb *urb)  	int old_dcd_state;  	int status = urb->status; -	dbg("%s", __func__); -  	serial =  urb->context;  	if (status) { -		dbg("%s - nonzero status: %x", __func__, status); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);  		return;  	}  	if (urb->actual_length !=  			sizeof(struct keyspan_usa49_portStatusMessage)) { -		dbg("%s - bad length %d", __func__, urb->actual_length); +		dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);  		goto exit;  	} -	/*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __func__, -	    data[0], data[1], data[2], data[3], data[4], data[5], -	    data[6], data[7], data[8], data[9], data[10]);*/ - -	/* Now do something useful with the data */  	msg = (struct keyspan_usa49_portStatusMessage *)data;  	/* Check port number from message and retrieve private data */  	if (msg->portNumber >= serial->num_ports) { -		dbg("%s - Unexpected port number %d", -					__func__, msg->portNumber); +		dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", +			__func__, msg->portNumber);  		goto exit;  	}  	port = serial->port[msg->portNumber]; @@ -781,25 +609,18 @@ static void	usa49_instat_callback(struct urb *urb)  	p_priv->dcd_state = ((msg->dcd) ? 1 : 0);  	p_priv->ri_state = ((msg->ri) ? 1 : 0); -	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) { -		struct tty_struct *tty = tty_port_tty_get(&port->port); -		if (tty && !C_CLOCAL(tty)) -			tty_hangup(tty); -		tty_kref_put(tty); -	} +	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) +		tty_port_tty_hangup(&port->port, true);  	/* Resubmit urb so we continue receiving */ -	urb->dev = serial->dev; -  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  exit:	;  }  static void	usa49_inack_callback(struct urb *urb)  { -	dbg("%s", __func__);  }  static void	usa49_indat_callback(struct urb *urb) @@ -807,27 +628,23 @@ static void	usa49_indat_callback(struct urb *urb)  	int			i, err;  	int			endpoint;  	struct usb_serial_port	*port; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; -	dbg("%s", __func__); -  	endpoint = usb_pipeendpoint(urb->pipe);  	if (status) { -		dbg("%s - nonzero status: %x on endpoint %d.", __func__, -		    status, endpoint); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n", +			__func__, status, endpoint);  		return;  	}  	port =  urb->context; -	tty = tty_port_tty_get(&port->port); -	if (tty && urb->actual_length) { +	if (urb->actual_length) {  		/* 0x80 bit is error flag */  		if ((data[0] & 0x80) == 0) {  			/* no error on any byte */ -			tty_insert_flip_string(tty, data + 1, +			tty_insert_flip_string(&port->port, data + 1,  						urb->actual_length - 1);  		} else {  			/* some bytes had errors, every byte has status */ @@ -840,18 +657,17 @@ static void	usa49_indat_callback(struct urb *urb)  				if (stat & RXERROR_PARITY)  					flag |= TTY_PARITY;  				/* XXX should handle break (0x10) */ -				tty_insert_flip_char(tty, data[i+1], flag); +				tty_insert_flip_char(&port->port, data[i+1], +						flag);  			}  		} -		tty_flip_buffer_push(tty); +		tty_flip_buffer_push(&port->port);  	} -	tty_kref_put(tty);  	/* Resubmit urb so we continue receiving */ -	urb->dev = port->serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  }  static void usa49wg_indat_callback(struct urb *urb) @@ -859,16 +675,13 @@ static void usa49wg_indat_callback(struct urb *urb)  	int			i, len, x, err;  	struct usb_serial	*serial;  	struct usb_serial_port	*port; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; -	dbg("%s", __func__); -  	serial = urb->context;  	if (status) { -		dbg("%s - nonzero status: %x", __func__, status); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);  		return;  	} @@ -876,60 +689,56 @@ static void usa49wg_indat_callback(struct urb *urb)  	i = 0;  	len = 0; -	if (urb->actual_length) { -		while (i < urb->actual_length) { +	while (i < urb->actual_length) { -			/* Check port number from message*/ -			if (data[i] >= serial->num_ports) { -				dbg("%s - Unexpected port number %d", -					__func__, data[i]); -				return; -			} -			port = serial->port[data[i++]]; -			tty = tty_port_tty_get(&port->port); -			len = data[i++]; +		/* Check port number from message */ +		if (data[i] >= serial->num_ports) { +			dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", +				__func__, data[i]); +			return; +		} +		port = serial->port[data[i++]]; +		len = data[i++]; -			/* 0x80 bit is error flag */ -			if ((data[i] & 0x80) == 0) { -				/* no error on any byte */ -				i++; -				for (x = 1; x < len ; ++x) -					tty_insert_flip_char(tty, data[i++], 0); -			} else { -				/* -				 * some bytes had errors, every byte has status -				 */ -				for (x = 0; x + 1 < len; x += 2) { -					int stat = data[i], flag = 0; -					if (stat & RXERROR_OVERRUN) -						flag |= TTY_OVERRUN; -					if (stat & RXERROR_FRAMING) -						flag |= TTY_FRAME; -					if (stat & RXERROR_PARITY) -						flag |= TTY_PARITY; -					/* XXX should handle break (0x10) */ -					tty_insert_flip_char(tty, -							data[i+1], flag); -					i += 2; -				} +		/* 0x80 bit is error flag */ +		if ((data[i] & 0x80) == 0) { +			/* no error on any byte */ +			i++; +			for (x = 1; x < len && i < urb->actual_length; ++x) +				tty_insert_flip_char(&port->port, +						data[i++], 0); +		} else { +			/* +			 * some bytes had errors, every byte has status +			 */ +			for (x = 0; x + 1 < len && +				    i + 1 < urb->actual_length; x += 2) { +				int stat = data[i], flag = 0; + +				if (stat & RXERROR_OVERRUN) +					flag |= TTY_OVERRUN; +				if (stat & RXERROR_FRAMING) +					flag |= TTY_FRAME; +				if (stat & RXERROR_PARITY) +					flag |= TTY_PARITY; +				/* XXX should handle break (0x10) */ +				tty_insert_flip_char(&port->port, data[i+1], +						     flag); +				i += 2;  			} -			tty_flip_buffer_push(tty); -			tty_kref_put(tty);  		} +		tty_flip_buffer_push(&port->port);  	}  	/* Resubmit urb so we continue receiving */ -	urb->dev = serial->dev; -  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&urb->dev->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  }  /* not used, usa-49 doesn't have per-port control endpoints */  static void usa49_outcont_callback(struct urb *urb)  { -	dbg("%s", __func__);  }  static void usa90_indat_callback(struct urb *urb) @@ -938,16 +747,13 @@ static void usa90_indat_callback(struct urb *urb)  	int			endpoint;  	struct usb_serial_port	*port;  	struct keyspan_port_private	 	*p_priv; -	struct tty_struct	*tty;  	unsigned char 		*data = urb->transfer_buffer;  	int status = urb->status; -	dbg("%s", __func__); -  	endpoint = usb_pipeendpoint(urb->pipe);  	if (status) { -		dbg("%s - nonzero status: %x on endpoint %d.", +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x on endpoint %d.\n",  		    __func__, status, endpoint);  		return;  	} @@ -956,12 +762,12 @@ static void usa90_indat_callback(struct urb *urb)  	p_priv = usb_get_serial_port_data(port);  	if (urb->actual_length) { -		tty = tty_port_tty_get(&port->port);  		/* if current mode is DMA, looks like usa28 format  		   otherwise looks like usa26 data format */  		if (p_priv->baud > 57600) -			tty_insert_flip_string(tty, data, urb->actual_length); +			tty_insert_flip_string(&port->port, data, +					urb->actual_length);  		else {  			/* 0x80 bit is error flag */  			if ((data[0] & 0x80) == 0) { @@ -972,11 +778,11 @@ static void usa90_indat_callback(struct urb *urb)  				else  					err = 0;  				for (i = 1; i < urb->actual_length ; ++i) -					tty_insert_flip_char(tty, data[i], -									err); +					tty_insert_flip_char(&port->port, +							data[i], err);  			}  else {  			/* some bytes had errors, every byte has status */ -				dbg("%s - RX error!!!!", __func__); +				dev_dbg(&port->dev, "%s - RX error!!!!\n", __func__);  				for (i = 0; i + 1 < urb->actual_length; i += 2) {  					int stat = data[i], flag = 0;  					if (stat & RXERROR_OVERRUN) @@ -986,20 +792,18 @@ static void usa90_indat_callback(struct urb *urb)  					if (stat & RXERROR_PARITY)  						flag |= TTY_PARITY;  					/* XXX should handle break (0x10) */ -					tty_insert_flip_char(tty, data[i+1], -									flag); +					tty_insert_flip_char(&port->port, +							data[i+1], flag);  				}  			}  		} -		tty_flip_buffer_push(tty); -		tty_kref_put(tty); +		tty_flip_buffer_push(&port->port);  	}  	/* Resubmit urb so we continue receiving */ -	urb->dev = port->serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  } @@ -1010,18 +814,17 @@ static void	usa90_instat_callback(struct urb *urb)  	struct usb_serial			*serial;  	struct usb_serial_port			*port;  	struct keyspan_port_private	 	*p_priv; -	struct tty_struct			*tty;  	int old_dcd_state, err;  	int status = urb->status;  	serial =  urb->context;  	if (status) { -		dbg("%s - nonzero status: %x", __func__, status); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);  		return;  	}  	if (urb->actual_length < 14) { -		dbg("%s - %d byte report??", __func__, urb->actual_length); +		dev_dbg(&urb->dev->dev, "%s - %d byte report??\n", __func__, urb->actual_length);  		goto exit;  	} @@ -1039,18 +842,13 @@ static void	usa90_instat_callback(struct urb *urb)  	p_priv->dcd_state = ((msg->dcd) ? 1 : 0);  	p_priv->ri_state = ((msg->ri) ? 1 : 0); -	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) { -		tty = tty_port_tty_get(&port->port); -		if (tty && !C_CLOCAL(tty)) -			tty_hangup(tty); -		tty_kref_put(tty); -	} +	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) +		tty_port_tty_hangup(&port->port, true);  	/* Resubmit urb so we continue receiving */ -	urb->dev = serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  exit:  	;  } @@ -1064,7 +862,7 @@ static void	usa90_outcont_callback(struct urb *urb)  	p_priv = usb_get_serial_port_data(port);  	if (p_priv->resend_cont) { -		dbg("%s - sending setup", __func__); +		dev_dbg(&urb->dev->dev, "%s - sending setup\n", __func__);  		keyspan_usa90_send_setup(port->serial, port,  						p_priv->resend_cont - 1);  	} @@ -1082,18 +880,16 @@ static void	usa67_instat_callback(struct urb *urb)  	int old_dcd_state;  	int status = urb->status; -	dbg("%s", __func__); -  	serial = urb->context;  	if (status) { -		dbg("%s - nonzero status: %x", __func__, status); +		dev_dbg(&urb->dev->dev, "%s - nonzero status: %x\n", __func__, status);  		return;  	}  	if (urb->actual_length !=  			sizeof(struct keyspan_usa67_portStatusMessage)) { -		dbg("%s - bad length %d", __func__, urb->actual_length); +		dev_dbg(&urb->dev->dev, "%s - bad length %d\n", __func__, urb->actual_length);  		return;  	} @@ -1103,7 +899,7 @@ static void	usa67_instat_callback(struct urb *urb)  	/* Check port number from message and retrieve private data */  	if (msg->port >= serial->num_ports) { -		dbg("%s - Unexpected port number %d", __func__, msg->port); +		dev_dbg(&urb->dev->dev, "%s - Unexpected port number %d\n", __func__, msg->port);  		return;  	} @@ -1115,18 +911,13 @@ static void	usa67_instat_callback(struct urb *urb)  	p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);  	p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0); -	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) { -		struct tty_struct *tty = tty_port_tty_get(&port->port); -		if (tty && !C_CLOCAL(tty)) -			tty_hangup(tty); -		tty_kref_put(tty); -	} +	if (old_dcd_state != p_priv->dcd_state && old_dcd_state) +		tty_port_tty_hangup(&port->port, true);  	/* Resubmit urb so we continue receiving */ -	urb->dev = serial->dev;  	err = usb_submit_urb(urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - resubmit read urb failed. (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - resubmit read urb failed. (%d)\n", __func__, err);  }  static void usa67_glocont_callback(struct urb *urb) @@ -1136,15 +927,13 @@ static void usa67_glocont_callback(struct urb *urb)  	struct keyspan_port_private *p_priv;  	int i; -	dbg("%s", __func__); -  	serial = urb->context;  	for (i = 0; i < serial->num_ports; ++i) {  		port = serial->port[i];  		p_priv = usb_get_serial_port_data(port);  		if (p_priv->resend_cont) { -			dbg("%s - sending setup", __func__); +			dev_dbg(&port->dev, "%s - sending setup\n", __func__);  			keyspan_usa67_send_setup(serial, port,  						p_priv->resend_cont - 1);  			break; @@ -1161,7 +950,6 @@ static int keyspan_write_room(struct tty_struct *tty)  	int				data_len;  	struct urb			*this_urb; -	dbg("%s", __func__);  	p_priv = usb_get_serial_port_data(port);  	d_details = p_priv->device_details; @@ -1192,20 +980,15 @@ static int keyspan_write_room(struct tty_struct *tty)  static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)  {  	struct keyspan_port_private 	*p_priv; -	struct keyspan_serial_private 	*s_priv; -	struct usb_serial 		*serial = port->serial;  	const struct keyspan_device_details	*d_details;  	int				i, err;  	int				baud_rate, device_port;  	struct urb			*urb;  	unsigned int			cflag = 0; -	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	d_details = p_priv->device_details; -	dbg("%s - port%d.", __func__, port->number); -  	/* Set some sane defaults */  	p_priv->rts_state = 1;  	p_priv->dtr_state = 1; @@ -1223,15 +1006,13 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)  		urb = p_priv->in_urbs[i];  		if (urb == NULL)  			continue; -		urb->dev = serial->dev;  		/* make sure endpoint data toggle is synchronized  		   with the device */  		usb_clear_halt(urb->dev, urb->pipe);  		err = usb_submit_urb(urb, GFP_KERNEL);  		if (err != 0) -			dbg("%s - submit urb %d failed (%d)", -							__func__, i, err); +			dev_dbg(&port->dev, "%s - submit urb %d failed (%d)\n", __func__, i, err);  	}  	/* Reset low level data toggle on out endpoints */ @@ -1239,7 +1020,6 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)  		urb = p_priv->out_urbs[i];  		if (urb == NULL)  			continue; -		urb->dev = serial->dev;  		/* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),  						usb_pipeout(urb->pipe), 0); */  	} @@ -1247,22 +1027,22 @@ static int keyspan_open(struct tty_struct *tty, struct usb_serial_port *port)  	/* get the terminal config for the setup message now so we don't  	 * need to send 2 of them */ -	device_port = port->number - port->serial->minor; +	device_port = port->port_number;  	if (tty) { -		cflag = tty->termios->c_cflag; +		cflag = tty->termios.c_cflag;  		/* Baud rate calculation takes baud rate as an integer  		   so other rates can be generated if desired. */  		baud_rate = tty_get_baud_rate(tty);  		/* If no match or invalid, leave as default */  		if (baud_rate >= 0 -		    && d_details->calculate_baud_rate(baud_rate, d_details->baudclk, +		    && d_details->calculate_baud_rate(port, baud_rate, d_details->baudclk,  					NULL, NULL, NULL, device_port) == KEYSPAN_BAUD_RATE_OK) {  			p_priv->baud = baud_rate;  		}  	}  	/* set CTS/RTS handshake etc. */  	p_priv->cflag = cflag; -	p_priv->flow_control = (cflag & CRTSCTS)? flow_cts: flow_none; +	p_priv->flow_control = (cflag & CRTSCTS) ? flow_cts : flow_none;  	keyspan_send_setup(port, 1);  	/* mdelay(100); */ @@ -1289,57 +1069,39 @@ static void keyspan_dtr_rts(struct usb_serial_port *port, int on)  static void keyspan_close(struct usb_serial_port *port)  {  	int			i; -	struct usb_serial	*serial = port->serial; -	struct keyspan_serial_private 	*s_priv;  	struct keyspan_port_private 	*p_priv; -	dbg("%s", __func__); -	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	p_priv->rts_state = 0;  	p_priv->dtr_state = 0; -	if (serial->dev) { -		keyspan_send_setup(port, 2); -		/* pilot-xfer seems to work best with this delay */ -		mdelay(100); -		/* keyspan_set_termios(port, NULL); */ -	} - -	/*while (p_priv->outcont_urb->status == -EINPROGRESS) { -		dbg("%s - urb in progress", __func__); -	}*/ +	keyspan_send_setup(port, 2); +	/* pilot-xfer seems to work best with this delay */ +	mdelay(100);  	p_priv->out_flip = 0;  	p_priv->in_flip = 0; -	if (serial->dev) { -		/* Stop reading/writing urbs */ -		stop_urb(p_priv->inack_urb); -		/* stop_urb(p_priv->outcont_urb); */ -		for (i = 0; i < 2; i++) { -			stop_urb(p_priv->in_urbs[i]); -			stop_urb(p_priv->out_urbs[i]); -		} +	stop_urb(p_priv->inack_urb); +	for (i = 0; i < 2; i++) { +		stop_urb(p_priv->in_urbs[i]); +		stop_urb(p_priv->out_urbs[i]);  	}  }  /* download the firmware to a pre-renumeration device */  static int keyspan_fake_startup(struct usb_serial *serial)  { -	int 				response; -	const struct ihex_binrec 	*record; -	char				*fw_name; -	const struct firmware		*fw; +	char	*fw_name; -	dbg("Keyspan startup version %04x product %04x", -	    le16_to_cpu(serial->dev->descriptor.bcdDevice), -	    le16_to_cpu(serial->dev->descriptor.idProduct)); +	dev_dbg(&serial->dev->dev, "Keyspan startup version %04x product %04x\n", +		le16_to_cpu(serial->dev->descriptor.bcdDevice), +		le16_to_cpu(serial->dev->descriptor.idProduct));  	if ((le16_to_cpu(serial->dev->descriptor.bcdDevice) & 0x8000)  								!= 0x8000) { -		dbg("Firmware already loaded.  Quitting."); +		dev_dbg(&serial->dev->dev, "Firmware already loaded.  Quitting.\n");  		return 1;  	} @@ -1399,34 +1161,16 @@ static int keyspan_fake_startup(struct usb_serial *serial)  		return 1;  	} -	if (request_ihex_firmware(&fw, fw_name, &serial->dev->dev)) { -		dev_err(&serial->dev->dev, "Required keyspan firmware image (%s) unavailable.\n", fw_name); -		return(1); -	} - -	dbg("Uploading Keyspan %s firmware.", fw_name); - -		/* download the firmware image */ -	response = ezusb_set_reset(serial, 1); - -	record = (const struct ihex_binrec *)fw->data; +	dev_dbg(&serial->dev->dev, "Uploading Keyspan %s firmware.\n", fw_name); -	while (record) { -		response = ezusb_writememory(serial, be32_to_cpu(record->addr), -					     (unsigned char *)record->data, -					     be16_to_cpu(record->len), 0xa0); -		if (response < 0) { -			dev_err(&serial->dev->dev, "ezusb_writememory failed for Keyspan firmware (%d %04X %p %d)\n", -				response, be32_to_cpu(record->addr), -				record->data, be16_to_cpu(record->len)); -			break; -		} -		record = ihex_next_binrec(record); +	if (ezusb_fx1_ihex_firmware_download(serial->dev, fw_name) < 0) { +		dev_err(&serial->dev->dev, "failed to load firmware \"%s\"\n", +			fw_name); +		return -ENOENT;  	} -	release_firmware(fw); -		/* bring device out of reset. Renumeration will occur in a -		   moment and the new device will bind to the real driver */ -	response = ezusb_set_reset(serial, 0); + +	/* after downloading firmware Renumeration will occur in a +	  moment and the new device will bind to the real driver */  	/* we don't want this device to have a driver assigned to it. */  	return 1; @@ -1462,12 +1206,10 @@ static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,  	if (endpoint == -1)  		return NULL;		/* endpoint not needed */ -	dbg("%s - alloc for endpoint %d.", __func__, endpoint); +	dev_dbg(&serial->interface->dev, "%s - alloc for endpoint %d.\n", __func__, endpoint);  	urb = usb_alloc_urb(0, GFP_KERNEL);		/* No ISO */ -	if (urb == NULL) { -		dbg("%s - alloc for endpoint %d failed.", __func__, endpoint); +	if (!urb)  		return NULL; -	}  	if (endpoint == 0) {  		/* control EP filled in when used */ @@ -1498,7 +1240,7 @@ static struct urb *keyspan_setup_urb(struct usb_serial *serial, int endpoint,  		return NULL;  	} -	dbg("%s - using urb %p for %s endpoint %x", +	dev_dbg(&serial->interface->dev, "%s - using urb %p for %s endpoint %x\n",  	    __func__, urb, ep_type_name, endpoint);  	return urb;  } @@ -1558,15 +1300,9 @@ static struct callbacks {  	   data in device_details */  static void keyspan_setup_urbs(struct usb_serial *serial)  { -	int				i, j;  	struct keyspan_serial_private 	*s_priv;  	const struct keyspan_device_details	*d_details; -	struct usb_serial_port		*port; -	struct keyspan_port_private	*p_priv;  	struct callbacks		*cback; -	int				endp; - -	dbg("%s", __func__);  	s_priv = usb_get_serial_data(serial);  	d_details = s_priv->device_details; @@ -1590,56 +1326,18 @@ static void keyspan_setup_urbs(struct usb_serial *serial)  		(serial, d_details->glocont_endpoint, USB_DIR_OUT,  		 serial, s_priv->glocont_buf, GLOCONT_BUFLEN,  		 cback->glocont_callback); - -	/* Setup endpoints for each port specific thing */ -	for (i = 0; i < d_details->num_ports; i++) { -		port = serial->port[i]; -		p_priv = usb_get_serial_port_data(port); - -		/* Do indat endpoints first, once for each flip */ -		endp = d_details->indat_endpoints[i]; -		for (j = 0; j <= d_details->indat_endp_flip; ++j, ++endp) { -			p_priv->in_urbs[j] = keyspan_setup_urb -				(serial, endp, USB_DIR_IN, port, -				 p_priv->in_buffer[j], 64, -				 cback->indat_callback); -		} -		for (; j < 2; ++j) -			p_priv->in_urbs[j] = NULL; - -		/* outdat endpoints also have flip */ -		endp = d_details->outdat_endpoints[i]; -		for (j = 0; j <= d_details->outdat_endp_flip; ++j, ++endp) { -			p_priv->out_urbs[j] = keyspan_setup_urb -				(serial, endp, USB_DIR_OUT, port, -				 p_priv->out_buffer[j], 64, -				 cback->outdat_callback); -		} -		for (; j < 2; ++j) -			p_priv->out_urbs[j] = NULL; - -		/* inack endpoint */ -		p_priv->inack_urb = keyspan_setup_urb -			(serial, d_details->inack_endpoints[i], USB_DIR_IN, -			 port, p_priv->inack_buffer, 1, cback->inack_callback); - -		/* outcont endpoint */ -		p_priv->outcont_urb = keyspan_setup_urb -			(serial, d_details->outcont_endpoints[i], USB_DIR_OUT, -			 port, p_priv->outcont_buffer, 64, -			 cback->outcont_callback); -	}  }  /* usa19 function doesn't require prescaler */ -static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, +static int keyspan_usa19_calc_baud(struct usb_serial_port *port, +				   u32 baud_rate, u32 baudclk, u8 *rate_hi,  				   u8 *rate_low, u8 *prescaler, int portnum)  {  	u32 	b16,	/* baud rate times 16 (actual rate used internally) */  		div,	/* divisor */  		cnt;	/* inverse of divisor (programmed into 8051) */ -	dbg("%s - %d.", __func__, baud_rate); +	dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);  	/* prevent divide by zero...  */  	b16 = baud_rate * 16L; @@ -1666,19 +1364,20 @@ static int keyspan_usa19_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,  	if (rate_hi)  		*rate_hi = (u8) ((cnt >> 8) & 0xff);  	if (rate_low && rate_hi) -		dbg("%s - %d %02x %02x.", +		dev_dbg(&port->dev, "%s - %d %02x %02x.\n",  				__func__, baud_rate, *rate_hi, *rate_low);  	return KEYSPAN_BAUD_RATE_OK;  }  /* usa19hs function doesn't require prescaler */ -static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, -				   u8 *rate_low, u8 *prescaler, int portnum) +static int keyspan_usa19hs_calc_baud(struct usb_serial_port *port, +				     u32 baud_rate, u32 baudclk, u8 *rate_hi, +				     u8 *rate_low, u8 *prescaler, int portnum)  {  	u32 	b16,	/* baud rate times 16 (actual rate used internally) */  			div;	/* divisor */ -	dbg("%s - %d.", __func__, baud_rate); +	dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);  	/* prevent divide by zero...  */  	b16 = baud_rate * 16L; @@ -1701,13 +1400,14 @@ static int keyspan_usa19hs_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,  		*rate_hi = (u8) ((div >> 8) & 0xff);  	if (rate_low && rate_hi) -		dbg("%s - %d %02x %02x.", +		dev_dbg(&port->dev, "%s - %d %02x %02x.\n",  			__func__, baud_rate, *rate_hi, *rate_low);  	return KEYSPAN_BAUD_RATE_OK;  } -static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, +static int keyspan_usa19w_calc_baud(struct usb_serial_port *port, +				    u32 baud_rate, u32 baudclk, u8 *rate_hi,  				    u8 *rate_low, u8 *prescaler, int portnum)  {  	u32 	b16,	/* baud rate times 16 (actual rate used internally) */ @@ -1719,7 +1419,7 @@ static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,  	u8	best_prescaler;  	int	i; -	dbg("%s - %d.", __func__, baud_rate); +	dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);  	/* prevent divide by zero */  	b16 = baud_rate * 16L; @@ -1764,20 +1464,21 @@ static int keyspan_usa19w_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,  		*rate_hi = (u8) ((div >> 8) & 0xff);  	if (prescaler) {  		*prescaler = best_prescaler; -		/*  dbg("%s - %d %d", __func__, *prescaler, div); */ +		/*  dev_dbg(&port->dev, "%s - %d %d\n", __func__, *prescaler, div); */  	}  	return KEYSPAN_BAUD_RATE_OK;  }  	/* USA-28 supports different maximum baud rates on each port */ -static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi, -				    u8 *rate_low, u8 *prescaler, int portnum) +static int keyspan_usa28_calc_baud(struct usb_serial_port *port, +				   u32 baud_rate, u32 baudclk, u8 *rate_hi, +				   u8 *rate_low, u8 *prescaler, int portnum)  {  	u32 	b16,	/* baud rate times 16 (actual rate used internally) */  		div,	/* divisor */  		cnt;	/* inverse of divisor (programmed into 8051) */ -	dbg("%s - %d.", __func__, baud_rate); +	dev_dbg(&port->dev, "%s - %d.\n", __func__, baud_rate);  		/* prevent divide by zero */  	b16 = baud_rate * 16L; @@ -1810,7 +1511,7 @@ static int keyspan_usa28_calc_baud(u32 baud_rate, u32 baudclk, u8 *rate_hi,  		*rate_low = (u8) (cnt & 0xff);  	if (rate_hi)  		*rate_hi = (u8) ((cnt >> 8) & 0xff); -	dbg("%s - %d OK.", __func__, baud_rate); +	dev_dbg(&port->dev, "%s - %d OK.\n", __func__, baud_rate);  	return KEYSPAN_BAUD_RATE_OK;  } @@ -1822,34 +1523,32 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	struct keyspan_serial_private 		*s_priv;  	struct keyspan_port_private 		*p_priv;  	const struct keyspan_device_details	*d_details; -	int 					outcont_urb;  	struct urb				*this_urb;  	int 					device_port, err; -	dbg("%s reset=%d", __func__, reset_port); +	dev_dbg(&port->dev, "%s reset=%d\n", __func__, reset_port);  	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	d_details = s_priv->device_details; -	device_port = port->number - port->serial->minor; +	device_port = port->port_number; -	outcont_urb = d_details->outcont_endpoints[port->number];  	this_urb = p_priv->outcont_urb; -	dbg("%s - endpoint %d", __func__, usb_pipeendpoint(this_urb->pipe)); -  		/* Make sure we have an urb then send the message */  	if (this_urb == NULL) { -		dbg("%s - oops no urb.", __func__); +		dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);  		return -1;  	} +	dev_dbg(&port->dev, "%s - endpoint %d\n", __func__, usb_pipeendpoint(this_urb->pipe)); +  	/* Save reset port val for resend.  	   Don't overwrite resend for open/close condition. */  	if ((reset_port + 1) > p_priv->resend_cont)  		p_priv->resend_cont = reset_port + 1;  	if (this_urb->status == -EINPROGRESS) { -		/*  dbg("%s - already writing", __func__); */ +		/*  dev_dbg(&port->dev, "%s - already writing\n", __func__); */  		mdelay(5);  		return -1;  	} @@ -1860,11 +1559,11 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	if (p_priv->old_baud != p_priv->baud) {  		p_priv->old_baud = p_priv->baud;  		msg.setClocking = 0xff; -		if (d_details->calculate_baud_rate -		    (p_priv->baud, d_details->baudclk, &msg.baudHi, -		     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) { -			dbg("%s - Invalid baud rate %d requested, using 9600.", -						__func__, p_priv->baud); +		if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk, +						   &msg.baudHi, &msg.baudLo, &msg.prescaler, +						   device_port) == KEYSPAN_INVALID_BAUD_RATE) { +			dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n", +				__func__, p_priv->baud);  			msg.baudLo = 0;  			msg.baudHi = 125;	/* Values for 9600 baud */  			msg.prescaler = 10; @@ -1872,7 +1571,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  		msg.setPrescaler = 0xff;  	} -	msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1; +	msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;  	switch (p_priv->cflag & CSIZE) {  	case CS5:  		msg.lcr |= USA_DATABITS_5; @@ -1889,7 +1588,7 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	}  	if (p_priv->cflag & PARENB) {  		/* note USA_PARITY_NONE == 0 */ -		msg.lcr |= (p_priv->cflag & PARODD)? +		msg.lcr |= (p_priv->cflag & PARODD) ?  			USA_PARITY_ODD : USA_PARITY_EVEN;  	}  	msg.setLcr = 0xff; @@ -1956,18 +1655,9 @@ static int keyspan_usa26_send_setup(struct usb_serial *serial,  	/* send the data out the device on control endpoint */  	this_urb->transfer_buffer_length = sizeof(msg); -	this_urb->dev = serial->dev;  	err = usb_submit_urb(this_urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err); -#if 0 -	else { -		dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__ -		    outcont_urb, this_urb->transfer_buffer_length, -		    usb_pipeendpoint(this_urb->pipe)); -	} -#endif - +		dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);  	return 0;  } @@ -1982,17 +1672,15 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,  	struct urb				*this_urb;  	int 					device_port, err; -	dbg("%s", __func__); -  	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	d_details = s_priv->device_details; -	device_port = port->number - port->serial->minor; +	device_port = port->port_number;  	/* only do something if we have a bulk out endpoint */  	this_urb = p_priv->outcont_urb;  	if (this_urb == NULL) { -		dbg("%s - oops no urb.", __func__); +		dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);  		return -1;  	} @@ -2001,7 +1689,7 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,  	if ((reset_port + 1) > p_priv->resend_cont)  		p_priv->resend_cont = reset_port + 1;  	if (this_urb->status == -EINPROGRESS) { -		dbg("%s already writing", __func__); +		dev_dbg(&port->dev, "%s already writing\n", __func__);  		mdelay(5);  		return -1;  	} @@ -2009,9 +1697,10 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,  	memset(&msg, 0, sizeof(struct keyspan_usa28_portControlMessage));  	msg.setBaudRate = 1; -	if (d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk, -		&msg.baudHi, &msg.baudLo, NULL, device_port) == KEYSPAN_INVALID_BAUD_RATE) { -		dbg("%s - Invalid baud rate requested %d.", +	if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk, +					   &msg.baudHi, &msg.baudLo, NULL, +					   device_port) == KEYSPAN_INVALID_BAUD_RATE) { +		dev_dbg(&port->dev, "%s - Invalid baud rate requested %d.\n",  						__func__, p_priv->baud);  		msg.baudLo = 0xff;  		msg.baudHi = 0xb2;	/* Values for 9600 baud */ @@ -2084,16 +1773,9 @@ static int keyspan_usa28_send_setup(struct usb_serial *serial,  	/* send the data out the device on control endpoint */  	this_urb->transfer_buffer_length = sizeof(msg); -	this_urb->dev = serial->dev;  	err = usb_submit_urb(this_urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - usb_submit_urb(setup) failed", __func__); -#if 0 -	else { -		dbg("%s - usb_submit_urb(setup) OK %d bytes", __func__, -		    this_urb->transfer_buffer_length); -	} -#endif +		dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed\n", __func__);  	return 0;  } @@ -2110,8 +1792,6 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,  	struct urb				*this_urb;  	int 					err, device_port; -	dbg("%s", __func__); -  	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	d_details = s_priv->device_details; @@ -2119,43 +1799,41 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,  	this_urb = s_priv->glocont_urb;  	/* Work out which port within the device is being setup */ -	device_port = port->number - port->serial->minor; - -	dbg("%s - endpoint %d port %d (%d)", -			__func__, usb_pipeendpoint(this_urb->pipe), -			port->number, device_port); +	device_port = port->port_number; -		/* Make sure we have an urb then send the message */ +	/* Make sure we have an urb then send the message */  	if (this_urb == NULL) { -		dbg("%s - oops no urb for port %d.", __func__, port->number); +		dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__);  		return -1;  	} +	dev_dbg(&port->dev, "%s - endpoint %d (%d)\n", +		__func__, usb_pipeendpoint(this_urb->pipe), device_port); +  	/* Save reset port val for resend.  	   Don't overwrite resend for open/close condition. */  	if ((reset_port + 1) > p_priv->resend_cont)  		p_priv->resend_cont = reset_port + 1;  	if (this_urb->status == -EINPROGRESS) { -		/*  dbg("%s - already writing", __func__); */ +		/*  dev_dbg(&port->dev, "%s - already writing\n", __func__); */  		mdelay(5);  		return -1;  	}  	memset(&msg, 0, sizeof(struct keyspan_usa49_portControlMessage)); -	/*msg.portNumber = port->number;*/  	msg.portNumber = device_port;  	/* Only set baud rate if it's changed */  	if (p_priv->old_baud != p_priv->baud) {  		p_priv->old_baud = p_priv->baud;  		msg.setClocking = 0xff; -		if (d_details->calculate_baud_rate -		    (p_priv->baud, d_details->baudclk, &msg.baudHi, -		     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) { -			dbg("%s - Invalid baud rate %d requested, using 9600.", -						__func__, p_priv->baud); +		if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk, +						   &msg.baudHi, &msg.baudLo, &msg.prescaler, +						   device_port) == KEYSPAN_INVALID_BAUD_RATE) { +			dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n", +				__func__, p_priv->baud);  			msg.baudLo = 0;  			msg.baudHi = 125;	/* Values for 9600 baud */  			msg.prescaler = 10; @@ -2163,7 +1841,7 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,  		/* msg.setPrescaler = 0xff; */  	} -	msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1; +	msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;  	switch (p_priv->cflag & CSIZE) {  	case CS5:  		msg.lcr |= USA_DATABITS_5; @@ -2180,7 +1858,7 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,  	}  	if (p_priv->cflag & PARENB) {  		/* note USA_PARITY_NONE == 0 */ -		msg.lcr |= (p_priv->cflag & PARODD)? +		msg.lcr |= (p_priv->cflag & PARODD) ?  			USA_PARITY_ODD : USA_PARITY_EVEN;  	}  	msg.setLcr = 0xff; @@ -2271,19 +1949,10 @@ static int keyspan_usa49_send_setup(struct usb_serial *serial,  		/* send the data out the device on control endpoint */  		this_urb->transfer_buffer_length = sizeof(msg); - -		this_urb->dev = serial->dev;  	}  	err = usb_submit_urb(this_urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err); -#if 0 -	else { -		dbg("%s - usb_submit_urb(%d) OK %d bytes (end %d)", __func__, -			   outcont_urb, this_urb->transfer_buffer_length, -			   usb_pipeendpoint(this_urb->pipe)); -	} -#endif +		dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);  	return 0;  } @@ -2300,8 +1969,6 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  	int 					err;  	u8						prescaler; -	dbg("%s", __func__); -  	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	d_details = s_priv->device_details; @@ -2309,7 +1976,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  	/* only do something if we have a bulk out endpoint */  	this_urb = p_priv->outcont_urb;  	if (this_urb == NULL) { -		dbg("%s - oops no urb.", __func__); +		dev_dbg(&port->dev, "%s - oops no urb.\n", __func__);  		return -1;  	} @@ -2318,7 +1985,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  	if ((reset_port + 1) > p_priv->resend_cont)  		p_priv->resend_cont = reset_port + 1;  	if (this_urb->status == -EINPROGRESS) { -		dbg("%s already writing", __func__); +		dev_dbg(&port->dev, "%s already writing\n", __func__);  		mdelay(5);  		return -1;  	} @@ -2329,13 +1996,12 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  	if (p_priv->old_baud != p_priv->baud) {  		p_priv->old_baud = p_priv->baud;  		msg.setClocking = 0x01; -		if (d_details->calculate_baud_rate -		    (p_priv->baud, d_details->baudclk, &msg.baudHi, -		     &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) { -			dbg("%s - Invalid baud rate %d requested, using 9600.", -						__func__, p_priv->baud); +		if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk, +						   &msg.baudHi, &msg.baudLo, &prescaler, 0) == KEYSPAN_INVALID_BAUD_RATE) { +			dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n", +				__func__, p_priv->baud);  			p_priv->baud = 9600; -			d_details->calculate_baud_rate(p_priv->baud, d_details->baudclk, +			d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk,  				&msg.baudHi, &msg.baudLo, &prescaler, 0);  		}  		msg.setRxMode = 1; @@ -2351,7 +2017,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  		msg.txMode = TXMODE_BYHAND;  	} -	msg.lcr = (p_priv->cflag & CSTOPB)? STOPBITS_678_2: STOPBITS_5678_1; +	msg.lcr = (p_priv->cflag & CSTOPB) ? STOPBITS_678_2 : STOPBITS_5678_1;  	switch (p_priv->cflag & CSIZE) {  	case CS5:  		msg.lcr |= USA_DATABITS_5; @@ -2368,7 +2034,7 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  	}  	if (p_priv->cflag & PARENB) {  		/* note USA_PARITY_NONE == 0 */ -		msg.lcr |= (p_priv->cflag & PARODD)? +		msg.lcr |= (p_priv->cflag & PARODD) ?  			USA_PARITY_ODD : USA_PARITY_EVEN;  	}  	if (p_priv->old_cflag != p_priv->cflag) { @@ -2415,10 +2081,9 @@ static int keyspan_usa90_send_setup(struct usb_serial *serial,  	/* send the data out the device on control endpoint */  	this_urb->transfer_buffer_length = sizeof(msg); -	this_urb->dev = serial->dev;  	err = usb_submit_urb(this_urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, err); +		dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);  	return 0;  } @@ -2433,8 +2098,6 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,  	struct urb				*this_urb;  	int 					err, device_port; -	dbg("%s", __func__); -  	s_priv = usb_get_serial_data(serial);  	p_priv = usb_get_serial_port_data(port);  	d_details = s_priv->device_details; @@ -2442,12 +2105,11 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,  	this_urb = s_priv->glocont_urb;  	/* Work out which port within the device is being setup */ -	device_port = port->number - port->serial->minor; +	device_port = port->port_number;  	/* Make sure we have an urb then send the message */  	if (this_urb == NULL) { -		dbg("%s - oops no urb for port %d.", __func__, -			port->number); +		dev_dbg(&port->dev, "%s - oops no urb for port.\n", __func__);  		return -1;  	} @@ -2456,7 +2118,7 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,  	if ((reset_port + 1) > p_priv->resend_cont)  		p_priv->resend_cont = reset_port + 1;  	if (this_urb->status == -EINPROGRESS) { -		/*  dbg("%s - already writing", __func__); */ +		/*  dev_dbg(&port->dev, "%s - already writing\n", __func__); */  		mdelay(5);  		return -1;  	} @@ -2469,11 +2131,11 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,  	if (p_priv->old_baud != p_priv->baud) {  		p_priv->old_baud = p_priv->baud;  		msg.setClocking = 0xff; -		if (d_details->calculate_baud_rate -		    (p_priv->baud, d_details->baudclk, &msg.baudHi, -		     &msg.baudLo, &msg.prescaler, device_port) == KEYSPAN_INVALID_BAUD_RATE) { -			dbg("%s - Invalid baud rate %d requested, using 9600.", -						__func__, p_priv->baud); +		if (d_details->calculate_baud_rate(port, p_priv->baud, d_details->baudclk, +						   &msg.baudHi, &msg.baudLo, &msg.prescaler, +						   device_port) == KEYSPAN_INVALID_BAUD_RATE) { +			dev_dbg(&port->dev, "%s - Invalid baud rate %d requested, using 9600.\n", +				__func__, p_priv->baud);  			msg.baudLo = 0;  			msg.baudHi = 125;	/* Values for 9600 baud */  			msg.prescaler = 10; @@ -2498,7 +2160,7 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,  	}  	if (p_priv->cflag & PARENB) {  		/* note USA_PARITY_NONE == 0 */ -		msg.lcr |= (p_priv->cflag & PARODD)? +		msg.lcr |= (p_priv->cflag & PARODD) ?  					USA_PARITY_ODD : USA_PARITY_EVEN;  	}  	msg.setLcr = 0xff; @@ -2561,12 +2223,10 @@ static int keyspan_usa67_send_setup(struct usb_serial *serial,  	/* send the data out the device on control endpoint */  	this_urb->transfer_buffer_length = sizeof(msg); -	this_urb->dev = serial->dev;  	err = usb_submit_urb(this_urb, GFP_ATOMIC);  	if (err != 0) -		dbg("%s - usb_submit_urb(setup) failed (%d)", __func__, -				err); +		dev_dbg(&port->dev, "%s - usb_submit_urb(setup) failed (%d)\n", __func__, err);  	return 0;  } @@ -2576,8 +2236,6 @@ static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)  	struct keyspan_serial_private *s_priv;  	const struct keyspan_device_details *d_details; -	dbg("%s", __func__); -  	s_priv = usb_get_serial_data(serial);  	d_details = s_priv->device_details; @@ -2606,13 +2264,9 @@ static void keyspan_send_setup(struct usb_serial_port *port, int reset_port)  static int keyspan_startup(struct usb_serial *serial)  {  	int				i, err; -	struct usb_serial_port		*port;  	struct keyspan_serial_private 	*s_priv; -	struct keyspan_port_private	*p_priv;  	const struct keyspan_device_details	*d_details; -	dbg("%s", __func__); -  	for (i = 0; (d_details = keyspan_devices[i]) != NULL; ++i)  		if (d_details->product_id ==  				le16_to_cpu(serial->dev->descriptor.idProduct)) @@ -2620,114 +2274,216 @@ static int keyspan_startup(struct usb_serial *serial)  	if (d_details == NULL) {  		dev_err(&serial->dev->dev, "%s - unknown product id %x\n",  		    __func__, le16_to_cpu(serial->dev->descriptor.idProduct)); -		return 1; +		return -ENODEV;  	}  	/* Setup private data for serial driver */  	s_priv = kzalloc(sizeof(struct keyspan_serial_private), GFP_KERNEL); -	if (!s_priv) { -		dbg("%s - kmalloc for keyspan_serial_private failed.", -								__func__); +	if (!s_priv)  		return -ENOMEM; -	} + +	s_priv->instat_buf = kzalloc(INSTAT_BUFLEN, GFP_KERNEL); +	if (!s_priv->instat_buf) +		goto err_instat_buf; + +	s_priv->indat_buf = kzalloc(INDAT49W_BUFLEN, GFP_KERNEL); +	if (!s_priv->indat_buf) +		goto err_indat_buf; + +	s_priv->glocont_buf = kzalloc(GLOCONT_BUFLEN, GFP_KERNEL); +	if (!s_priv->glocont_buf) +		goto err_glocont_buf; + +	s_priv->ctrl_buf = kzalloc(sizeof(struct usb_ctrlrequest), GFP_KERNEL); +	if (!s_priv->ctrl_buf) +		goto err_ctrl_buf;  	s_priv->device_details = d_details;  	usb_set_serial_data(serial, s_priv); -	/* Now setup per port private data */ -	for (i = 0; i < serial->num_ports; i++) { -		port = serial->port[i]; -		p_priv = kzalloc(sizeof(struct keyspan_port_private), -								GFP_KERNEL); -		if (!p_priv) { -			dbg("%s - kmalloc for keyspan_port_private (%d) failed!.", __func__, i); -			return 1; -		} -		p_priv->device_details = d_details; -		usb_set_serial_port_data(port, p_priv); -	} -  	keyspan_setup_urbs(serial);  	if (s_priv->instat_urb != NULL) { -		s_priv->instat_urb->dev = serial->dev;  		err = usb_submit_urb(s_priv->instat_urb, GFP_KERNEL);  		if (err != 0) -			dbg("%s - submit instat urb failed %d", __func__, -				err); +			dev_dbg(&serial->dev->dev, "%s - submit instat urb failed %d\n", __func__, err);  	}  	if (s_priv->indat_urb != NULL) { -		s_priv->indat_urb->dev = serial->dev;  		err = usb_submit_urb(s_priv->indat_urb, GFP_KERNEL);  		if (err != 0) -			dbg("%s - submit indat urb failed %d", __func__, -				err); +			dev_dbg(&serial->dev->dev, "%s - submit indat urb failed %d\n", __func__, err);  	}  	return 0; + +err_ctrl_buf: +	kfree(s_priv->glocont_buf); +err_glocont_buf: +	kfree(s_priv->indat_buf); +err_indat_buf: +	kfree(s_priv->instat_buf); +err_instat_buf: +	kfree(s_priv); + +	return -ENOMEM;  }  static void keyspan_disconnect(struct usb_serial *serial)  { -	int				i, j; -	struct usb_serial_port		*port; -	struct keyspan_serial_private 	*s_priv; -	struct keyspan_port_private	*p_priv; - -	dbg("%s", __func__); +	struct keyspan_serial_private *s_priv;  	s_priv = usb_get_serial_data(serial); -	/* Stop reading/writing urbs */  	stop_urb(s_priv->instat_urb);  	stop_urb(s_priv->glocont_urb);  	stop_urb(s_priv->indat_urb); -	for (i = 0; i < serial->num_ports; ++i) { -		port = serial->port[i]; -		p_priv = usb_get_serial_port_data(port); -		stop_urb(p_priv->inack_urb); -		stop_urb(p_priv->outcont_urb); -		for (j = 0; j < 2; j++) { -			stop_urb(p_priv->in_urbs[j]); -			stop_urb(p_priv->out_urbs[j]); -		} -	} +} + +static void keyspan_release(struct usb_serial *serial) +{ +	struct keyspan_serial_private *s_priv; + +	s_priv = usb_get_serial_data(serial); -	/* Now free them */  	usb_free_urb(s_priv->instat_urb);  	usb_free_urb(s_priv->indat_urb);  	usb_free_urb(s_priv->glocont_urb); -	for (i = 0; i < serial->num_ports; ++i) { -		port = serial->port[i]; -		p_priv = usb_get_serial_port_data(port); -		usb_free_urb(p_priv->inack_urb); -		usb_free_urb(p_priv->outcont_urb); -		for (j = 0; j < 2; j++) { -			usb_free_urb(p_priv->in_urbs[j]); -			usb_free_urb(p_priv->out_urbs[j]); -		} -	} + +	kfree(s_priv->ctrl_buf); +	kfree(s_priv->glocont_buf); +	kfree(s_priv->indat_buf); +	kfree(s_priv->instat_buf); + +	kfree(s_priv);  } -static void keyspan_release(struct usb_serial *serial) +static int keyspan_port_probe(struct usb_serial_port *port)  { -	int				i; -	struct usb_serial_port		*port; -	struct keyspan_serial_private 	*s_priv; - -	dbg("%s", __func__); +	struct usb_serial *serial = port->serial; +	struct keyspan_serial_private *s_priv; +	struct keyspan_port_private *p_priv; +	const struct keyspan_device_details *d_details; +	struct callbacks *cback; +	int endp; +	int port_num; +	int i;  	s_priv = usb_get_serial_data(serial); +	d_details = s_priv->device_details; -	/*  dbg("Freeing serial->private."); */ -	kfree(s_priv); +	p_priv = kzalloc(sizeof(*p_priv), GFP_KERNEL); +	if (!p_priv) +		return -ENOMEM; -	/*  dbg("Freeing port->private."); */ -	/* 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)); +	for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) { +		p_priv->in_buffer[i] = kzalloc(IN_BUFLEN, GFP_KERNEL); +		if (!p_priv->in_buffer[i]) +			goto err_in_buffer; +	} + +	for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) { +		p_priv->out_buffer[i] = kzalloc(OUT_BUFLEN, GFP_KERNEL); +		if (!p_priv->out_buffer[i]) +			goto err_out_buffer; +	} + +	p_priv->inack_buffer = kzalloc(INACK_BUFLEN, GFP_KERNEL); +	if (!p_priv->inack_buffer) +		goto err_inack_buffer; + +	p_priv->outcont_buffer = kzalloc(OUTCONT_BUFLEN, GFP_KERNEL); +	if (!p_priv->outcont_buffer) +		goto err_outcont_buffer; + +	p_priv->device_details = d_details; + +	/* Setup values for the various callback routines */ +	cback = &keyspan_callbacks[d_details->msg_format]; + +	port_num = port->port_number; + +	/* Do indat endpoints first, once for each flip */ +	endp = d_details->indat_endpoints[port_num]; +	for (i = 0; i <= d_details->indat_endp_flip; ++i, ++endp) { +		p_priv->in_urbs[i] = keyspan_setup_urb(serial, endp, +						USB_DIR_IN, port, +						p_priv->in_buffer[i], +						IN_BUFLEN, +						cback->indat_callback); +	} +	/* outdat endpoints also have flip */ +	endp = d_details->outdat_endpoints[port_num]; +	for (i = 0; i <= d_details->outdat_endp_flip; ++i, ++endp) { +		p_priv->out_urbs[i] = keyspan_setup_urb(serial, endp, +						USB_DIR_OUT, port, +						p_priv->out_buffer[i], +						OUT_BUFLEN, +						cback->outdat_callback); +	} +	/* inack endpoint */ +	p_priv->inack_urb = keyspan_setup_urb(serial, +					d_details->inack_endpoints[port_num], +					USB_DIR_IN, port, +					p_priv->inack_buffer, +					INACK_BUFLEN, +					cback->inack_callback); +	/* outcont endpoint */ +	p_priv->outcont_urb = keyspan_setup_urb(serial, +					d_details->outcont_endpoints[port_num], +					USB_DIR_OUT, port, +					p_priv->outcont_buffer, +					OUTCONT_BUFLEN, +					 cback->outcont_callback); + +	usb_set_serial_port_data(port, p_priv); + +	return 0; + +err_outcont_buffer: +	kfree(p_priv->inack_buffer); +err_inack_buffer: +	for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) +		kfree(p_priv->out_buffer[i]); +err_out_buffer: +	for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) +		kfree(p_priv->in_buffer[i]); +err_in_buffer: +	kfree(p_priv); + +	return -ENOMEM; +} + +static int keyspan_port_remove(struct usb_serial_port *port) +{ +	struct keyspan_port_private *p_priv; +	int i; + +	p_priv = usb_get_serial_port_data(port); + +	stop_urb(p_priv->inack_urb); +	stop_urb(p_priv->outcont_urb); +	for (i = 0; i < 2; i++) { +		stop_urb(p_priv->in_urbs[i]); +		stop_urb(p_priv->out_urbs[i]); +	} + +	usb_free_urb(p_priv->inack_urb); +	usb_free_urb(p_priv->outcont_urb); +	for (i = 0; i < 2; i++) { +		usb_free_urb(p_priv->in_urbs[i]); +		usb_free_urb(p_priv->out_urbs[i]);  	} + +	kfree(p_priv->outcont_buffer); +	kfree(p_priv->inack_buffer); +	for (i = 0; i < ARRAY_SIZE(p_priv->out_buffer); ++i) +		kfree(p_priv->out_buffer[i]); +	for (i = 0; i < ARRAY_SIZE(p_priv->in_buffer); ++i) +		kfree(p_priv->in_buffer[i]); + +	kfree(p_priv); + +	return 0;  }  MODULE_AUTHOR(DRIVER_AUTHOR); @@ -2746,7 +2502,3 @@ MODULE_FIRMWARE("keyspan/usa18x.fw");  MODULE_FIRMWARE("keyspan/usa19w.fw");  MODULE_FIRMWARE("keyspan/usa49w.fw");  MODULE_FIRMWARE("keyspan/usa49wlc.fw"); - -module_param(debug, bool, S_IRUGO | S_IWUSR); -MODULE_PARM_DESC(debug, "Debug enabled or not"); -  | 
