All of lore.kernel.org
 help / color / mirror / Atom feed
From: Russell Coker <russell@coker.com.au>
To: tytso@mit.edu
Cc: linux-kernel@vger.kernel.org
Subject: Rocketport device driver for 2.4.3
Date: Fri, 20 Apr 2001 15:03:54 +0200	[thread overview]
Message-ID: <01042015035403.16958@lyta> (raw)

[-- Attachment #1: Type: text/plain, Size: 4802 bytes --]

I am working on a VA Linux server machine model 2240 which came with a 
RocketPort serial device.

The first issue is that it doesn't have support for devfs.  I have attached a 
patch to fix this that I believe to be good (I've done the same thing for 
Stallion and Lucent WinModem drivers - it's not overly challenging).

The next problem is that accessing a port number that is greater than the 
maximum that the RockerPort PCI card supports (apparently 32 ports for my 
card) gives a kernel oops.  I have attached the output of ksymoops to this 
message.
The command that triggered this Oops was:
setserial /dev/ttr/99


diff -ru old-linux/drivers/char/rocket.c patched-linux/drivers/char/rocket.c
--- old-linux/drivers/char/rocket.c	Sat Mar 31 09:50:44 2001
+++ patched-linux/drivers/char/rocket.c	Fri Apr 20 12:38:51 2001
@@ -94,7 +94,15 @@
 #undef ROCKET_DEBUG_WAIT_UNTIL_SENT
 #undef ROCKET_DEBUG_RECEIVE
 #undef ROCKET_DEBUG_HANGUP
-	
+
+#ifdef CONFIG_DEVFS_FS
+#define TTR_DEVICE "ttr/%d"
+#define DEVICE_NAME TTR_DEVICE
+#else
+#define TTR_DEVICE "ttyR%d"
+#define DEVICE_NAME "ttyR"
+#endif
+
 
 /*   CAUTION!!!!!  The TIME_STAT Function relies on the Pentium 64 bit
  *    register.  For various reasons related to 1.2.13, the test for this
@@ -449,7 +457,7 @@
 	if (IntMask & DELTA_CD) {	/* CD change  */
 #if (defined(ROCKET_DEBUG_OPEN) || defined(ROCKET_DEBUG_INTR) || \
      defined(ROCKET_DEBUG_HANGUP))
-		printk("ttyR%d CD now %s...", info->line,
+		printk(TTR_DEVICE " CD now %s...", info->line,
 		       (ChanStatus & CD_ACT) ? "on" : "off");
 #endif
 		if (!(ChanStatus & CD_ACT) &&
@@ -836,7 +844,7 @@
 	retval = 0;
 	add_wait_queue(&info->open_wait, &wait);
 #ifdef ROCKET_DEBUG_OPEN
-	printk("block_til_ready before block: ttyR%d, count = %d\n",
+	printk("block_til_ready before block: " TTR_DEVICE ", count = %d\n",
 	       info->line, info->count);
 #endif
 	save_flags(flags); cli();
@@ -871,7 +879,7 @@
 			break;
 		}
 #ifdef ROCKET_DEBUG_OPEN
-		printk("block_til_ready blocking: ttyR%d, count = %d, flags=0x%0x\n",
+		printk("block_til_ready blocking: " TTR_DEVICE ", count = %d, 
flags=0x%0x\n",
 		       info->line, info->count, info->flags);
 #endif
 		schedule();
@@ -884,7 +892,7 @@
 	restore_flags(flags);
 	info->blocked_open--;
 #ifdef ROCKET_DEBUG_OPEN
-	printk("block_til_ready after blocking: ttyR%d, count = %d\n",
+	printk("block_til_ready after blocking: " TTR_DEVICE ", count = %d\n",
 	       info->line, info->count);
 #endif
 	if (retval)
@@ -964,7 +972,7 @@
 #endif
 	}
 #ifdef ROCKET_DEBUG_OPEN
-	printk("rp_open ttyR%d, count=%d\n", info->line, info->count);
+	printk("rp_open " TTR_DEVICE ", count=%d\n", info->line, info->count);
 #endif
 	/*
 	 * Info->count is now 1; so it's safe to sleep now.
@@ -1050,7 +1058,7 @@
 		return;
 
 #ifdef ROCKET_DEBUG_OPEN
-	printk("rp_close ttyR%d, count = %d\n", info->line, info->count);
+	printk("rp_close " TTR_DEVICE ", count = %d\n", info->line, info->count);
 #endif
 	
 	save_flags(flags); cli();
@@ -1072,7 +1080,7 @@
 		info->count = 1;
 	}
 	if (--info->count < 0) {
-		printk("rp_close: bad serial port count for ttyR%d: %d\n",
+		printk("rp_close: bad serial port count for " TTR_DEVICE ": %d\n",
 		       info->line, info->count);
 		info->count = 0;
 	}
@@ -1166,7 +1174,7 @@
 	restore_flags(flags);
 	
 #ifdef ROCKET_DEBUG_OPEN
-	printk("rp_close ttyR%d complete shutdown\n", info->line);
+	printk("rp_close " TTR_DEVICE " complete shutdown\n", info->line);
 #endif
 	
 }
@@ -1646,7 +1654,7 @@
 		return;
 
 #if (defined(ROCKET_DEBUG_OPEN) || defined(ROCKET_DEBUG_HANGUP))
-	printk("rp_hangup of ttyR%d...", info->line);
+	printk("rp_hangup of " TTR_DEVICE "...", info->line);
 #endif
 	/*
 	 * If the port is in the process of being closed, just force
@@ -2193,7 +2201,7 @@
 	 */
 	memset(&rocket_driver, 0, sizeof(struct tty_driver));
 	rocket_driver.magic = TTY_DRIVER_MAGIC;
-	rocket_driver.name = "ttyR";
+	rocket_driver.name = DEVICE_NAME;
 	rocket_driver.major = TTY_ROCKET_MAJOR;
 	rocket_driver.minor_start = 0;
 	rocket_driver.num = MAX_RP_PORTS;
@@ -2235,7 +2243,11 @@
 	 * the minor number and the subtype code.
 	 */
 	callout_driver = rocket_driver;
+#ifdef CONFIG_DEVFS_FS
+	callout_driver.name = "cur/%d";
+#else
 	callout_driver.name = "cur";
+#endif
 	callout_driver.major = CUA_ROCKET_MAJOR;
 	callout_driver.minor_start = 0;
 	callout_driver.subtype = SERIAL_TYPE_CALLOUT;


-- 
http://www.coker.com.au/bonnie++/     Bonnie++ hard drive benchmark
http://www.coker.com.au/postal/       Postal SMTP/POP benchmark
http://www.coker.com.au/projects.html Projects I am working on
http://www.coker.com.au/~russell/     My home page

[-- Attachment #2: rocket.oops --]
[-- Type: text/plain, Size: 2011 bytes --]

Unable to handle kernel NULL pointer dereference at virtual address 0000000b
c8868e1c
*pde = 00000000
Oops: 0000
CPU:    0
EIP:    0010:[<c8868e1c>]
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010286
eax: 0000018c   ebx: c70b0000   ecx: 00000000   edx: c886c800
esi: 00000063   edi: c7039744   ebp: c7040000   esp: c7155eb0
ds: 0018   es: 0018   ss: 0018
Process setserial (pid: 283, stackpage=c7155000)
Stack: 00000000 00000000 c7039744 c706b600 00000000 c016d73b c7040000 c7183aa0 
       c7039740 ffffffed c7039744 c706b600 c7fd89d0 08028009 c7040000 c70a40c0 
       00000000 c01453c9 c70a40c0 c0258c18 c706cae0 00000000 c013db59 c70a40c0 
Call Trace: [<c016d73b>] [<c01453c9>] [<c013db59>] [<c013cfd7>] [<c015a460>] [<c0131f31>] [<c0131e6a>] 
       [<c0132184>] [<c0106f4b>] 
Code: f6 41 0b 40 74 1e 89 c8 05 60 01 00 00 e8 ce ad 8a f7 31 d2 

>>EIP; c8868e1c <[rocket]rp_open+90/3d4>   <=====
Trace; c016d73b <tty_open+1db/34c>
Trace; c01453c9 <dput+19/164>
Trace; c013db59 <path_walk+7dd/8a4>
Trace; c013cfd7 <permission+8b/94>
Trace; c015a460 <devfs_open+f4/1f4>
Trace; c0131f31 <dentry_open+bd/14c>
Trace; c0131e6a <filp_open+52/5c>
Trace; c0132184 <sys_open+3c/f0>
Trace; c0106f4b <system_call+33/38>
Code;  c8868e1c <[rocket]rp_open+90/3d4>
00000000 <_EIP>:
Code;  c8868e1c <[rocket]rp_open+90/3d4>   <=====
   0:   f6 41 0b 40               testb  $0x40,0xb(%ecx)   <=====
Code;  c8868e20 <[rocket]rp_open+94/3d4>
   4:   74 1e                     je     24 <_EIP+0x24> c8868e40 <[rocket]rp_open+b4/3d4>
Code;  c8868e22 <[rocket]rp_open+96/3d4>
   6:   89 c8                     mov    %ecx,%eax
Code;  c8868e24 <[rocket]rp_open+98/3d4>
   8:   05 60 01 00 00            add    $0x160,%eax
Code;  c8868e29 <[rocket]rp_open+9d/3d4>
   d:   e8 ce ad 8a f7            call   f78aade0 <_EIP+0xf78aade0> c0113bfc <interruptible_sleep_on+0/6c>
Code;  c8868e2e <[rocket]rp_open+a2/3d4>
  12:   31 d2                     xor    %edx,%edx


2 warnings issued.  Results may not be reliable.

                 reply	other threads:[~2001-04-20 13:05 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=01042015035403.16958@lyta \
    --to=russell@coker.com.au \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.