I've been sort of maintaining a couple of Digi International serial port
card (XP and AP) drivers for years now because, well, they just won't do
it anymore. In any case, I'm moving from a 3.4.x kernel, that works just
fine, to a 3.8.8 kernel, that does not. I have code that does something
like this:
tty_set_operations(&SerialDriver, &SerialOps);
tty_register_driver(&SerialDriver);
maxminor = NumBoards * 64;
for (i = 0; i < maxminor; i++)
tty_register_device(&SerialDriver, i, NULL);
The first call to tty_register_device barfs:
[ 76.528626] BUG: unable to handle kernel NULL pointer dereference at
(null)
[ 76.528628] IP: [<c02fa460>] cdev_init+0x30/0x90
[ 76.528632] *pde = 00000000
[ 76.528634] Oops: 0002 [#1] PREEMPT SMP
[ 76.528636] Modules linked in: kvm snd_hda_codec_realtek
snd_hda_intel snd_hda_codec snd_hwdep snd_pcm nvidia(PO) osst snd_seq
dgdm(O+) snd_timer snd_seq_device eprm(O) st sr_mod sg synclink_gt snd
crc32c_intel aesni_intel ablk_helper cryptd lrw gpiohsd(O) k10temp
lcrsmem(O) hdlc aes_i586 3c59x firewire_ohci pcspkr xts gf128mul mxm_wmi
shpchp soundcore i2c_piix4 firewire_core snd_page_alloc crc_itu_t cdrom
wmi pci_hotplug r8169 fam15h_power microcode rtom(O) button edd autofs4
ext4 jbd2 crc16 xhci_hcd scsi_dh_hp_sw scsi_dh_emc scsi_dh_alua
scsi_dh_rdac scsi_dh ata_generic pata_atiixp aic7xxx aic79xx
scsi_transport_spi
[ 76.528661] Pid: 393, comm: systemd-udevd Tainted: P O
3.8.8-lcrs #8 Gigabyte Technology Co., Ltd. GA-990FXA-UD5/GA-990FXA-UD5
[ 76.528662] EIP: 0060:[<c02fa460>] EFLAGS: 00010246 CPU: 4
[ 76.528664] EIP is at cdev_init+0x30/0x90
[ 76.528665] EAX: 00000000 EBX: 00000000 ECX: 0000000f EDX: 0000003c
[ 76.528667] ESI: c06d38c0 EDI: 00000000 EBP: ed449d0c ESP: ed449d00
[ 76.528668] DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
[ 76.528669] CR0: 8005003b CR2: f72f9920 CR3: 2ebc8000 CR4: 000407d0
[ 76.528670] DR0: 00000000 DR1: 00000000 DR2: 00000000 DR3: 00000000
[ 76.528672] DR6: ffff0ff0 DR7: 00000400
[ 76.528673] Process systemd-udevd (pid: 393, ti=ed448000
task=ee753240 task.ti=ed448000)
[ 76.528674] Stack:
[ 76.528675] fb396220 00000000 04600000 ed449d30 c04780a6 c0826710
0000003c 00000000
[ 76.528678] 00000000 fb396220 00000000 04600000 ed449dac c0478d52
00000001 ed449d60
[ 76.528681] 00000000 00000002 00000000 04600000 00000730 ed449d60
00000000 00000000
[ 76.528684] Call Trace:
[ 76.528688] [<c04780a6>] tty_cdev_add+0x56/0x80
[ 76.528690] [<c0478d52>] tty_register_device_attr+0x192/0x220
[ 76.528693] [<c02fa96d>] ? register_chrdev_region+0x4d/0xa0
[ 76.528695] [<c0478dfa>] tty_register_device+0x1a/0x20
[ 76.528702] [<fb37e701>] dgdm_tty_init+0x601/0x660 [dgdm]
[ 76.528707] [<fb375818>] init_module+0x2008/0x22f0 [dgdm]
[ 76.528711] [<c069d843>] ? notifier_call_chain+0x43/0x60
[ 76.528716] [<fb373810>] ? dgdm_boardread+0x430/0x430 [dgdm]
[ 76.528718] [<c0201222>] do_one_initcall+0x112/0x160
[ 76.528721] [<c0252707>] ? __blocking_notifier_call_chain+0x47/0x60
[ 76.528723] [<c02849d8>] load_module+0x1c58/0x2280
[ 76.528729] [<c028508d>] sys_init_module+0x8d/0xf0
[ 76.528734] [<c069ad1d>] syscall_call+0x7/0xb
[ 76.528735] Code: 0c a8 01 89 5d f4 89 c3 89 75 f8 89 d6 ba 3c 00 00
00 89 7d fc 89 c7 75 52 f7 c7 02 00 00 00 75 5a 89 d1 31 c0 c1 e9 02 f6
c2 02 <f3> ab 74 08 66 c7 07 00 00 83 c7 02 83 e2 01 74 03 c6 07 00 8d
[ 76.528753] EIP: [<c02fa460>] cdev_init+0x30/0x90 SS:ESP 0068:ed449d00
[ 76.528756] CR2: 0000000000000000
[ 76.528758] ---[ end trace 99a84df60dc687d6 ]---
I've put a printk in tty_io.c that shows the NULL pointer in
driver->cdevs, that I assume. is what is causing it to barf. The first 4
below are from Synclink-GT driver. The last is mine.
tty_cdev_add: Entered. driver = 0xeebd9900 driver->cdevs = 0xe678b800
index = 0 name = ttySLG0
tty_cdev_add: Entered. driver = 0xeebd9900 driver->cdevs = 0xe678b800
index = 1 name = ttySLG1
tty_cdev_add: Entered. driver = 0xeebd9900 driver->cdevs = 0xe678b800
index = 2 name = ttySLG2
tty_cdev_add: Entered. driver = 0xeebd9900 driver->cdevs = 0xe678b800
index = 3 name = ttySLG3
tty_cdev_add: Entered. driver = 0xf6d723a0 driver->cdevs = 0x00000000
index = 0 name = tty_dgdm_G0
I've tried adding cdev_alloc and cdev_init into the mix but things seem
to get much worse when I do.
Any tips or pointers would be appreciated.
Thanks in advance
Mark
--
To unsubscribe from this list: send the line "unsubscribe linux-serial" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html