Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'tty-6.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty

Pull tty / serial fixes from Greg KH:
"Here are some small tty and serial driver fixes for 6.4-rc3 to resolve
some reported problems, and add some new device ids. These include:

- termios documentation updates

- vc_screen use-after-free fix

- memory leak fix in arc_uart driver

- new 8250 driver ids

- other small serial driver fixes

All of these have been in linux-next for a while with no reported
problems"

* tag 'tty-6.4-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty:
vc_screen: reload load of struct vc_data pointer in vcs_write() to avoid UAF
serial: qcom-geni: fix enabling deactivated interrupt
serial: 8250_bcm7271: fix leak in `brcmuart_probe`
serial: 8250_bcm7271: balance clk_enable calls
serial: arc_uart: fix of_iomap leak in `arc_serial_probe`
serial: 8250: Document termios parameter of serial8250_em485_config()
serial: Add support for Advantech PCI-1611U card
serial: 8250_exar: Add support for USR298x PCI Modems

+45 -12
+5 -2
drivers/tty/serial/8250/8250_bcm7271.c
··· 1012 1012 of_property_read_u32(np, "clock-frequency", &clk_rate); 1013 1013 1014 1014 /* See if a Baud clock has been specified */ 1015 - baud_mux_clk = of_clk_get_by_name(np, "sw_baud"); 1015 + baud_mux_clk = devm_clk_get(dev, "sw_baud"); 1016 1016 if (IS_ERR(baud_mux_clk)) { 1017 1017 if (PTR_ERR(baud_mux_clk) == -EPROBE_DEFER) { 1018 1018 ret = -EPROBE_DEFER; ··· 1032 1032 if (clk_rate == 0) { 1033 1033 dev_err(dev, "clock-frequency or clk not defined\n"); 1034 1034 ret = -EINVAL; 1035 - goto release_dma; 1035 + goto err_clk_disable; 1036 1036 } 1037 1037 1038 1038 dev_dbg(dev, "DMA is %senabled\n", priv->dma_enabled ? "" : "not "); ··· 1119 1119 serial8250_unregister_port(priv->line); 1120 1120 err: 1121 1121 brcmuart_free_bufs(dev, priv); 1122 + err_clk_disable: 1123 + clk_disable_unprepare(baud_mux_clk); 1122 1124 release_dma: 1123 1125 if (priv->dma_enabled) 1124 1126 brcmuart_arbitration(priv, 0); ··· 1135 1133 hrtimer_cancel(&priv->hrt); 1136 1134 serial8250_unregister_port(priv->line); 1137 1135 brcmuart_free_bufs(&pdev->dev, priv); 1136 + clk_disable_unprepare(priv->baud_mux_clk); 1138 1137 if (priv->dma_enabled) 1139 1138 brcmuart_arbitration(priv, 0); 1140 1139 return 0;
+17
drivers/tty/serial/8250/8250_exar.c
··· 40 40 #define PCI_DEVICE_ID_COMMTECH_4224PCIE 0x0020 41 41 #define PCI_DEVICE_ID_COMMTECH_4228PCIE 0x0021 42 42 #define PCI_DEVICE_ID_COMMTECH_4222PCIE 0x0022 43 + 43 44 #define PCI_DEVICE_ID_EXAR_XR17V4358 0x4358 44 45 #define PCI_DEVICE_ID_EXAR_XR17V8358 0x8358 46 + 47 + #define PCI_SUBDEVICE_ID_USR_2980 0x0128 48 + #define PCI_SUBDEVICE_ID_USR_2981 0x0129 45 49 46 50 #define PCI_DEVICE_ID_SEALEVEL_710xC 0x1001 47 51 #define PCI_DEVICE_ID_SEALEVEL_720xC 0x1002 ··· 833 829 (kernel_ulong_t)&bd \ 834 830 } 835 831 832 + #define USR_DEVICE(devid, sdevid, bd) { \ 833 + PCI_DEVICE_SUB( \ 834 + PCI_VENDOR_ID_USR, \ 835 + PCI_DEVICE_ID_EXAR_##devid, \ 836 + PCI_VENDOR_ID_EXAR, \ 837 + PCI_SUBDEVICE_ID_USR_##sdevid), 0, 0, \ 838 + (kernel_ulong_t)&bd \ 839 + } 840 + 836 841 static const struct pci_device_id exar_pci_tbl[] = { 837 842 EXAR_DEVICE(ACCESSIO, COM_2S, pbn_exar_XR17C15x), 838 843 EXAR_DEVICE(ACCESSIO, COM_4S, pbn_exar_XR17C15x), ··· 865 852 CONNECT_DEVICE(XR17C158, UART_8_485, pbn_connect), 866 853 867 854 IBM_DEVICE(XR17C152, SATURN_SERIAL_ONE_PORT, pbn_exar_ibm_saturn), 855 + 856 + /* USRobotics USR298x-OEM PCI Modems */ 857 + USR_DEVICE(XR17C152, 2980, pbn_exar_XR17C15x), 858 + USR_DEVICE(XR17C152, 2981, pbn_exar_XR17C15x), 868 859 869 860 /* Exar Corp. XR17C15[248] Dual/Quad/Octal UART */ 870 861 EXAR_DEVICE(EXAR, XR17C152, pbn_exar_XR17C15x),
+5
drivers/tty/serial/8250/8250_pci.c
··· 1920 1920 #define PCI_SUBDEVICE_ID_SIIG_DUAL_30 0x2530 1921 1921 #define PCI_VENDOR_ID_ADVANTECH 0x13fe 1922 1922 #define PCI_DEVICE_ID_INTEL_CE4100_UART 0x2e66 1923 + #define PCI_DEVICE_ID_ADVANTECH_PCI1600 0x1600 1924 + #define PCI_DEVICE_ID_ADVANTECH_PCI1600_1611 0x1611 1923 1925 #define PCI_DEVICE_ID_ADVANTECH_PCI3620 0x3620 1924 1926 #define PCI_DEVICE_ID_ADVANTECH_PCI3618 0x3618 1925 1927 #define PCI_DEVICE_ID_ADVANTECH_PCIf618 0xf618 ··· 4087 4085 pciserial_resume_one); 4088 4086 4089 4087 static const struct pci_device_id serial_pci_tbl[] = { 4088 + { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI1600, 4089 + PCI_DEVICE_ID_ADVANTECH_PCI1600_1611, PCI_ANY_ID, 0, 0, 4090 + pbn_b0_4_921600 }, 4090 4091 /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */ 4091 4092 { PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620, 4092 4093 PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
+1
drivers/tty/serial/8250/8250_port.c
··· 669 669 /** 670 670 * serial8250_em485_config() - generic ->rs485_config() callback 671 671 * @port: uart port 672 + * @termios: termios structure 672 673 * @rs485: rs485 settings 673 674 * 674 675 * Generic callback usable by 8250 uart drivers to activate rs485 settings
+4 -3
drivers/tty/serial/arc_uart.c
··· 606 606 } 607 607 uart->baud = val; 608 608 609 - port->membase = of_iomap(np, 0); 610 - if (!port->membase) 609 + port->membase = devm_platform_ioremap_resource(pdev, 0); 610 + if (IS_ERR(port->membase)) { 611 611 /* No point of dev_err since UART itself is hosed here */ 612 - return -ENXIO; 612 + return PTR_ERR(port->membase); 613 + } 613 614 614 615 port->irq = irq_of_parse_and_map(np, 0); 615 616
+4 -5
drivers/tty/serial/qcom_geni_serial.c
··· 1664 1664 uport->private_data = &port->private_data; 1665 1665 platform_set_drvdata(pdev, port); 1666 1666 1667 - ret = uart_add_one_port(drv, uport); 1668 - if (ret) 1669 - return ret; 1670 - 1671 1667 irq_set_status_flags(uport->irq, IRQ_NOAUTOEN); 1672 1668 ret = devm_request_irq(uport->dev, uport->irq, qcom_geni_serial_isr, 1673 1669 IRQF_TRIGGER_HIGH, port->name, uport); 1674 1670 if (ret) { 1675 1671 dev_err(uport->dev, "Failed to get IRQ ret %d\n", ret); 1676 - uart_remove_one_port(drv, uport); 1677 1672 return ret; 1678 1673 } 1674 + 1675 + ret = uart_add_one_port(drv, uport); 1676 + if (ret) 1677 + return ret; 1679 1678 1680 1679 /* 1681 1680 * Set pm_runtime status as ACTIVE so that wakeup_irq gets
+9 -2
drivers/tty/vt/vc_screen.c
··· 656 656 } 657 657 } 658 658 659 - /* The vcs_size might have changed while we slept to grab 660 - * the user buffer, so recheck. 659 + /* The vc might have been freed or vcs_size might have changed 660 + * while we slept to grab the user buffer, so recheck. 661 661 * Return data written up to now on failure. 662 662 */ 663 + vc = vcs_vc(inode, &viewed); 664 + if (!vc) { 665 + if (written) 666 + break; 667 + ret = -ENXIO; 668 + goto unlock_out; 669 + } 663 670 size = vcs_size(vc, attr, false); 664 671 if (size < 0) { 665 672 if (written)