⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keyspan.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
} 	/* Outdat handling is common for all devices */static void	usa2x_outdat_callback(struct urb *urb, struct pt_regs *regs){	struct usb_serial_port *port;	struct keyspan_port_private *p_priv;	port = (struct usb_serial_port *) urb->context;	p_priv = usb_get_serial_port_data(port);	dbg ("%s - urb %d", __FUNCTION__, urb == p_priv->out_urbs[1]); 	if (port->open_count)		schedule_work(&port->work);}static void	usa26_inack_callback(struct urb *urb, struct pt_regs *regs){	dbg ("%s", __FUNCTION__); 	}static void	usa26_outcont_callback(struct urb *urb, struct pt_regs *regs){	struct usb_serial_port *port;	struct keyspan_port_private *p_priv;	port = (struct usb_serial_port *) urb->context;	p_priv = usb_get_serial_port_data(port);	if (p_priv->resend_cont) {		dbg ("%s - sending setup", __FUNCTION__); 		keyspan_usa26_send_setup(port->serial, port, p_priv->resend_cont - 1);	}}static void	usa26_instat_callback(struct urb *urb, struct pt_regs *regs){	unsigned char 				*data = urb->transfer_buffer;	struct keyspan_usa26_portStatusMessage	*msg;	struct usb_serial			*serial;	struct usb_serial_port			*port;	struct keyspan_port_private	 	*p_priv;	int old_dcd_state, err;	serial = (struct usb_serial *) urb->context;	if (urb->status) {		dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);		return;	}	if (urb->actual_length != 9) {		dbg("%s - %d byte report??", __FUNCTION__, 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",	    __FUNCTION__, 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", __FUNCTION__, msg->port);		goto exit;	}	port = serial->port[msg->port];	p_priv = usb_get_serial_port_data(port);		/* Update handshaking pin state information */	old_dcd_state = p_priv->dcd_state;	p_priv->cts_state = ((msg->hskia_cts) ? 1 : 0);	p_priv->dsr_state = ((msg->dsr) ? 1 : 0);	p_priv->dcd_state = ((msg->gpia_dcd) ? 1 : 0);	p_priv->ri_state = ((msg->ri) ? 1 : 0);	if (port->tty && !C_CLOCAL(port->tty)	    && old_dcd_state != p_priv->dcd_state) {		if (old_dcd_state)			tty_hangup(port->tty);		/*  else */		/*	wake_up_interruptible(&p_priv->open_wait); */	}		/* Resubmit urb so we continue receiving */	urb->dev = serial->dev;	if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {		dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);	}exit: ;}static void	usa26_glocont_callback(struct urb *urb, struct pt_regs *regs){	dbg ("%s", __FUNCTION__);	}static void usa28_indat_callback(struct urb *urb, struct pt_regs *regs){	int                     i, err;	struct usb_serial_port  *port;	struct tty_struct       *tty;	unsigned char           *data;	struct keyspan_port_private             *p_priv;	dbg ("%s", __FUNCTION__);	port = (struct usb_serial_port *) urb->context;	p_priv = usb_get_serial_port_data(port);	data = urb->transfer_buffer;	if (urb != p_priv->in_urbs[p_priv->in_flip])		return;	do {		if (urb->status) {			dbg("%s - nonzero status: %x on endpoint %d.",			    __FUNCTION__, urb->status, usb_pipeendpoint(urb->pipe));			return;		}		port = (struct usb_serial_port *) urb->context;		p_priv = usb_get_serial_port_data(port);		data = urb->transfer_buffer;		tty = port->tty;		if (urb->actual_length) {			for (i = 0; i < urb->actual_length ; ++i) {				tty_insert_flip_char(tty, data[i], 0);			}			tty_flip_buffer_push(tty);		}		/* Resubmit urb so we continue receiving */		urb->dev = port->serial->dev;		if (port->open_count)			if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {				dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);			}		p_priv->in_flip ^= 1;		urb = p_priv->in_urbs[p_priv->in_flip];	} while (urb->status != -EINPROGRESS);}static void	usa28_inack_callback(struct urb *urb, struct pt_regs *regs){	dbg ("%s", __FUNCTION__);}static void	usa28_outcont_callback(struct urb *urb, struct pt_regs *regs){	struct usb_serial_port *port;	struct keyspan_port_private *p_priv;	port = (struct usb_serial_port *) urb->context;	p_priv = usb_get_serial_port_data(port);	if (p_priv->resend_cont) {		dbg ("%s - sending setup", __FUNCTION__);		keyspan_usa28_send_setup(port->serial, port, p_priv->resend_cont - 1);	}}static void	usa28_instat_callback(struct urb *urb, struct pt_regs *regs){	int					err;	unsigned char 				*data = urb->transfer_buffer;	struct keyspan_usa28_portStatusMessage	*msg;	struct usb_serial			*serial;	struct usb_serial_port			*port;	struct keyspan_port_private	 	*p_priv;	int old_dcd_state;	serial = (struct usb_serial *) urb->context;	if (urb->status) {		dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);		return;	}	if (urb->actual_length != sizeof(struct keyspan_usa28_portStatusMessage)) {		dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);		goto exit;	}	/*dbg("%s %x %x %x %x %x %x %x %x %x %x %x %x", __FUNCTION__	    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", __FUNCTION__, msg->port);		goto exit;	}	port = serial->port[msg->port];	p_priv = usb_get_serial_port_data(port);		/* Update handshaking pin state information */	old_dcd_state = p_priv->dcd_state;	p_priv->cts_state = ((msg->cts) ? 1 : 0);	p_priv->dsr_state = ((msg->dsr) ? 1 : 0);	p_priv->dcd_state = ((msg->dcd) ? 1 : 0);	p_priv->ri_state = ((msg->ri) ? 1 : 0);	if (port->tty && !C_CLOCAL(port->tty)	    && old_dcd_state != p_priv->dcd_state) {		if (old_dcd_state)			tty_hangup(port->tty);		/*  else */		/*	wake_up_interruptible(&p_priv->open_wait); */	}		/* Resubmit urb so we continue receiving */	urb->dev = serial->dev;	if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {		dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);	}exit: ;}static void	usa28_glocont_callback(struct urb *urb, struct pt_regs *regs){	dbg ("%s", __FUNCTION__);}static void	usa49_glocont_callback(struct urb *urb, struct pt_regs *regs){	struct usb_serial *serial;	struct usb_serial_port *port;	struct keyspan_port_private *p_priv;	int i;	dbg ("%s", __FUNCTION__);	serial = (struct usb_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", __FUNCTION__); 			keyspan_usa49_send_setup(serial, port, p_priv->resend_cont - 1);			break;		}	}}	/* This is actually called glostat in the Keyspan	   doco */static void	usa49_instat_callback(struct urb *urb, struct pt_regs *regs){	int					err;	unsigned char 				*data = urb->transfer_buffer;	struct keyspan_usa49_portStatusMessage	*msg;	struct usb_serial			*serial;	struct usb_serial_port			*port;	struct keyspan_port_private	 	*p_priv;	int old_dcd_state;	dbg ("%s", __FUNCTION__);	serial = (struct usb_serial *) urb->context;	if (urb->status) {		dbg("%s - nonzero status: %x", __FUNCTION__, urb->status);		return;	}	if (urb->actual_length != sizeof(struct keyspan_usa49_portStatusMessage)) {		dbg("%s - bad length %d", __FUNCTION__, urb->actual_length);		goto exit;	}	/*dbg(" %x %x %x %x %x %x %x %x %x %x %x", __FUNCTION__, 	    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", __FUNCTION__, msg->portNumber);		goto exit;	}	port = serial->port[msg->portNumber];	p_priv = usb_get_serial_port_data(port);		/* Update handshaking pin state information */	old_dcd_state = p_priv->dcd_state;	p_priv->cts_state = ((msg->cts) ? 1 : 0);	p_priv->dsr_state = ((msg->dsr) ? 1 : 0);	p_priv->dcd_state = ((msg->dcd) ? 1 : 0);	p_priv->ri_state = ((msg->ri) ? 1 : 0);	if (port->tty && !C_CLOCAL(port->tty)	    && old_dcd_state != p_priv->dcd_state) {		if (old_dcd_state)			tty_hangup(port->tty);		/*  else */		/*	wake_up_interruptible(&p_priv->open_wait); */	}		/* Resubmit urb so we continue receiving */	urb->dev = serial->dev;	if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {		dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);	}exit:	;}static void	usa49_inack_callback(struct urb *urb, struct pt_regs *regs){	dbg ("%s", __FUNCTION__);}static void	usa49_indat_callback(struct urb *urb, struct pt_regs *regs){	int			i, err;	int			endpoint;	struct usb_serial_port	*port;	struct tty_struct	*tty;	unsigned char 		*data = urb->transfer_buffer;	dbg ("%s", __FUNCTION__);	endpoint = usb_pipeendpoint(urb->pipe);	if (urb->status) {		dbg("%s - nonzero status: %x on endpoint %d.", __FUNCTION__,		    urb->status, endpoint);		return;	}	port = (struct usb_serial_port *) urb->context;	tty = port->tty;	if (urb->actual_length) {		/* 0x80 bit is error flag */		if ((data[0] & 0x80) == 0) {			/* no error on any byte */			for (i = 1; i < urb->actual_length ; ++i) {				tty_insert_flip_char(tty, data[i], 0);			}		} else {			/* some bytes had errors, every byte has status */			for (i = 0; i + 1 < urb->actual_length; i += 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);			}		}		tty_flip_buffer_push(tty);	}						/* Resubmit urb so we continue receiving */	urb->dev = port->serial->dev;	if (port->open_count)		if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {			dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);		}}/* not used, usa-49 doesn't have per-port control endpoints */static void	usa49_outcont_callback(struct urb *urb, struct pt_regs *regs){	dbg ("%s", __FUNCTION__);}static void	usa90_indat_callback(struct urb *urb, struct pt_regs *regs){	int			i, err;	int			endpoint;	struct usb_serial_port	*port;	struct keyspan_port_private	 	*p_priv;	struct tty_struct	*tty;	unsigned char 		*data = urb->transfer_buffer;	dbg ("%s", __FUNCTION__); 	endpoint = usb_pipeendpoint(urb->pipe);	if (urb->status) {		dbg("%s - nonzero status: %x on endpoint %d.",		    __FUNCTION__, urb->status, endpoint);		return;	}	port = (struct usb_serial_port *) urb->context;	p_priv = usb_get_serial_port_data(port);	tty = port->tty;	if (urb->actual_length) {			/* if current mode is DMA, looks like usa28 format	   		otherwise looks like usa26 data format */		if (p_priv->baud > 57600) {			for (i = 0; i < urb->actual_length ; ++i) 				tty_insert_flip_char(tty, data[i], 0);		}		else {						/* 0x80 bit is error flag */			if ((data[0] & 0x80) == 0) {				/* no errors on individual bytes, only possible overrun err*/				if (data[0] & RXERROR_OVERRUN)						err = TTY_OVERRUN;				else err = 0;				for (i = 1; i < urb->actual_length ; ++i) 					tty_insert_flip_char(tty, data[i], err);						} 			else {			/* some bytes had errors, every byte has status */				dbg("%s - RX error!!!!", __FUNCTION__);				for (i = 0; i + 1 < urb->actual_length; i += 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);				}			}		}		tty_flip_buffer_push(tty);	}					/* Resubmit urb so we continue receiving */	urb->dev = port->serial->dev;	if (port->open_count)		if ((err = usb_submit_urb(urb, GFP_ATOMIC)) != 0) {			dbg("%s - resubmit read urb failed. (%d)", __FUNCTION__, err);		}	return;}static void	usa90_instat_callback(struct urb *urb, struct pt_regs *regs){	unsigned char 				*data = urb->transfer_buffer;	struct keyspan_usa90_portStatusMessage	*msg;	struct usb_serial			*serial;	struct usb_serial_port			*port;	struct keyspan_port_private	 	*p_priv;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -