Commit 77e1251a authored by Inaky Perez-Gonzalez's avatar Inaky Perez-Gonzalez

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: default avatarInaky Perez-Gonzalez <inaky@linux.intel.com>
parent 339ccc36
...@@ -343,7 +343,6 @@ ssize_t i2400m_bm_cmd(struct i2400m *i2400m, ...@@ -343,7 +343,6 @@ ssize_t i2400m_bm_cmd(struct i2400m *i2400m,
BUG_ON(i2400m->boot_mode == 0); BUG_ON(i2400m->boot_mode == 0);
if (cmd != NULL) { /* send the command */ if (cmd != NULL) { /* send the command */
memcpy(i2400m->bm_cmd_buf, cmd, cmd_size);
result = i2400m->bus_bm_cmd_send(i2400m, cmd, cmd_size, flags); result = i2400m->bus_bm_cmd_send(i2400m, cmd, cmd_size, flags);
if (result < 0) if (result < 0)
goto error_cmd_send; goto error_cmd_send;
......
...@@ -118,7 +118,8 @@ ssize_t i2400ms_bus_bm_cmd_send(struct i2400m *i2400m, ...@@ -118,7 +118,8 @@ ssize_t i2400ms_bus_bm_cmd_send(struct i2400m *i2400m,
if (cmd_size > I2400M_BM_CMD_BUF_SIZE) if (cmd_size > I2400M_BM_CMD_BUF_SIZE)
goto error_too_big; goto error_too_big;
memcpy(i2400m->bm_cmd_buf, _cmd, cmd_size); /* Prep command */ if (_cmd != i2400m->bm_cmd_buf)
memmove(i2400m->bm_cmd_buf, _cmd, cmd_size);
cmd = i2400m->bm_cmd_buf; cmd = i2400m->bm_cmd_buf;
if (cmd_size_a > cmd_size) /* Zero pad space */ if (cmd_size_a > cmd_size) /* Zero pad space */
memset(i2400m->bm_cmd_buf + cmd_size, 0, cmd_size_a - cmd_size); memset(i2400m->bm_cmd_buf + cmd_size, 0, cmd_size_a - cmd_size);
......
...@@ -172,7 +172,8 @@ ssize_t i2400mu_bus_bm_cmd_send(struct i2400m *i2400m, ...@@ -172,7 +172,8 @@ ssize_t i2400mu_bus_bm_cmd_send(struct i2400m *i2400m,
result = -E2BIG; result = -E2BIG;
if (cmd_size > I2400M_BM_CMD_BUF_SIZE) if (cmd_size > I2400M_BM_CMD_BUF_SIZE)
goto error_too_big; 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; cmd = i2400m->bm_cmd_buf;
if (cmd_size_a > cmd_size) /* Zero pad space */ if (cmd_size_a > cmd_size) /* Zero pad space */
memset(i2400m->bm_cmd_buf + cmd_size, 0, cmd_size_a - cmd_size); memset(i2400m->bm_cmd_buf + cmd_size, 0, cmd_size_a - cmd_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment