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.