aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wimax/i2400m/usb-fw.c
diff options
context:
space:
mode:
authorInaky Perez-Gonzalez <inaky@linux.intel.com>2009-08-31 17:15:49 -0700
committerInaky Perez-Gonzalez <inaky@linux.intel.com>2009-10-19 15:55:46 +0900
commit77e1251a7cc64c1e483a31c41c139fdf8121e75e (patch)
tree03f0f2cc77eb0335073c64883c5fd56217219713 /drivers/net/wimax/i2400m/usb-fw.c
parent339ccc362cb60b48e478ff494172efadb385c0ab (diff)
downloadkernel_samsung_aries-77e1251a7cc64c1e483a31c41c139fdf8121e75e.zip
kernel_samsung_aries-77e1251a7cc64c1e483a31c41c139fdf8121e75e.tar.gz
kernel_samsung_aries-77e1251a7cc64c1e483a31c41c139fdf8121e75e.tar.bz2
wimax/i2400m: be smarter about copying command buffer to bm_cmd_buf
Because some underlying bus APIs (like USB) don't like data buffers in the stack or vmalloced areas, the i2400m driver provides a scratch buffer (i2400m->bm_cmd_buf) for said low-level drivers to copy command data to before passing it to said API. This is only used during boot mode. However, at some the code was copying the buffer even when the command was already specified in said buffer. This is ok, but it needs to be more careful. As thus, change so that: (a) the copy happens only if command buffer is not the scratch buffer (b) use memmove() in case there is overlapping Signed-off-by: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Diffstat (limited to 'drivers/net/wimax/i2400m/usb-fw.c')
-rw-r--r--drivers/net/wimax/i2400m/usb-fw.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/net/wimax/i2400m/usb-fw.c b/drivers/net/wimax/i2400m/usb-fw.c
index a2250e4..f162c81 100644
--- a/drivers/net/wimax/i2400m/usb-fw.c
+++ b/drivers/net/wimax/i2400m/usb-fw.c
@@ -172,7 +172,8 @@ ssize_t i2400mu_bus_bm_cmd_send(struct i2400m *i2400m,
result = -E2BIG;
if (cmd_size > I2400M_BM_CMD_BUF_SIZE)
goto error_too_big;
- memcpy(i2400m->bm_cmd_buf, _cmd, cmd_size);
+ if (_cmd != i2400m->bm_cmd_buf)
+ memmove(i2400m->bm_cmd_buf, _cmd, cmd_size);
cmd = i2400m->bm_cmd_buf;
if (cmd_size_a > cmd_size) /* Zero pad space */
memset(i2400m->bm_cmd_buf + cmd_size, 0, cmd_size_a - cmd_size);