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
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.