diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-04-27 21:11:34 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2019-04-27 21:11:34 +0200 |
commit | 4d4357208d15652015d1621af184be730441211b (patch) | |
tree | e23fd05d2c5cabd8baa3193dd6e1e8d2188b2e94 | |
parent | 271d32f594e2ac1619843d3de67ae5497be8d978 (diff) | |
download | patches-4d4357208d15652015d1621af184be730441211b.tar.gz |
line6 patch
-rw-r--r-- | 0003-toneport-fixes.patch | 61 | ||||
-rw-r--r-- | series | 3 | ||||
-rw-r--r-- | usb-line6.patch | 282 |
3 files changed, 284 insertions, 62 deletions
diff --git a/0003-toneport-fixes.patch b/0003-toneport-fixes.patch deleted file mode 100644 index 4bc8ab38570295..00000000000000 --- a/0003-toneport-fixes.patch +++ /dev/null @@ -1,61 +0,0 @@ -From e2c743d1f900135c3e560cd9ea1647e4a1ebce7a Mon Sep 17 00:00:00 2001 -From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -Date: Wed, 23 Jan 2019 11:01:46 +0100 -Subject: [PATCH 3/3] toneport fixes - ---- - sound/usb/line6/toneport.c | 23 +++++++++++++++++------ - 1 file changed, 17 insertions(+), 6 deletions(-) - ---- a/sound/usb/line6/toneport.c -+++ b/sound/usb/line6/toneport.c -@@ -365,16 +365,21 @@ static bool toneport_has_source_select(s - /* - Setup Toneport device. - */ --static void toneport_setup(struct usb_line6_toneport *toneport) -+static int toneport_setup(struct usb_line6_toneport *toneport) - { -- u32 ticks; -+ u32 *ticks; - struct usb_line6 *line6 = &toneport->line6; - struct usb_device *usbdev = line6->usbdev; - -+ ticks = kmalloc(sizeof(*ticks), GFP_KERNEL); -+ if (!ticks) -+ return -ENOMEM; -+ - /* sync time on device with host: */ - /* note: 32-bit timestamps overflow in year 2106 */ -- ticks = (u32)ktime_get_real_seconds(); -- line6_write_data(line6, 0x80c6, &ticks, 4); -+ *ticks = (u32)ktime_get_real_seconds(); -+ line6_write_data(line6, 0x80c6, ticks, 4); -+ kfree(ticks); - - /* enable device: */ - toneport_send_cmd(usbdev, 0x0301, 0x0000); -@@ -451,7 +456,9 @@ static int toneport_init(struct usb_line - return err; - } - -- toneport_setup(toneport); -+ err = toneport_setup(toneport); -+ if (err) -+ return err; - - /* register audio system: */ - return snd_card_register(line6->card); -@@ -463,7 +470,11 @@ static int toneport_init(struct usb_line - */ - static int toneport_reset_resume(struct usb_interface *interface) - { -- toneport_setup(usb_get_intfdata(interface)); -+ int err; -+ -+ err = toneport_setup(usb_get_intfdata(interface)); -+ if (err) -+ return err; - return line6_resume(interface); - } - #endif @@ -1,8 +1,9 @@ # +l.patch iwlwifi-properly-check-debugfs-dentry-before-using-it.patch +usb-line6.patch usb-usb.h-tweak-struct-urb-to-remove-wasted-space.patch -0003-toneport-fixes.patch spdxcheck-print-out-files-without-any-spdx-lines.patch p02 p04 diff --git a/usb-line6.patch b/usb-line6.patch new file mode 100644 index 00000000000000..83c74b88adbdbc --- /dev/null +++ b/usb-line6.patch @@ -0,0 +1,282 @@ +From e2c743d1f900135c3e560cd9ea1647e4a1ebce7a Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Date: Wed, 23 Jan 2019 11:01:46 +0100 +Subject: [PATCH] sound: USB: line6: use dynamic buffers + +The line6 driver uses a lot of USB buffers off of the stack, which is +not allowed on many systems. Fix this up by dynamically allocating the +buffers with kmalloc() which allows for proper DMA-able memory. + +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +Cc: stable <stable@vger.kernel.org> + +--- + sound/usb/line6/driver.c | 60 ++++++++++++++++++++++++++------------------- + sound/usb/line6/podhd.c | 21 +++++++++------ + sound/usb/line6/toneport.c | 23 ++++++++++++----- + 3 files changed, 64 insertions(+), 40 deletions(-) + +--- a/sound/usb/line6/driver.c ++++ b/sound/usb/line6/driver.c +@@ -351,12 +351,16 @@ int line6_read_data(struct usb_line6 *li + { + struct usb_device *usbdev = line6->usbdev; + int ret; +- unsigned char len; ++ unsigned char *len; + unsigned count; + + if (address > 0xffff || datalen > 0xff) + return -EINVAL; + ++ len = kmalloc(sizeof(*len), GFP_KERNEL); ++ if (!len) ++ return -ENOMEM; ++ + /* query the serial number: */ + ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, +@@ -365,7 +369,7 @@ int line6_read_data(struct usb_line6 *li + + if (ret < 0) { + dev_err(line6->ifcdev, "read request failed (error %d)\n", ret); +- return ret; ++ goto exit; + } + + /* Wait for data length. We'll get 0xff until length arrives. */ +@@ -375,28 +379,29 @@ int line6_read_data(struct usb_line6 *li + ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | + USB_DIR_IN, +- 0x0012, 0x0000, &len, 1, ++ 0x0012, 0x0000, len, 1, + LINE6_TIMEOUT * HZ); + if (ret < 0) { + dev_err(line6->ifcdev, + "receive length failed (error %d)\n", ret); +- return ret; ++ goto exit; + } + +- if (len != 0xff) ++ if (*len != 0xff) + break; + } + +- if (len == 0xff) { ++ ret = -EIO; ++ if (*len == 0xff) { + dev_err(line6->ifcdev, "read failed after %d retries\n", + count); +- return -EIO; +- } else if (len != datalen) { ++ goto exit; ++ } else if (*len != datalen) { + /* should be equal or something went wrong */ + dev_err(line6->ifcdev, + "length mismatch (expected %d, got %d)\n", +- (int)datalen, (int)len); +- return -EIO; ++ (int)datalen, (int)*len); ++ goto exit; + } + + /* receive the result: */ +@@ -405,12 +410,12 @@ int line6_read_data(struct usb_line6 *li + 0x0013, 0x0000, data, datalen, + LINE6_TIMEOUT * HZ); + +- if (ret < 0) { ++ if (ret < 0) + dev_err(line6->ifcdev, "read failed (error %d)\n", ret); +- return ret; +- } + +- return 0; ++exit: ++ kfree(len); ++ return ret; + } + EXPORT_SYMBOL_GPL(line6_read_data); + +@@ -422,12 +427,16 @@ int line6_write_data(struct usb_line6 *l + { + struct usb_device *usbdev = line6->usbdev; + int ret; +- unsigned char status; ++ unsigned char *status; + int count; + + if (address > 0xffff || datalen > 0xffff) + return -EINVAL; + ++ status = kmalloc(sizeof(*status), GFP_KERNEL); ++ if (!status) ++ return -ENOMEM; ++ + ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, + 0x0022, address, data, datalen, +@@ -436,7 +445,7 @@ int line6_write_data(struct usb_line6 *l + if (ret < 0) { + dev_err(line6->ifcdev, + "write request failed (error %d)\n", ret); +- return ret; ++ goto exit; + } + + for (count = 0; count < LINE6_READ_WRITE_MAX_RETRIES; count++) { +@@ -447,28 +456,29 @@ int line6_write_data(struct usb_line6 *l + USB_TYPE_VENDOR | USB_RECIP_DEVICE | + USB_DIR_IN, + 0x0012, 0x0000, +- &status, 1, LINE6_TIMEOUT * HZ); ++ status, 1, LINE6_TIMEOUT * HZ); + + if (ret < 0) { + dev_err(line6->ifcdev, + "receiving status failed (error %d)\n", ret); +- return ret; ++ goto exit; + } + +- if (status != 0xff) ++ if (*status != 0xff) + break; + } + +- if (status == 0xff) { ++ if (*status == 0xff) { + dev_err(line6->ifcdev, "write failed after %d retries\n", + count); +- return -EIO; +- } else if (status != 0) { ++ ret = -EIO; ++ } else if (*status != 0) { + dev_err(line6->ifcdev, "write failed (error %d)\n", ret); +- return -EIO; ++ ret = -EIO; + } +- +- return 0; ++exit: ++ kfree(status); ++ return ret; + } + EXPORT_SYMBOL_GPL(line6_write_data); + +--- a/sound/usb/line6/podhd.c ++++ b/sound/usb/line6/podhd.c +@@ -225,28 +225,32 @@ static void podhd_startup_start_workqueu + static int podhd_dev_start(struct usb_line6_podhd *pod) + { + int ret; +- u8 init_bytes[8]; ++ u8 *init_bytes; + int i; + struct usb_device *usbdev = pod->line6.usbdev; + ++ init_bytes = kmalloc(8, GFP_KERNEL); ++ if (!init_bytes) ++ return -ENOMEM; ++ + ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), + 0x67, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_OUT, + 0x11, 0, + NULL, 0, LINE6_TIMEOUT * HZ); + if (ret < 0) { + dev_err(pod->line6.ifcdev, "read request failed (error %d)\n", ret); +- return ret; ++ goto exit; + } + + /* NOTE: looks like some kind of ping message */ + ret = usb_control_msg(usbdev, usb_rcvctrlpipe(usbdev, 0), 0x67, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_DIR_IN, + 0x11, 0x0, +- &init_bytes, 3, LINE6_TIMEOUT * HZ); ++ init_bytes, 3, LINE6_TIMEOUT * HZ); + if (ret < 0) { + dev_err(pod->line6.ifcdev, + "receive length failed (error %d)\n", ret); +- return ret; ++ goto exit; + } + + pod->firmware_version = +@@ -255,7 +259,7 @@ static int podhd_dev_start(struct usb_li + for (i = 0; i <= 16; i++) { + ret = line6_read_data(&pod->line6, 0xf000 + 0x08 * i, init_bytes, 8); + if (ret < 0) +- return ret; ++ goto exit; + } + + ret = usb_control_msg(usbdev, usb_sndctrlpipe(usbdev, 0), +@@ -263,10 +267,9 @@ static int podhd_dev_start(struct usb_li + USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_DIR_OUT, + 1, 0, + NULL, 0, LINE6_TIMEOUT * HZ); +- if (ret < 0) +- return ret; +- +- return 0; ++exit: ++ kfree(init_bytes); ++ return ret; + } + + static void podhd_startup_workqueue(struct work_struct *work) +--- a/sound/usb/line6/toneport.c ++++ b/sound/usb/line6/toneport.c +@@ -365,16 +365,21 @@ static bool toneport_has_source_select(s + /* + Setup Toneport device. + */ +-static void toneport_setup(struct usb_line6_toneport *toneport) ++static int toneport_setup(struct usb_line6_toneport *toneport) + { +- u32 ticks; ++ u32 *ticks; + struct usb_line6 *line6 = &toneport->line6; + struct usb_device *usbdev = line6->usbdev; + ++ ticks = kmalloc(sizeof(*ticks), GFP_KERNEL); ++ if (!ticks) ++ return -ENOMEM; ++ + /* sync time on device with host: */ + /* note: 32-bit timestamps overflow in year 2106 */ +- ticks = (u32)ktime_get_real_seconds(); +- line6_write_data(line6, 0x80c6, &ticks, 4); ++ *ticks = (u32)ktime_get_real_seconds(); ++ line6_write_data(line6, 0x80c6, ticks, 4); ++ kfree(ticks); + + /* enable device: */ + toneport_send_cmd(usbdev, 0x0301, 0x0000); +@@ -451,7 +456,9 @@ static int toneport_init(struct usb_line + return err; + } + +- toneport_setup(toneport); ++ err = toneport_setup(toneport); ++ if (err) ++ return err; + + /* register audio system: */ + return snd_card_register(line6->card); +@@ -463,7 +470,11 @@ static int toneport_init(struct usb_line + */ + static int toneport_reset_resume(struct usb_interface *interface) + { +- toneport_setup(usb_get_intfdata(interface)); ++ int err; ++ ++ err = toneport_setup(usb_get_intfdata(interface)); ++ if (err) ++ return err; + return line6_resume(interface); + } + #endif |