Jump to content

    

Пропадают ttyS при регистрации своего мини-драйвера

Наблюдаю следующий глюк. При загрузке линукса с ядром 2.6.34 в систему вставляется наш самодельный модуль, который регистрирует 4 дополнительных порта serial8250. При этом dmesg всегда дает что-то типа:

[    8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[    8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[    8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[    8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[    8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[    8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[    8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[    8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5

Числа 2-5 определяют номера устройств в /dev/ttyS, к которым цепляются новые UARTs.

Однако изредка после вставки модуля один из этих ttyS вообще отваливается. Сделали такой скрипт:

ls -l /dev/ttyS2; echo a2 > /dev/kmsg
ls -l /dev/ttyS3; echo a3 > /dev/kmsg
ls -l /dev/ttyS4; echo a4 > /dev/kmsg
ls -l /dev/ttyS5; echo a5 > /dev/kmsg
insmod m8_hub.ko
ls -l /dev/ttyS2; echo b2 > /dev/kmsg
ls -l /dev/ttyS3; echo b3 > /dev/kmsg
ls -l /dev/ttyS4; echo b4 > /dev/kmsg
ls -l /dev/ttyS5; echo b5 > /dev/kmsg

 

В итоге имеем такой лог от dmesg:

[    8.013214] a2
[    8.030402] a3
[    8.046447] a4
[    8.063384] a5
[    8.098092] m8_hub: starting...
[    8.098195] m8_hub 00:c004: adding serial ports
[    8.098218] m8_hub 00:c004: found UART at address 0x10000, irq 24
[    8.098239] m8_hub 00:c004: found UART at address 0x10100, irq 25
[    8.098261] m8_hub 00:c004: found UART at address 0x10200, irq 26
[    8.098282] m8_hub 00:c004: found UART at address 0x10300, irq 27
[    8.098300] m8_hub 00:c004: registering serial ports
[    8.115418] serial8250.1: ttyS2 at MMIO 0x4c010000 (irq = 152) is a 16550A
[    8.119578] serial8250 serial8250.1: Able to register port at index 0 (IO0 MEM4c010000 IRQ152): 2
[    8.126439] serial8250.1: ttyS3 at MMIO 0x4c010100 (irq = 153) is a 16550A
[    8.138429] serial8250 serial8250.1: Able to register port at index 1 (IO0 MEM4c010100 IRQ153): 3
[    8.146460] serial8250.1: ttyS4 at MMIO 0x4c010200 (irq = 154) is a 16550A
[    8.156863] serial8250 serial8250.1: Able to register port at index 2 (IO0 MEM4c010200 IRQ154): 4
[    8.171341] serial8250.1: ttyS5 at MMIO 0x4c010300 (irq = 155) is a 16550A
[    8.178412] serial8250 serial8250.1: Able to register port at index 3 (IO0 MEM4c010300 IRQ155): 5
[    8.230699] b2
[    8.247030] b3
[    8.258412] b4
[    8.268520] b5

То есть вроде бы все хорошо. Но реально на консоль выдается, например:

crw-rw----    1 root     root        4,  66 Nov 30 00:00 /dev/ttyS2
crw-rw----    1 root     root        4,  67 Nov 30 00:00 /dev/ttyS3
crw-rw----    1 root     root        4,  68 Nov 30 00:00 /dev/ttyS4
crw-rw----    1 root     root        4,  69 Nov 30 00:00 /dev/ttyS5
crw-rw----    1 root     root        4,  66 Nov 30 00:00 /dev/ttyS2
crw-rw----    1 root     root        4,  67 Nov 30 00:00 /dev/ttyS3
ls: /dev/ttyS4: No such file or directory
crw-rw----    1 root     root        4,  69 Nov 30 00:00 /dev/ttyS5

 

То есть, в процессе вставки модуля /dev/ttyS4 взял и умер. При вставке модуля это происходит довольно часто, хотя конкретное устройство может быть любым от ttyS2 до ttyS5. Могут и сразу два пропасть.

Проблема в том, что после такой пропажи перестает работать софт. Однако прямой вызов вроде

mknod -m 660 /dev/ttyS4 c 4 68

возвращает файл устройства на место. Пока правда не удалось проверить, работает ли само устройство после mknod.

 

Есть подозрение, что это как-то связано не с ядром как таковым, а с busybox. Во всяком случае эффект наблюдается с busybox версии 1.21.1 и не наблюдается с версией 1.17.

Хочется эту бяку победить, но пока не непонятно, что предпринять, чтобы выяснить причину. Может быть кто-нибудь сталкивался с похожим багом?

 

 

Share this post


Link to post
Share on other sites

Не думаю, что баг в busybox

Может, добавить побольше printk в модуле ядра для пущей ясности?

Share this post


Link to post
Share on other sites

Проблема решена? Возможно ли восстановить работу порта без перезагрузки линукса?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this