Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 14 Oct 1998 15:26:06 -0700 (PDT)
From:      "Andrew J. Korty" <ajk@physics.purdue.edu>
To:        FreeBSD-gnats-submit@FreeBSD.ORG
Subject:   kern/8318: Update to cy driver.
Message-ID:  <199810142226.PAA29825@time.cdrom.com>

next in thread | raw e-mail | index | archive | help

>Number:         8318
>Category:       kern
>Synopsis:       Add break support to cy driver.
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:
>Keywords:
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Oct 14 15:30:00 PDT 1998
>Last-Modified:
>Originator:     "Andrew J. Korty" <ajk@physics.purdue.edu>
>Organization:
Purdue University
>Release:        FreeBSD 3.0-current i386
>Environment:

>Description:

Patch to add support for the TIOCSBRK and TIOCCBRK ioctls to
the FreeBSD driver for the Cyclades Cyclom-Y (cy).  We use our
Cyclades on our console server, so it's more than just a convenience
to be able to ioctl() a break and drop into the PROM or DDB.  We'd
been living with it for a while until last week when I got fed up
and fixed the driver.

>How-To-Repeat:

>Fix:

*** sys/i386/isa/cy.c.orig	Sun Aug 23 03:26:40 1998
--- sys/i386/isa/cy.c	Wed Oct 14 16:42:02 1998
***************
*** 37,43 ****
  
  /*
   * TODO:
-  * Implement BREAK.
   * Fix overflows when closing line.
   * Atomic COR change.
   * Consoles.
--- 37,42 ----
***************
*** 308,313 ****
--- 307,315 ----
  	u_char	channel_control;/* CD1400 CCR control command shadow */
  	u_char	cor[3];		/* CD1400 COR1-3 shadows */
  	u_char	intr_enable;	/* CD1400 SRER shadow */
+ 	u_char	brk;
+ #define COM_SBRK 0x01		/* start break */
+ #define COM_CBRK 0x02		/* end break */
  
  	/*
  	 * Ping-pong input buffers.  The extra factor of 2 in the sizes is
***************
*** 1333,1350 ****
  					  & CD1400_xIVR_CHAN));
  #endif
  
  		if (com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY)) {
  			u_char	*ioptr;
  			u_int	ocount;
  
  			ioptr = com->obufq.l_head;
  				ocount = com->obufq.l_tail - ioptr;
  				if (ocount > CD1400_TX_FIFO_SIZE)
  					ocount = CD1400_TX_FIFO_SIZE;
  				com->bytes_out += ocount;
  				do
! 					cd_outb(iobase, CD1400_TDR, cy_align,
! 						*ioptr++);
  				while (--ocount != 0);
  			com->obufq.l_head = ioptr;
  			if (ioptr >= com->obufq.l_tail) {
--- 1335,1379 ----
  					  & CD1400_xIVR_CHAN));
  #endif
  
+ 		if (com->brk & COM_SBRK) {
+ 			cd_outb(iobase, CD1400_TDR, cy_align, 0);
+ 			cd_outb(iobase, CD1400_TDR, cy_align, 0x81);
+ 		}
+ 		if (com->brk & COM_CBRK) {
+ 			cd_outb(iobase, CD1400_TDR, cy_align, 0);
+ 			cd_outb(iobase, CD1400_TDR, cy_align, 0x83);
+ 		}
+ 
  		if (com->state >= (CS_BUSY | CS_TTGO | CS_ODEVREADY)) {
  			u_char	*ioptr;
  			u_int	ocount;
  
  			ioptr = com->obufq.l_head;
  				ocount = com->obufq.l_tail - ioptr;
+ 			if (com->brk)
+ 				ocount -= 2;
  				if (ocount > CD1400_TX_FIFO_SIZE)
  					ocount = CD1400_TX_FIFO_SIZE;
  				com->bytes_out += ocount;
  				do
! 				/*
! 				 * Check for NULs and double them up.
! 				 * We've turned on Embedded Trasmit
! 				 * Commands, for which NUL is the escape
! 				 * character.  Therefore, bona-fide NULs
! 				 * must be escaped.
! 				 */
! 				if (*ioptr)
! 					cd_outb(iobase, CD1400_TDR,
! 						cy_align, *ioptr++);
! 				else
! 					if (1 < ocount) {
! 						cd_outb(iobase, CD1400_TDR,
! 							cy_align, *ioptr++);
! 						cd_outb(iobase, CD1400_TDR,
! 							cy_align, 0);
! 						--ocount;
! 					}
  				while (--ocount != 0);
  			com->obufq.l_head = ioptr;
  			if (ioptr >= com->obufq.l_tail) {
***************
*** 1373,1378 ****
--- 1402,1408 ----
  				}
  			}
  		}
+ 		com->brk = 0;
  
  			/* terminate service context */
  #ifdef PollMode
***************
*** 1502,1515 ****
  	cd_outb(iobase, CD1400_CAR, com->cy_align,
  		MINOR_TO_UNIT(mynor) & CD1400_CAR_CHAN);
  	switch (cmd) {
- #if 0
  	case TIOCSBRK:
! 		outb(iobase + com_cfcr, com->cfcr_image |= CFCR_SBREAK);
  		break;
  	case TIOCCBRK:
! 		outb(iobase + com_cfcr, com->cfcr_image &= ~CFCR_SBREAK);
  		break;
- #endif /* 0 */
  	case TIOCSDTR:
  		(void)commctl(com, TIOCM_DTR, DMBIS);
  		break;
--- 1532,1547 ----
  	cd_outb(iobase, CD1400_CAR, com->cy_align,
  		MINOR_TO_UNIT(mynor) & CD1400_CAR_CHAN);
  	switch (cmd) {
  	case TIOCSBRK:
! 		com->brk |= COM_SBRK;
! 		if (!(tp->t_state & TS_BUSY))
! 			comstart(tp);
  		break;
  	case TIOCCBRK:
! 		com->brk |= COM_CBRK;
! 		if (!(tp->t_state & TS_BUSY))
! 			comstart(tp);
  		break;
  	case TIOCSDTR:
  		(void)commctl(com, TIOCM_DTR, DMBIS);
  		break;
***************
*** 1888,1893 ****
--- 1920,1927 ----
  	if (cflag & CCTS_OFLOW)
  		opt |= CD1400_COR2_CCTS_OFLOW;
  #endif
+ 	/* enable Embedded Transmit Commands */
+ 	opt |= CD1400_COR2_ETC;
  	if (opt != com->cor[1]) {
  		cor_change |= CD1400_CCR_COR2;
  		cd_outb(iobase, CD1400_COR2, com->cy_align, com->cor[1] = opt);
***************
*** 2113,2118 ****
--- 2147,2155 ----
  			cd_outb(iobase, CD1400_SRER, com->cy_align,
  				com->intr_enable |= CD1400_SRER_TXRDY);
  	}
+ 	if (com->brk)
+ 		cd_outb(iobase, CD1400_SRER, com->cy_align,
+ 			com->intr_enable |= CD1400_SRER_TXRDY);
  	if (tp->t_state & TS_TBLOCK) {
  		if (com->mcr_image & com->mcr_rts && com->state & CS_RTS_IFLOW)
  #if 0
>Audit-Trail:
>Unformatted:

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199810142226.PAA29825>