Skip to content

Commit 05a974e

Browse files
Stefan Schmidtholtmann
authored andcommitted
ieee802154: atusb: do not use the stack for buffers to make them DMA able
From 4.9 we should really avoid using the stack here as this will not be DMA able on various platforms. This changes the buffers already being present in time of 4.9 being released. This should go into stable as well. Reported-by: Dan Carpenter <[email protected]> Cc: [email protected] Signed-off-by: Stefan Schmidt <[email protected]> Signed-off-by: Marcel Holtmann <[email protected]>
1 parent 8a430ed commit 05a974e

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

drivers/net/ieee802154/atusb.c

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,26 @@ static int atusb_read_reg(struct atusb *atusb, uint8_t reg)
117117
{
118118
struct usb_device *usb_dev = atusb->usb_dev;
119119
int ret;
120+
uint8_t *buffer;
120121
uint8_t value;
121122

123+
buffer = kmalloc(1, GFP_KERNEL);
124+
if (!buffer)
125+
return -ENOMEM;
126+
122127
dev_dbg(&usb_dev->dev, "atusb: reg = 0x%x\n", reg);
123128
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
124129
ATUSB_REG_READ, ATUSB_REQ_FROM_DEV,
125-
0, reg, &value, 1, 1000);
126-
return ret >= 0 ? value : ret;
130+
0, reg, buffer, 1, 1000);
131+
132+
if (ret >= 0) {
133+
value = buffer[0];
134+
kfree(buffer);
135+
return value;
136+
} else {
137+
kfree(buffer);
138+
return ret;
139+
}
127140
}
128141

129142
static int atusb_write_subreg(struct atusb *atusb, uint8_t reg, uint8_t mask,
@@ -608,9 +621,13 @@ static const struct ieee802154_ops atusb_ops = {
608621
static int atusb_get_and_show_revision(struct atusb *atusb)
609622
{
610623
struct usb_device *usb_dev = atusb->usb_dev;
611-
unsigned char buffer[3];
624+
unsigned char *buffer;
612625
int ret;
613626

627+
buffer = kmalloc(3, GFP_KERNEL);
628+
if (!buffer)
629+
return -ENOMEM;
630+
614631
/* Get a couple of the ATMega Firmware values */
615632
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
616633
ATUSB_ID, ATUSB_REQ_FROM_DEV, 0, 0,
@@ -631,15 +648,20 @@ static int atusb_get_and_show_revision(struct atusb *atusb)
631648
dev_info(&usb_dev->dev, "Please update to version 0.2 or newer");
632649
}
633650

651+
kfree(buffer);
634652
return ret;
635653
}
636654

637655
static int atusb_get_and_show_build(struct atusb *atusb)
638656
{
639657
struct usb_device *usb_dev = atusb->usb_dev;
640-
char build[ATUSB_BUILD_SIZE + 1];
658+
char *build;
641659
int ret;
642660

661+
build = kmalloc(ATUSB_BUILD_SIZE + 1, GFP_KERNEL);
662+
if (!build)
663+
return -ENOMEM;
664+
643665
ret = atusb_control_msg(atusb, usb_rcvctrlpipe(usb_dev, 0),
644666
ATUSB_BUILD, ATUSB_REQ_FROM_DEV, 0, 0,
645667
build, ATUSB_BUILD_SIZE, 1000);
@@ -648,6 +670,7 @@ static int atusb_get_and_show_build(struct atusb *atusb)
648670
dev_info(&usb_dev->dev, "Firmware: build %s\n", build);
649671
}
650672

673+
kfree(build);
651674
return ret;
652675
}
653676

0 commit comments

Comments
 (0)