[RFC: linux-2.6.16-rc1 patch] jsm: fix for high baud rates problem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Digi serial port console doesn't work when baud rates are set higher than 38400. So the lookup table and code in jsm_neo.c has been modified and tested. Please let me have the feed-back.

Thanks,
V. Ananda Krishnan



Authors: Scott Kilau and V. Ananda Krishnan
Signed-off-by: V.Ananda Krishnan

...


diff -Naur linux-2.6.16-rc1/drivers/serial/jsm/jsm_neo.c linux-2.6.16-rc1-mod/drivers/serial/jsm/jsm_neo.c
--- linux-2.6.16-rc1/drivers/serial/jsm/jsm_neo.c	2006-01-27 21:19:45.000000000 -0600
+++ linux-2.6.16-rc1-mod/drivers/serial/jsm/jsm_neo.c	2006-01-27 21:43:28.000000000 -0600
@@ -966,47 +966,41 @@
			if (ch->ch_flags & CH_BAUD0)
				ch->ch_flags &= ~(CH_BAUD0);
		} else {
-			int iindex = 0;
-			int jindex = 0;
-
-			const u64 bauds[4][16] = {
-				{
-					0,	50,	75,	110,
-					134,	150,	200,	300,
-					600,	1200,	1800,	2400,
-					4800,	9600,	19200,	38400 },
-				{
-					0,	57600,	115200, 230400,
-					460800, 150,	200,	921600,
-					600,	1200,	1800,	2400,
-					4800,	9600,	19200,	38400 },
-				{
-					0,	57600,	76800, 115200,
-					131657, 153600, 230400, 460800,
-					921600, 1200,	1800,	2400,
-					4800,	9600,	19200,	38400 },
-				{
-					0,	57600,	115200, 230400,
-					460800, 150,	200,	921600,
-					600,	1200,	1800,	2400,
-					4800,	9600,	19200,	38400 }
+			int i= 0;
+			struct baud_rates {
+				unsigned int rate;
+				unsigned int cflag;
+			};
+			static struct baud_rates baud_rates[] = {
+				{ 921600, B921600 },
+				{ 460800, B460800 },
+				{ 230400, B230400 },
+				{ 115200, B115200 },
+				{  57600, B57600  },
+				{  38400, B38400  },
+				{  19200, B19200  },
+				{   9600, B9600   },
+				{   4800, B4800   },
+				{   2400, B2400   },
+				{   1200, B1200   },
+				{    600, B600    },
+				{    300, B300    },
+				{    200, B200    },
+				{    150, B150    },
+				{    134, B134    },
+				{    110, B110    },
+				{     75, B75     },
+				{     50, B50     },
+				{      0, B600	  }
			};

-			baud = C_BAUD(ch->uart_port.info->tty) & 0xff;
-
-			if (ch->ch_c_cflag & CBAUDEX)
-				iindex = 1;
-
-			jindex = baud;
+			baud = C_BAUD(ch->uart_port.info->tty);

-			if ((iindex >= 0) && (iindex < 4) && (jindex >= 0) && (jindex < 16))
-				baud = bauds[iindex][jindex];
-			else {
-				jsm_printk(IOCTL, DEBUG, &ch->ch_bd->pci_dev,
-					"baud indices were out of range (%d)(%d)",
-				iindex, jindex);
-				baud = 0;
+			for (i = 0; baud_rates[i].rate; i++) {
+				if (baud_rates[i].cflag == baud)
+					break;
			}
+			baud = baud_rates[i].rate;

			if (baud == 0)
				baud = 9600;

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux