Public bug reported: [Impact]
From Kernel 6.5 and above, the serial driver now claims multiple UART ports by default, when the previous behaviour was it would only claim 1. Due to this the ite-cir driver can no longer load because the port it would assign itself is now being used in memory by the 16550/8250 driver. We have found a workaround by disabling the serial driver from consuming more than 1 port. Below is the steps we went to troubleshoot, investigate and the solution we’ve found. This is a regression from 6.4 behaviour. When installing 24.04 I noticed that the /dev/lirc0 device was not loaded on the system which is what is created when the driver is loaded. After reviewing the driver we use on 20.04 I then searched the kernel logs and found that the ite-cir driver failed to load due to error -16. ``` 2024-04-19T13:44:51.873060+00:00 host kernel: rc rc0: ITE8708 CIR transceiver as /devices/pnp0/00:03/rc/rc0 2024-04-19T13:44:51.873062+00:00 host kernel: rc rc0: lirc_dev: driver ite-cir registered at minor = 0, raw IR receiver, raw IR transmitter 2024-04-19T13:44:51.873070+00:00 host kernel: input: ITE8708 CIR transceiver as /devices/pnp0/00:03/rc/rc0/input6 2024-04-19T13:44:51.873072+00:00 host kernel: i2c i2c-2: 2/2 memory slots populated (from DMI) 2024-04-19T13:44:51.873076+00:00 host kernel: i2c i2c-2: Successfully instantiated SPD at 0x50 2024-04-19T13:44:51.873078+00:00 host kernel: ite-cir: probe of 00:03 failed with error -16 ``` I reviewed kernel error message and this error is due to the device/resource is busy or in use. My colleague and I reviewed the ite- cir driver source code and noticed the driver initialisation succeeds up until L1404 https://github.com/torvalds/linux/blob/master/drivers/media/rc/ite- cir.c#L1404 where it attempts to request_region, if it fails to do this it will unregister the device. The request region allocates a place in memory for the device to use, we believe it’s using the ioport.h’s request region function https://github.com/torvalds/linux/blob/master/include/linux/ioport.h#L278 When we added some debug lines to ite-cir we noticed that the memory reference it is trying to allocate is 02f8-02ff. We checked the ioports on 24.04 and noticed that the serial driver was taking up this reference in memory when in 20.04 (The OS we currently use) and 23.04 it would not. Ubuntu 24.04 ioports ``` user@host:~$ sudo cat /proc/ioports 0000-0cf7 : PCI Bus 0000:00 02f8-02ff : serial 03f8-03ff : serial ``` Ubuntu 20.04 ioports memory allocation ``` user@host:~$ sudo cat /proc/ioports 0000-0cf7 : PCI Bus 0000:00 02f8-02ff : ite-cir 03f8-03ff : serial ``` When we investigated any changes that might cause this, we came with two potential commits that were released in 6.5 that might have caused this issue: * https://github.com/torvalds/linux/commit/9d86719f8769244dc99b8cb6091c41eae3fd684f * https://github.com/torvalds/linux/commit/84a9582fd203063cd4d301204971ff2cd8327f1a The serial changes allow 16550/8250 driver to consume as many serial ports as they require initializing the driver, originally they only used 1. Due to this we noticed that when we checked the serial ports in use by the device that 8250 was consuming the place in memory that ite-cir should. Ubuntu 24.04 ``` user@host:~$ sudo setserial -g /dev/ttyS* /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 /dev/ttyS1, UART: 8250, Port: 0x02f8, IRQ: 3 ``` Ubuntu 20.04 ``` user@host:~$ sudo setserial -g /dev/ttyS* /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 /dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3 ``` [Regression] We believe that the regression started from 6.5 kernel onwards based on the commit changes that were done to the serial driver that shipped to those kernels. 23.04 that uses 6.2 works as expected and shows no issues with using the serial port for IR while 23.10 that uses 6.5 and 24.04 that uses 6.8 does not load the ite-cir driver. [Reproducible steps] * Use Ubuntu 23.10 + or use Kernel 6.5+ * Use IR hardware that requires the ite-cir driver to be loaded * Attempt to load ite-cir driver on boot of OS * Check /var/log/kern.log for ite-cir driver failure [Fix] The requested solution would be to either: * Set the serial driver to no longer consume more than 1 serial port * Have the serial driver check what memory reference ite-cir driver needs to load, ignore that reference and then consume another point in memory instead. We have found a workaround where we set the /etc/default/grub config to make the 8250 use only 1 UART port, this allows ite-cir to consume the port in memory like it use to, enabling us to use the driver again /etc/default/grub ``` GRUB_CMDLINE_LINUX_DEFAULT="8250.nr_uarts=1" ``` The alternative fix is to have a startup script that will remove 8250 from using /dev/ttyS1 and then remove and re-add the ite-cir driver ``` #!/bin/bash setserial /dev/ttyS1 uart none modprobe -r ite-cir ``` [Diagnostic information] version ``` Linux version 6.8.0-22-generic (buildd@lcy02-amd64-070) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu3) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #22-Ubuntu SMP PREEMPT_DYNAMIC Thu Apr 4 22:30:32 UTC 2024 ``` lsb_release ``` No LSB modules are available. Description: Ubuntu Noble Numbat (development branch) Release: 24.04 ``` Kernel version ``` linux-image-6.8.0-22-generic: Installed: 6.8.0-22.22 Candidate: 6.8.0-22.22 Version table: *** 6.8.0-22.22 100 100 /var/lib/dpkg/status ``` ** Affects: linux (Ubuntu) Importance: Undecided Status: New ** Tags: 6.5 6.8 driver ite-cir kernel-bug ** Attachment added: "lspci-vnvn.log" https://bugs.launchpad.net/bugs/2063322/+attachment/5769983/+files/lspci-vnvn.log ** Description changed: [Impact] From Kernel 6.5 and above, the serial driver now claims multiple UART ports by default, when the previous behaviour was it would only claim 1. Due to this the ite-cir driver can no longer load because the port it would assign itself is now being used in memory by the 16550/8250 driver. We have found a workaround by disabling the serial driver from consuming more than 1 port. Below is the steps we went to troubleshoot, investigate and the solution we’ve found. This is a regression from 6.4 behaviour. When installing 24.04 I noticed that the /dev/lirc0 device was not loaded on the system which is what is created when the driver is loaded. After reviewing the driver we use on 20.04 I then searched the kernel logs and found that the ite-cir driver failed to load due to error -16. ``` - 2024-04-19T13:44:51.873060+00:00 harness kernel: rc rc0: ITE8708 CIR transceiver as /devices/pnp0/00:03/rc/rc0 - 2024-04-19T13:44:51.873062+00:00 harness kernel: rc rc0: lirc_dev: driver ite-cir registered at minor = 0, raw IR receiver, raw IR transmitter - 2024-04-19T13:44:51.873070+00:00 harness kernel: input: ITE8708 CIR transceiver as /devices/pnp0/00:03/rc/rc0/input6 - 2024-04-19T13:44:51.873072+00:00 harness kernel: i2c i2c-2: 2/2 memory slots populated (from DMI) - 2024-04-19T13:44:51.873076+00:00 harness kernel: i2c i2c-2: Successfully instantiated SPD at 0x50 - 2024-04-19T13:44:51.873078+00:00 harness kernel: ite-cir: probe of 00:03 failed with error -16 + 2024-04-19T13:44:51.873060+00:00 host kernel: rc rc0: ITE8708 CIR transceiver as /devices/pnp0/00:03/rc/rc0 + 2024-04-19T13:44:51.873062+00:00 host kernel: rc rc0: lirc_dev: driver ite-cir registered at minor = 0, raw IR receiver, raw IR transmitter + 2024-04-19T13:44:51.873070+00:00 host kernel: input: ITE8708 CIR transceiver as /devices/pnp0/00:03/rc/rc0/input6 + 2024-04-19T13:44:51.873072+00:00 host kernel: i2c i2c-2: 2/2 memory slots populated (from DMI) + 2024-04-19T13:44:51.873076+00:00 host kernel: i2c i2c-2: Successfully instantiated SPD at 0x50 + 2024-04-19T13:44:51.873078+00:00 host kernel: ite-cir: probe of 00:03 failed with error -16 ``` I reviewed kernel error message and this error is due to the device/resource is busy or in use. My colleague and I reviewed the ite- cir driver source code and noticed the driver initialisation succeeds up until L1404 https://github.com/torvalds/linux/blob/master/drivers/media/rc/ite- cir.c#L1404 where it attempts to request_region, if it fails to do this it will unregister the device. The request region allocates a place in memory for the device to use, we believe it’s using the ioport.h’s request region function https://github.com/torvalds/linux/blob/master/include/linux/ioport.h#L278 When we added some debug lines to ite-cir we noticed that the memory reference it is trying to allocate is 02f8-02ff. We checked the ioports on 24.04 and noticed that the serial driver was taking up this reference in memory when in 20.04 (The OS we currently use) and 23.04 it would not. Ubuntu 24.04 ioports ``` - user@host:~$ sudo cat /proc/ioports + user@host:~$ sudo cat /proc/ioports 0000-0cf7 : PCI Bus 0000:00 - 02f8-02ff : serial - 03f8-03ff : serial + 02f8-02ff : serial + 03f8-03ff : serial ``` Ubuntu 20.04 ioports memory allocation ``` - user@host:~$ sudo cat /proc/ioports - 0000-0cf7 : PCI Bus 0000:00 - 02f8-02ff : ite-cir - 03f8-03ff : serial + user@host:~$ sudo cat /proc/ioports + 0000-0cf7 : PCI Bus 0000:00 + 02f8-02ff : ite-cir + 03f8-03ff : serial ``` When we investigated any changes that might cause this, we came with two potential commits that were released in 6.5 that might have caused this issue: * https://github.com/torvalds/linux/commit/9d86719f8769244dc99b8cb6091c41eae3fd684f * https://github.com/torvalds/linux/commit/84a9582fd203063cd4d301204971ff2cd8327f1a The serial changes allow 16550/8250 driver to consume as many serial ports as they require initializing the driver, originally they only used 1. Due to this we noticed that when we checked the serial ports in use by the device that 8250 was consuming the place in memory that ite-cir should. Ubuntu 24.04 ``` user@host:~$ sudo setserial -g /dev/ttyS* /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 /dev/ttyS1, UART: 8250, Port: 0x02f8, IRQ: 3 ``` Ubuntu 20.04 ``` user@host:~$ sudo setserial -g /dev/ttyS* /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4 /dev/ttyS1, UART: unknown, Port: 0x02f8, IRQ: 3 ``` [Regression] We believe that the regression started from 6.5 kernel onwards based on the commit changes that were done to the serial driver that shipped to those kernels. 23.04 that uses 6.2 works as expected and shows no issues with using the serial port for IR while 23.10 that uses 6.5 and 24.04 that uses 6.8 does not load the ite-cir driver. - [Reproducible steps] * Use Ubuntu 23.10 + or use Kernel 6.5+ * Use IR hardware that requires the ite-cir driver to be loaded * Attempt to load ite-cir driver on boot of OS - * Check /var/log/kern.log for ite-cir driver failure + * Check /var/log/kern.log for ite-cir driver failure [Fix] The requested solution would be to either: * Set the serial driver to no longer consume more than 1 serial port * Have the serial driver check what memory reference ite-cir driver needs to load, ignore that reference and then consume another point in memory instead. - - We have found a workaround where we set the /etc/default/grub config to make the 8250 use only 1 UART port, this allows ite-cir to consume the port in memory like it use to, enabling us to use the driver again + We have found a workaround where we set the /etc/default/grub config to + make the 8250 use only 1 UART port, this allows ite-cir to consume the + port in memory like it use to, enabling us to use the driver again /etc/default/grub ``` GRUB_CMDLINE_LINUX_DEFAULT="8250.nr_uarts=1" ``` The alternative fix is to have a startup script that will remove 8250 from using /dev/ttyS1 and then remove and re-add the ite-cir driver ``` #!/bin/bash setserial /dev/ttyS1 uart none modprobe -r ite-cir ``` [Diagnostic information] version ``` Linux version 6.8.0-22-generic (buildd@lcy02-amd64-070) (x86_64-linux-gnu-gcc-13 (Ubuntu 13.2.0-23ubuntu3) 13.2.0, GNU ld (GNU Binutils for Ubuntu) 2.42) #22-Ubuntu SMP PREEMPT_DYNAMIC Thu Apr 4 22:30:32 UTC 2024 ``` lsb_release ``` No LSB modules are available. Description: Ubuntu Noble Numbat (development branch) Release: 24.04 ``` Kernel version ``` linux-image-6.8.0-22-generic: - Installed: 6.8.0-22.22 - Candidate: 6.8.0-22.22 - Version table: - *** 6.8.0-22.22 100 - 100 /var/lib/dpkg/status + Installed: 6.8.0-22.22 + Candidate: 6.8.0-22.22 + Version table: + *** 6.8.0-22.22 100 + 100 /var/lib/dpkg/status ``` ** Summary changed: - ite-cir driver failed to load due to a regression in linux kernel 6.5+ + ite-cir driver failed to load due to a regression in linux kernel 6.5+ serial driver change -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/2063322 Title: ite-cir driver failed to load due to a regression in linux kernel 6.5+ serial driver change To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2063322/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs