]>
Commit | Line | Data |
---|---|---|
79adb0ff GKH |
1 | From 05a974efa4bdf6e2a150e3f27dc6fcf0a9ad5655 Mon Sep 17 00:00:00 2001 |
2 | From: Stefan Schmidt <stefan@osg.samsung.com> | |
3 | Date: Thu, 15 Dec 2016 18:40:14 +0100 | |
4 | Subject: ieee802154: atusb: do not use the stack for buffers to make them DMA able | |
5 | ||
6 | From: Stefan Schmidt <stefan@osg.samsung.com> | |
7 | ||
8 | commit 05a974efa4bdf6e2a150e3f27dc6fcf0a9ad5655 upstream. | |
9 | ||
10 | From 4.9 we should really avoid using the stack here as this will not be DMA | |
11 | able on various platforms. This changes the buffers already being present in | |
12 | time of 4.9 being released. This should go into stable as well. | |
13 | ||
14 | Reported-by: Dan Carpenter <dan.carpenter@oracle.com> | |
15 | Signed-off-by: Stefan Schmidt <stefan@osg.samsung.com> | |
16 | Signed-off-by: Marcel Holtmann <marcel@holtmann.org> | |
17 | Signed-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 |