|
@@ -261,11 +261,13 @@ static netdev_tx_t mscan_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
void __iomem *data = ®s->tx.dsr1_0;
|
|
|
u16 *payload = (u16 *)frame->data;
|
|
|
|
|
|
- /* It is safe to write into dsr[dlc+1] */
|
|
|
- for (i = 0; i < (frame->can_dlc + 1) / 2; i++) {
|
|
|
+ for (i = 0; i < frame->can_dlc / 2; i++) {
|
|
|
out_be16(data, *payload++);
|
|
|
data += 2 + _MSCAN_RESERVED_DSR_SIZE;
|
|
|
}
|
|
|
+ /* write remaining byte if necessary */
|
|
|
+ if (frame->can_dlc & 1)
|
|
|
+ out_8(data, frame->data[frame->can_dlc - 1]);
|
|
|
}
|
|
|
|
|
|
out_8(®s->tx.dlr, frame->can_dlc);
|
|
@@ -330,10 +332,13 @@ static void mscan_get_rx_frame(struct net_device *dev, struct can_frame *frame)
|
|
|
void __iomem *data = ®s->rx.dsr1_0;
|
|
|
u16 *payload = (u16 *)frame->data;
|
|
|
|
|
|
- for (i = 0; i < (frame->can_dlc + 1) / 2; i++) {
|
|
|
+ for (i = 0; i < frame->can_dlc / 2; i++) {
|
|
|
*payload++ = in_be16(data);
|
|
|
data += 2 + _MSCAN_RESERVED_DSR_SIZE;
|
|
|
}
|
|
|
+ /* read remaining byte if necessary */
|
|
|
+ if (frame->can_dlc & 1)
|
|
|
+ frame->data[frame->can_dlc - 1] = in_8(data);
|
|
|
}
|
|
|
|
|
|
out_8(®s->canrflg, MSCAN_RXF);
|