diff options
Diffstat (limited to 'drivers/net/can/mscan/mscan.c')
| -rw-r--r-- | drivers/net/can/mscan/mscan.c | 11 | 
1 files changed, 8 insertions, 3 deletions
diff --git a/drivers/net/can/mscan/mscan.c b/drivers/net/can/mscan/mscan.c index 92feac68b66..4cc6f44c2ba 100644 --- a/drivers/net/can/mscan/mscan.c +++ b/drivers/net/can/mscan/mscan.c @@ -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);  |