can: mcp251xfd: mcp251xfd_tx_obj_from_skb(): don't copy data for RTR CAN frames in TX-path
In Classical CAN there are RTR frames. RTR frames have the RTR bit set, may have a dlc != 0, but contain no data. This patch optimizes the TX-path to not copy any data for RTR frames. Link: https://lore.kernel.org/r/20210114153448.1506901-5-mkl@pengutronix.de Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
Родитель
e20b85c7eb
Коммит
a68eda2036
|
@ -2304,7 +2304,7 @@ mcp251xfd_tx_obj_from_skb(const struct mcp251xfd_priv *priv,
|
|||
union mcp251xfd_tx_obj_load_buf *load_buf;
|
||||
u8 dlc;
|
||||
u32 id, flags;
|
||||
int pad_len, len;
|
||||
int len_sanitized = 0, len;
|
||||
|
||||
if (cfd->can_id & CAN_EFF_FLAG) {
|
||||
u32 sid, eid;
|
||||
|
@ -2331,6 +2331,8 @@ mcp251xfd_tx_obj_from_skb(const struct mcp251xfd_priv *priv,
|
|||
|
||||
if (cfd->can_id & CAN_RTR_FLAG)
|
||||
flags |= MCP251XFD_OBJ_FLAGS_RTR;
|
||||
else
|
||||
len_sanitized = canfd_sanitize_len(cfd->len);
|
||||
|
||||
/* CANFD */
|
||||
if (can_is_canfd_skb(skb)) {
|
||||
|
@ -2356,14 +2358,18 @@ mcp251xfd_tx_obj_from_skb(const struct mcp251xfd_priv *priv,
|
|||
memcpy(hw_tx_obj->data, cfd->data, cfd->len);
|
||||
|
||||
/* Clear unused data at end of CAN frame */
|
||||
pad_len = can_fd_dlc2len(dlc) - cfd->len;
|
||||
if (MCP251XFD_SANITIZE_CAN && pad_len)
|
||||
memset(hw_tx_obj->data + cfd->len, 0x0, pad_len);
|
||||
if (MCP251XFD_SANITIZE_CAN && len_sanitized) {
|
||||
int pad_len;
|
||||
|
||||
pad_len = len_sanitized - cfd->len;
|
||||
if (pad_len)
|
||||
memset(hw_tx_obj->data + cfd->len, 0x0, pad_len);
|
||||
}
|
||||
|
||||
/* Number of bytes to be written into the RAM of the controller */
|
||||
len = sizeof(hw_tx_obj->id) + sizeof(hw_tx_obj->flags);
|
||||
if (MCP251XFD_SANITIZE_CAN)
|
||||
len += round_up(can_fd_dlc2len(dlc), sizeof(u32));
|
||||
len += round_up(len_sanitized, sizeof(u32));
|
||||
else
|
||||
len += round_up(cfd->len, sizeof(u32));
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче