Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 29 Jun 1996 11:24:08 -0400 (EDT)
From:      Andrew Webster <andrew@fortress.org>
To:        hackers@freebsd.org
Subject:   SWAP DCD & DSR in sio.c + Question
Message-ID:  <Pine.BSF.3.91.960629111442.883B-100000@guardian.fortress.org>

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


I recently got a BocaBoard 16 port box for my FreeBSD system.  Much to my
shock & horror, it uses 10 pin RJ45s (RJ69 expensive and hard to get),
with DCD on pin 1.  So I figured, there isn't much that can't be fixed
with a little software, and I patched sio.c to SWAP DCD and DSR signals. 
The patch works by assigning the flag 0x0010 to indicate that DCD and DSR
should be swapped (this is a standard option on Digiboard products, with 
RJ45s, it seems). 

So a line like
	sio8	at isa? port 0x100 tty flags 0x1715
would do the trick.

If anyone is interested in this, the diffs from 2.1.0-STABLE are at the 
end of this message.

What if one wanted have more than 32 sio ports on a system?
Can sio.c be patched to support upto 64 ports?
I created siox.c which is a clone of sio.c except that it shows up as 
siox in the drivers.  How do I assign a different major number to it?


--- cut here ---
*** sio.c.orig	Thu Sep 14 03:09:28 1995
--- sio.c	Sat Jun 29 11:20:24 1996
***************
*** 32,37 ****
--- 32,38 ----
   *
   *	from: @(#)com.c	7.5 (Berkeley) 5/16/91
   *	$Id: sio.c,v 1.99.4.1 1995/09/14 07:09:28 davidg Exp $
+  * Added DCD/DSR swap - aw
   */
  
  #include "sio.h"
***************
*** 90,95 ****
--- 91,101 ----
  #define	COM_LOSESOUTINTS(dev)	((dev)->id_flags & 0x08)
  #define	COM_NOFIFO(dev)		((dev)->id_flags & 0x02)
  #define	COM_VERBOSE(dev)	((dev)->id_flags & 0x80)
+ #define COM_SWAPDCDDSR(dev)	((dev)->id_flags & 0x10)
+ 
+ #define SWAPMASKDCD		(MSR_DCD | MSR_DDCD)
+ #define SWAPMASKDSR		(MSR_DSR | MSR_DDSR)
+ #define SWAPMASKDCDDSR		(SWAPMASKDCD | SWAPMASKDSR)
  
  #define	com_scr		7	/* scratch register for 16450-16550 (R/W) */
  
***************
*** 168,173 ****
--- 174,180 ----
  #ifdef COM_MULTIPORT
  	bool_t	multiport;	/* is this unit part of a multiport device? */
  #endif /* COM_MULTIPORT */
+ 	bool_t	swapdcddsr;
  	bool_t	no_irq;		/* nonzero if irq is not attached */
  	bool_t	poll;		/* nonzero if polling is required */
  	bool_t	poll_output;	/* nonzero if polling for output is required */
***************
*** 422,427 ****
--- 429,435 ----
  		}
  	}
  #endif /* COM_MULTIPORT */
+ 		
  	if (idev->id_irq == 0)
  		mcr_image = 0;
  
***************
*** 695,700 ****
--- 703,712 ----
  	outb(iobase + com_fifo, 0);
  determined_type: ;
  
+ 	if (COM_SWAPDCDDSR(isdp)) {
+ 		com->swapdcddsr = TRUE;
+ 		printf (" dsr<>dcd ");
+ 	}
  #ifdef COM_MULTIPORT
  	if (COM_ISMULTIPORT(isdp)) {
  		com->multiport = TRUE;
***************
*** 766,771 ****
--- 778,784 ----
  	int		s;
  	struct tty	*tp;
  	int		unit;
+ 	u_char		tmp1;
  
  	mynor = minor(dev);
  	unit = MINOR_TO_UNIT(mynor);
***************
*** 871,878 ****
  		disable_intr();
  		(void) inb(com->line_status_port);
  		(void) inb(com->data_port);
! 		com->prev_modem_status = com->last_modem_status
! 		    = inb(com->modem_status_port);
  		outb(iobase + com_ier, IER_ERXRDY | IER_ETXRDY | IER_ERLS
  				       | IER_EMSC);
  		enable_intr();
--- 884,900 ----
  		disable_intr();
  		(void) inb(com->line_status_port);
  		(void) inb(com->data_port);
! 		tmp1 = inb(com->modem_status_port);
! 		if (com->swapdcddsr) 
! 			com->prev_modem_status = com->last_modem_status = 
!   		             ((tmp1 & ~SWAPMASKDCDDSR)
! 				    | ((tmp1 & SWAPMASKDCD) >> 2)
! 				    | ((tmp1 & SWAPMASKDSR) << 2));
! 		else  
! 			com->prev_modem_status = com->last_modem_status = tmp1;	
! 		
! 		
! 			
  		outb(iobase + com_ier, IER_ERXRDY | IER_ETXRDY | IER_ERLS
  				       | IER_EMSC);
  		enable_intr();
***************
*** 1118,1123 ****
--- 1140,1146 ----
  	u_char	modem_status;
  	u_char	*ioptr;
  	u_char	recv_data;
+ 	u_char	tmp1;
  
  	if (com->do_timestamp)
  		/* XXX a little bloat here... */
***************
*** 1204,1210 ****
  		}
  
  		/* modem status change? (always check before doing output) */
! 		modem_status = inb(com->modem_status_port);
  		if (modem_status != com->last_modem_status) {
  			/*
  			 * Schedule high level to handle DCD changes.  Note
--- 1227,1239 ----
  		}
  
  		/* modem status change? (always check before doing output) */
! 		tmp1 = inb(com->modem_status_port);
! 		if (com->swapdcddsr) 
! 		modem_status = ((tmp1 & ~SWAPMASKDCDDSR)
! 				    | ((tmp1 & SWAPMASKDCD) >> 2)
! 				    | ((tmp1 & SWAPMASKDSR) << 2));
! 		else 
! 		modem_status = tmp1;
  		if (modem_status != com->last_modem_status) {
  			/*
  			 * Schedule high level to handle DCD changes.  Note
--- cut here ---

Andrew Webster  - andrew@pubnix.net - http://www.pubnix.net
PubNIX Montreal - Connected to the world - Branche au monde
 514-990-5911   - P.O. Box 147, Cote St-Luc, Quebec, H4V 2Y3




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.91.960629111442.883B-100000>