diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-07-04 11:19:21 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-07-04 11:19:21 -0400 |
commit | c318a821b9828ef3be97d5d896d146e7daa43c86 (patch) | |
tree | 7ed40911ffebcbabf87ec4be692f6fb154053687 /drivers/net/can/c_can/c_can.c | |
parent | 322832f2f19e04c866a0ce4bdac8cff8e695f2b3 (diff) | |
parent | a99cde438de0c4c0cecc1d1af1a55a75b10bfdef (diff) |
Merge 4.7-rc6 into usb-next
We want the USB fixes in here as well.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/net/can/c_can/c_can.c')
-rw-r--r-- | drivers/net/can/c_can/c_can.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c index f91b094288da..e3dccd3200d5 100644 --- a/drivers/net/can/c_can/c_can.c +++ b/drivers/net/can/c_can/c_can.c | |||
@@ -332,9 +332,23 @@ static void c_can_setup_tx_object(struct net_device *dev, int iface, | |||
332 | 332 | ||
333 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); | 333 | priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); |
334 | 334 | ||
335 | for (i = 0; i < frame->can_dlc; i += 2) { | 335 | if (priv->type == BOSCH_D_CAN) { |
336 | priv->write_reg(priv, C_CAN_IFACE(DATA1_REG, iface) + i / 2, | 336 | u32 data = 0, dreg = C_CAN_IFACE(DATA1_REG, iface); |
337 | frame->data[i] | (frame->data[i + 1] << 8)); | 337 | |
338 | for (i = 0; i < frame->can_dlc; i += 4, dreg += 2) { | ||
339 | data = (u32)frame->data[i]; | ||
340 | data |= (u32)frame->data[i + 1] << 8; | ||
341 | data |= (u32)frame->data[i + 2] << 16; | ||
342 | data |= (u32)frame->data[i + 3] << 24; | ||
343 | priv->write_reg32(priv, dreg, data); | ||
344 | } | ||
345 | } else { | ||
346 | for (i = 0; i < frame->can_dlc; i += 2) { | ||
347 | priv->write_reg(priv, | ||
348 | C_CAN_IFACE(DATA1_REG, iface) + i / 2, | ||
349 | frame->data[i] | | ||
350 | (frame->data[i + 1] << 8)); | ||
351 | } | ||
338 | } | 352 | } |
339 | } | 353 | } |
340 | 354 | ||
@@ -402,10 +416,20 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl) | |||
402 | } else { | 416 | } else { |
403 | int i, dreg = C_CAN_IFACE(DATA1_REG, iface); | 417 | int i, dreg = C_CAN_IFACE(DATA1_REG, iface); |
404 | 418 | ||
405 | for (i = 0; i < frame->can_dlc; i += 2, dreg ++) { | 419 | if (priv->type == BOSCH_D_CAN) { |
406 | data = priv->read_reg(priv, dreg); | 420 | for (i = 0; i < frame->can_dlc; i += 4, dreg += 2) { |
407 | frame->data[i] = data; | 421 | data = priv->read_reg32(priv, dreg); |
408 | frame->data[i + 1] = data >> 8; | 422 | frame->data[i] = data; |
423 | frame->data[i + 1] = data >> 8; | ||
424 | frame->data[i + 2] = data >> 16; | ||
425 | frame->data[i + 3] = data >> 24; | ||
426 | } | ||
427 | } else { | ||
428 | for (i = 0; i < frame->can_dlc; i += 2, dreg++) { | ||
429 | data = priv->read_reg(priv, dreg); | ||
430 | frame->data[i] = data; | ||
431 | frame->data[i + 1] = data >> 8; | ||
432 | } | ||
409 | } | 433 | } |
410 | } | 434 | } |
411 | 435 | ||