]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/4.4.45/ieee802154-atusb-do-not-use-the-stack-for-buffers-to-make-them-dma-able.patch
4.14-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 4.4.45 / ieee802154-atusb-do-not-use-the-stack-for-buffers-to-make-them-dma-able.patch
CommitLineData
79adb0ff
GKH
1From 05a974efa4bdf6e2a150e3f27dc6fcf0a9ad5655 Mon Sep 17 00:00:00 2001
2From: Stefan Schmidt <stefan@osg.samsung.com>
3Date: Thu, 15 Dec 2016 18:40:14 +0100
4Subject: ieee802154: atusb: do not use the stack for buffers to make them DMA able
5
6From: Stefan Schmidt <stefan@osg.samsung.com>
7
8commit 05a974efa4bdf6e2a150e3f27dc6fcf0a9ad5655 upstream.
9
10From 4.9 we should really avoid using the stack here as this will not be DMA
11able on various platforms. This changes the buffers already being present in
12time of 4.9 being released. This should go into stable as well.
13
14Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
15Signed-off-by: Stefan Schmidt <stefan@osg.samsung.com>
16Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
17Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18
19---
20 drivers/net/ieee802154/atusb.c | 31 +++++++++++++++++++++++++++----
21 1 file changed, 27 insertions(+), 4 deletions(-)
22
23--- a/drivers/net/ieee802154/atusb.c
24+++ b/drivers/net/ieee802154/atusb.c
25@@ -110,13 +110,26 @@ static int atusb_read_reg(struct atusb *
26 {
27 struct usb_device *usb_dev = atusb->usb_dev;
28 int ret;
29+ uint8_t *buffer;
30 uint8_t value;
31
32+ buffer = kmalloc(1, GFP_KERNEL);
33+ if (!buffer)
34+ return -ENOMEM;
35+
36 dev_dbg(&usb_dev->dev, "atusb: reg = 0x%x\n", reg);
37 ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
38 ATUSB_REG_READ, ATUSB_REQ_FROM_DEV,
39- 0, reg, &value, 1, 1000);
40- return ret >= 0 ? value : ret;
41+ 0, reg, buffer, 1, 1000);
42+
43+ if (ret >= 0) {
44+ value = buffer[0];
45+ kfree(buffer);
46+ return value;
47+ } else {
48+ kfree(buffer);
49+ return ret;
50+ }
51 }
52
53 static int atusb_write_subreg(struct atusb *atusb, uint8_t reg, uint8_t mask,
54@@ -517,9 +530,13 @@ static struct ieee802154_ops atusb_ops =
55 static int atusb_get_and_show_revision(struct atusb *atusb)
56 {
57 struct usb_device *usb_dev = atusb->usb_dev;
58- unsigned char buffer[3];
59+ unsigned char *buffer;
60 int ret;
61
62+ buffer = kmalloc(3, GFP_KERNEL);
63+ if (!buffer)
64+ return -ENOMEM;
65+
66 /* Get a couple of the ATMega Firmware values */
67 ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
68 ATUSB_ID, ATUSB_REQ_FROM_DEV, 0, 0,
69@@ -535,15 +552,20 @@ static int atusb_get_and_show_revision(s
70 dev_info(&usb_dev->dev, "Please update to version 0.2 or newer");
71 }
72
73+ kfree(buffer);
74 return ret;
75 }
76
77 static int atusb_get_and_show_build(struct atusb *atusb)
78 {
79 struct usb_device *usb_dev = atusb->usb_dev;
80- char build[ATUSB_BUILD_SIZE + 1];
81+ char *build;
82 int ret;
83
84+ build = kmalloc(ATUSB_BUILD_SIZE + 1, GFP_KERNEL);
85+ if (!build)
86+ return -ENOMEM;
87+
88 ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
89 ATUSB_BUILD, ATUSB_REQ_FROM_DEV, 0, 0,
90 build, ATUSB_BUILD_SIZE, 1000);
91@@ -552,6 +574,7 @@ static int atusb_get_and_show_build(stru
92 dev_info(&usb_dev->dev, "Firmware: build %s\n", build);
93 }
94
95+ kfree(build);
96 return ret;
97 }
98