From 0b39a5c555fc0dde4ad909891888dc952b6ed831 Mon Sep 17 00:00:00 2001 From: Mykyta Dorokhin Date: Thu, 28 Jan 2021 13:33:11 +0200 Subject: linux 5.4: vizzini: fix "transfer buffer is on stack" backtrace The following backtrace is caused by original vizzini-1.1-enable-cts.patch WARNING: CPU: 0 PID: 1030 at drivers/usb/core/hcd.c:1495 usb_hcd_map_urb_for_dma+0x3c0/0x480 transfer buffer is on stack Modules linked in: mts_io(O) xt_time xt_tcpudp xt_state xt_set xt_recent xt_policy xt_nat xt_multiport xt_mark xt_mac xt_limit xt_l2tp xt_iprange xt_hl xt_hashlimit xt_esp ip6t_ipv6header ip6t_hbh ip6t_frag ip6t_eui64 ip6t_ah ip6t_SYNPROXY nf_synproxy_core ip6t_REJECT nf_reject_ipv6 ip6t_NPT x_tables ip6_vti ip6_gre ip6_tunnel dns_resolver CPU: 0 PID: 1030 Comm: gpsctl Tainted: G O 5.4.81 #1 Hardware name: Atmel AT91SAM9 [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [] (show_stack) from [] (__warn+0xb8/0xcc) [] (__warn) from [] (warn_slowpath_fmt+0x68/0x7c) [] (warn_slowpath_fmt) from [] (usb_hcd_map_urb_for_dma+0x3c0/0x480) [] (usb_hcd_map_urb_for_dma) from [] (usb_hcd_submit_urb+0x8c4/0x940) [] (usb_hcd_submit_urb) from [] (usb_start_wait_urb+0x44/0x130) [] (usb_start_wait_urb) from [] (usb_control_msg+0x9c/0xd0) [] (usb_control_msg) from [] (vizzini_get_reg+0x4c/0x60 [vizzini]) [] (vizzini_get_reg [vizzini]) from [] (xr21v141x_tty_set_termios+0x130/0x344 [vizzini]) [] (xr21v141x_tty_set_termios [vizzini]) from [] (tty_set_termios+0x168/0x1e0) [] (tty_set_termios) from [] (set_termios+0x258/0x2ec) [] (set_termios) from [] (tty_mode_ioctl+0x1c4/0x424) [] (tty_mode_ioctl) from [] (tty_ioctl+0x90c/0x980) [] (tty_ioctl) from [] (vfs_ioctl+0x24/0x3c) [] (vfs_ioctl) from [] (do_vfs_ioctl+0x94/0x6f4) [] (do_vfs_ioctl) from [] (ksys_ioctl+0x50/0x68) [] (ksys_ioctl) from [] (ret_fast_syscall+0x0/0x50) Exception stack(0xc5ce1fa8 to 0xc5ce1ff0) 1fa0: 00000000 00000003 00000003 00005402 beeb8c04 00000000 1fc0: 00000000 00000003 000121d0 00000036 00000000 00000000 b6fe4fa4 beeb8c74 1fe0: 00000010 beeb8c00 00000000 b6e1e890 --- .../vizzini-1.1/vizzini-1.1-enable-cts-v2.patch | 86 ++++++++++++++++++++++ recipes-kernel/vizzini/vizzini_1.1.bb | 2 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 recipes-kernel/vizzini/vizzini-1.1/vizzini-1.1-enable-cts-v2.patch (limited to 'recipes-kernel/vizzini') diff --git a/recipes-kernel/vizzini/vizzini-1.1/vizzini-1.1-enable-cts-v2.patch b/recipes-kernel/vizzini/vizzini-1.1/vizzini-1.1-enable-cts-v2.patch new file mode 100644 index 0000000..abb5781 --- /dev/null +++ b/recipes-kernel/vizzini/vizzini-1.1/vizzini-1.1-enable-cts-v2.patch @@ -0,0 +1,86 @@ +From 7cb3a2e17bde4d3491e786a6c1790bc3c98c2f66 Mon Sep 17 00:00:00 2001 +From: Mykyta Dorokhin +Date: Thu, 28 Jan 2021 13:02:08 +0200 +Subject: [PATCH] vizzini-1.1-enable-cts-v2 + +vizzini-1.1-enable-cts-v2.patch: Replaces vizzini-1.1-enable-cts.patch The change fixes the following backtrace triggered by the original patch: + +------------[ cut here ]------------ +WARNING: CPU: 0 PID: 1078 at drivers/usb/core/hcd.c:1495 usb_hcd_map_urb_for_dma+0x3c0/0x480 +transfer buffer is on stack +Modules linked in: mts_io(O) xt_time xt_tcpudp xt_state xt_set xt_recent xt_policy xt_nat xt_multiport xt_mark xt_mac xt_limit xt_l2tp xt_iprange xt_hl xt_hashlimit xt_esh + ip6t_ipv6header ip6t_hbh ip6t_frag ip6t_eui64 ip6t_ah ip6t_SYNPROXY nf_synproxy_core ip6t_REJECT nf_reject_ipv6 ip6t_NPT x_tables ip6_vti ip6_gre ip6_tunnel dns_resolvero +CPU: 0 PID: 1078 Comm: gpsctl Tainted: G O 5.4.81 #1 +Hardware name: Atmel AT91SAM9 +[] (unwind_backtrace) from [] (show_stack+0x10/0x14) +[] (show_stack) from [] (__warn+0xb8/0xcc) +[] (__warn) from [] (warn_slowpath_fmt+0x68/0x7c) +[] (warn_slowpath_fmt) from [] (usb_hcd_map_urb_for_dma+0x3c0/0x480) +[] (usb_hcd_map_urb_for_dma) from [] (usb_hcd_submit_urb+0x8c4/0x940) +[] (usb_hcd_submit_urb) from [] (usb_start_wait_urb+0x44/0x130) +[] (usb_start_wait_urb) from [] (usb_control_msg+0x9c/0xd0) +[] (usb_control_msg) from [] (vizzini_get_reg+0x4c/0x60 [vizzini]) +[] (vizzini_get_reg [vizzini]) from [] (xr21v141x_tty_set_termios+0x130/0x344 [vizzini]) +[] (xr21v141x_tty_set_termios [vizzini]) from [] (tty_set_termios+0x168/0x1e0) +[] (tty_set_termios) from [] (set_termios+0x258/0x2ec) +[] (set_termios) from [] (tty_mode_ioctl+0x1c4/0x424) +[] (tty_mode_ioctl) from [] (tty_ioctl+0x90c/0x980) +[] (tty_ioctl) from [] (vfs_ioctl+0x24/0x3c) +[] (vfs_ioctl) from [] (do_vfs_ioctl+0x94/0x6f4) +[] (do_vfs_ioctl) from [] (ksys_ioctl+0x50/0x68) +[] (ksys_ioctl) from [] (ret_fast_syscall+0x0/0x50) +Exception stack(0xc62cbfa8 to 0xc62cbff0) +bfa0: 00000000 00000003 00000003 00005402 becb1c04 00000000 +bfc0: 00000000 00000003 000121d0 00000036 00000000 00000000 b6f85fa4 becb1c74 +bfe0: 00000010 becb1c00 00000000 b6dbf890 +---[ end trace ac4b5bc1fe01b267 ]--- +--- + vizzini.c | 25 +++++++++++++++++++++++++ + 1 file changed, 25 insertions(+) + +diff --git a/vizzini.c b/vizzini.c +index 9595ba3..326a1bd 100644 +--- a/vizzini.c ++++ b/vizzini.c +@@ -61,6 +61,9 @@ + #define DRIVER_AUTHOR "Ravi Reddy" + #define DRIVER_DESC "Exar USB UART Driver for XR21V141x " + ++#define UART_PIN_RTS 0x020 ++#define UART_GPIO_DIR 0x01b ++ + static struct usb_driver xr21v141x_driver; + static struct tty_driver *xr21v141x_tty_driver; + static struct xr21v141x *xr21v141x_table[XR21V141X_TTY_MINORS]; +@@ -1236,6 +1239,28 @@ static void xr21v141x_tty_set_termios(struct tty_struct *tty, + vizzini_set_reg(xr21v141x, block, UART_FLOW, flow); + vizzini_set_reg(xr21v141x, block, UART_GPIO_MODE, gpio_mode); + ++ /* if flow control hasn't been turned on, enable RTS for modem-like functionality */ ++ if (flow == UART_FLOW_MODE_NONE) { ++ char value; ++ void *buf = kmalloc(1, GFP_KERNEL); ++ ++ if (!buf) { ++ dev_err(&xr21v141x->control->dev, "%s - Cannot allocate buffer.\n", __func__); ++ } ++ else { ++ vizzini_get_reg(xr21v141x, block, UART_GPIO_DIR, buf); ++ memcpy(&value, buf, 1); ++ value |= UART_PIN_RTS; ++ vizzini_set_reg(xr21v141x, block, UART_GPIO_DIR, value); ++ ++ vizzini_get_reg(xr21v141x, block, UART_GPIO_CLR, buf); ++ memcpy(&value, buf, 1); ++ value |= UART_PIN_RTS; ++ vizzini_set_reg(xr21v141x, block, UART_GPIO_CLR, value); ++ kfree(buf); ++ } ++ } ++ + if (xr21v141x->trans9) { + /* Turn on wide mode if we're 9-bit transparent. */ + vizzini_set_reg(xr21v141x, EPLOCALS_REG_BLOCK, (block * MEM_EP_LOCALS_SIZE) + EP_WIDE_MODE, 1); +-- +1.9.1 + diff --git a/recipes-kernel/vizzini/vizzini_1.1.bb b/recipes-kernel/vizzini/vizzini_1.1.bb index 8dc75f2..0cd1c5e 100644 --- a/recipes-kernel/vizzini/vizzini_1.1.bb +++ b/recipes-kernel/vizzini/vizzini_1.1.bb @@ -3,7 +3,7 @@ PR = "r1.1${KERNEL_MODULE_PACKAGE_SUFFIX}" SRC_URI += "file://xr21v141x-lnx3.10-3.11.tar.gz \ - file://vizzini-1.1-enable-cts.patch \ + file://vizzini-1.1-enable-cts-v2.patch \ file://vizzini-1.1-rs485.patch \ " S = "${WORKDIR}/xr21v141x-lnx3.10-3.11" -- cgit v1.2.3