aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can/c_can/c_can.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/can/c_can/c_can.c')
-rw-r--r--drivers/net/can/c_can/c_can.c38
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