Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'linux-can-next-for-5.12-20210127' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next

Marc Kleine-Budde says:

====================
pull-request: can-next 2021-01-27

The first two patches are by me and fix typos on the CAN gw protocol and the
flexcan driver.

The next patch is by Vincent Mailhol and targets the CAN driver infrastructure,
it exports the function that converts the CAN state into a human readable
string.

A patch by me, which target the CAN driver infrastructure, too, makes the
calculation in can_fd_len2dlc() more readable.

A patch by Tom Rix fixes a checkpatch warning in the mcba_usb driver.

The next seven patches target the mcp251xfd driver. Su Yanjun's patch replaces
several hardcoded assumptions when calling regmap, by using
regmap_get_val_bytes(). The remaining patches are by me. First an open coded
check is replaced by an existing helper function, then in the TX path the
padding for CAN-FD frames is cleaned up. The next two patches clean up the RTR
frame handling in the RX and TX path. Then support for len8_dlc is added. The
last patch adds BQL support.

* tag 'linux-can-next-for-5.12-20210127' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next:
can: mcp251xfd: add BQL support
can: mcp251xfd: add len8_dlc support
can: mcp251xfd: mcp251xfd_tx_obj_from_skb(): don't copy data for RTR CAN frames in TX-path
can: mcp251xfd: mcp251xfd_hw_rx_obj_to_skb(): don't copy data for RTR CAN frames in RX-path
can: mcp251xfd: mcp251xfd_tx_obj_from_skb(): clean up padding of CAN-FD frames
can: mcp251xfd: mcp251xfd_start_xmit(): use mcp251xfd_get_tx_free() to check TX is is full
can: mcp251xfd: replace sizeof(u32) with val_bytes in regmap
can: mcba_usb: remove h from printk format specifier
can: length: can_fd_len2dlc(): make legnth calculation readable again
can: dev: export can_get_state_str() function
can: flexcan: fix typos
can: gw: fix typo
====================

Link: https://lore.kernel.org/r/20210127092227.2775573-1-mkl@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+70 -32
+2 -1
drivers/net/can/dev/dev.c
··· 74 74 } 75 75 } 76 76 77 - static const char *can_get_state_str(const enum can_state state) 77 + const char *can_get_state_str(const enum can_state state) 78 78 { 79 79 switch (state) { 80 80 case CAN_STATE_ERROR_ACTIVE: ··· 95 95 96 96 return "<unknown>"; 97 97 } 98 + EXPORT_SYMBOL_GPL(can_get_state_str); 98 99 99 100 void can_change_state(struct net_device *dev, struct can_frame *cf, 100 101 enum can_state tx_state, enum can_state rx_state)
+6 -1
drivers/net/can/dev/length.c
··· 27 27 13, 13, 13, 13, 13, 13, 13, 13, /* 25 - 32 */ 28 28 14, 14, 14, 14, 14, 14, 14, 14, /* 33 - 40 */ 29 29 14, 14, 14, 14, 14, 14, 14, 14, /* 41 - 48 */ 30 + 15, 15, 15, 15, 15, 15, 15, 15, /* 49 - 56 */ 31 + 15, 15, 15, 15, 15, 15, 15, 15 /* 57 - 64 */ 30 32 }; 31 33 32 34 /* map the sanitized data length to an appropriate data length code */ 33 35 u8 can_fd_len2dlc(u8 len) 34 36 { 35 - if (len >= ARRAY_SIZE(len2dlc)) 37 + /* check for length mapping table size at build time */ 38 + BUILD_BUG_ON(ARRAY_SIZE(len2dlc) != CANFD_MAX_DLEN + 1); 39 + 40 + if (unlikely(len > CANFD_MAX_DLEN)) 36 41 return CANFD_MAX_DLC; 37 42 38 43 return len2dlc[len];
+2 -2
drivers/net/can/flexcan.c
··· 1975 1975 priv = netdev_priv(dev); 1976 1976 priv->scu_idx = scu_idx; 1977 1977 1978 - /* this function could be defered probe, return -EPROBE_DEFER */ 1978 + /* this function could be deferred probe, return -EPROBE_DEFER */ 1979 1979 return imx_scu_get_handle(&priv->sc_ipc_handle); 1980 1980 } 1981 1981 1982 1982 /* flexcan_setup_stop_mode - Setup stop mode for wakeup 1983 1983 * 1984 1984 * Return: = 0 setup stop mode successfully or doesn't support this feature 1985 - * < 0 fail to setup stop mode (could be defered probe) 1985 + * < 0 fail to setup stop mode (could be deferred probe) 1986 1986 */ 1987 1987 static int flexcan_setup_stop_mode(struct platform_device *pdev) 1988 1988 {
+55 -24
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
··· 335 335 u8 len; 336 336 int i, j; 337 337 338 + netdev_reset_queue(priv->ndev); 339 + 338 340 /* TEF */ 339 341 tef_ring = priv->tef; 340 342 tef_ring->head = 0; ··· 1251 1249 1252 1250 static int 1253 1251 mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv, 1254 - const struct mcp251xfd_hw_tef_obj *hw_tef_obj) 1252 + const struct mcp251xfd_hw_tef_obj *hw_tef_obj, 1253 + unsigned int *frame_len_ptr) 1255 1254 { 1256 1255 struct net_device_stats *stats = &priv->ndev->stats; 1257 1256 u32 seq, seq_masked, tef_tail_masked; ··· 1274 1271 stats->tx_bytes += 1275 1272 can_rx_offload_get_echo_skb(&priv->offload, 1276 1273 mcp251xfd_get_tef_tail(priv), 1277 - hw_tef_obj->ts, NULL); 1274 + hw_tef_obj->ts, 1275 + frame_len_ptr); 1278 1276 stats->tx_packets++; 1279 1277 priv->tef->tail++; 1280 1278 ··· 1312 1308 const u8 offset, const u8 len) 1313 1309 { 1314 1310 const struct mcp251xfd_tx_ring *tx_ring = priv->tx; 1311 + const int val_bytes = regmap_get_val_bytes(priv->map_rx); 1315 1312 1316 1313 if (IS_ENABLED(CONFIG_CAN_MCP251XFD_SANITY) && 1317 1314 (offset > tx_ring->obj_num || ··· 1327 1322 return regmap_bulk_read(priv->map_rx, 1328 1323 mcp251xfd_get_tef_obj_addr(offset), 1329 1324 hw_tef_obj, 1330 - sizeof(*hw_tef_obj) / sizeof(u32) * len); 1325 + sizeof(*hw_tef_obj) / val_bytes * len); 1331 1326 } 1332 1327 1333 1328 static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv) 1334 1329 { 1335 1330 struct mcp251xfd_hw_tef_obj hw_tef_obj[MCP251XFD_TX_OBJ_NUM_MAX]; 1331 + unsigned int total_frame_len = 0; 1336 1332 u8 tef_tail, len, l; 1337 1333 int err, i; 1338 1334 ··· 1355 1349 } 1356 1350 1357 1351 for (i = 0; i < len; i++) { 1358 - err = mcp251xfd_handle_tefif_one(priv, &hw_tef_obj[i]); 1352 + unsigned int frame_len; 1353 + 1354 + err = mcp251xfd_handle_tefif_one(priv, &hw_tef_obj[i], &frame_len); 1359 1355 /* -EAGAIN means the Sequence Number in the TEF 1360 1356 * doesn't match our tef_tail. This can happen if we 1361 1357 * read the TEF objects too early. Leave loop let the ··· 1367 1359 goto out_netif_wake_queue; 1368 1360 if (err) 1369 1361 return err; 1362 + 1363 + total_frame_len += frame_len; 1370 1364 } 1371 1365 1372 1366 out_netif_wake_queue: ··· 1399 1389 return err; 1400 1390 1401 1391 tx_ring->tail += len; 1392 + netdev_completed_queue(priv->ndev, len, total_frame_len); 1402 1393 1403 1394 err = mcp251xfd_check_tef_tail(priv); 1404 1395 if (err) ··· 1449 1438 struct sk_buff *skb) 1450 1439 { 1451 1440 struct canfd_frame *cfd = (struct canfd_frame *)skb->data; 1441 + u8 dlc; 1452 1442 1453 1443 if (hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_IDE) { 1454 1444 u32 sid, eid; ··· 1465 1453 hw_rx_obj->id); 1466 1454 } 1467 1455 1456 + dlc = FIELD_GET(MCP251XFD_OBJ_FLAGS_DLC, hw_rx_obj->flags); 1457 + 1468 1458 /* CANFD */ 1469 1459 if (hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_FDF) { 1470 - u8 dlc; 1471 1460 1472 1461 if (hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_ESI) 1473 1462 cfd->flags |= CANFD_ESI; ··· 1476 1463 if (hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_BRS) 1477 1464 cfd->flags |= CANFD_BRS; 1478 1465 1479 - dlc = FIELD_GET(MCP251XFD_OBJ_FLAGS_DLC, hw_rx_obj->flags); 1480 1466 cfd->len = can_fd_dlc2len(dlc); 1481 1467 } else { 1482 1468 if (hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_RTR) 1483 1469 cfd->can_id |= CAN_RTR_FLAG; 1484 1470 1485 - cfd->len = can_cc_dlc2len(FIELD_GET(MCP251XFD_OBJ_FLAGS_DLC, 1486 - hw_rx_obj->flags)); 1471 + can_frame_set_cc_len((struct can_frame *)cfd, dlc, 1472 + priv->can.ctrlmode); 1487 1473 } 1488 1474 1489 - memcpy(cfd->data, hw_rx_obj->data, cfd->len); 1475 + if (!(hw_rx_obj->flags & MCP251XFD_OBJ_FLAGS_RTR)) 1476 + memcpy(cfd->data, hw_rx_obj->data, cfd->len); 1490 1477 } 1491 1478 1492 1479 static int ··· 1523 1510 struct mcp251xfd_hw_rx_obj_canfd *hw_rx_obj, 1524 1511 const u8 offset, const u8 len) 1525 1512 { 1513 + const int val_bytes = regmap_get_val_bytes(priv->map_rx); 1526 1514 int err; 1527 1515 1528 1516 err = regmap_bulk_read(priv->map_rx, 1529 1517 mcp251xfd_get_rx_obj_addr(ring, offset), 1530 1518 hw_rx_obj, 1531 - len * ring->obj_size / sizeof(u32)); 1519 + len * ring->obj_size / val_bytes); 1532 1520 1533 1521 return err; 1534 1522 } ··· 2151 2137 static irqreturn_t mcp251xfd_irq(int irq, void *dev_id) 2152 2138 { 2153 2139 struct mcp251xfd_priv *priv = dev_id; 2140 + const int val_bytes = regmap_get_val_bytes(priv->map_reg); 2154 2141 irqreturn_t handled = IRQ_NONE; 2155 2142 int err; 2156 2143 ··· 2177 2162 err = regmap_bulk_read(priv->map_reg, MCP251XFD_REG_INT, 2178 2163 &priv->regs_status, 2179 2164 sizeof(priv->regs_status) / 2180 - sizeof(u32)); 2165 + val_bytes); 2181 2166 if (err) 2182 2167 goto out_fail; 2183 2168 ··· 2315 2300 union mcp251xfd_tx_obj_load_buf *load_buf; 2316 2301 u8 dlc; 2317 2302 u32 id, flags; 2318 - int offset, len; 2303 + int len_sanitized = 0, len; 2319 2304 2320 2305 if (cfd->can_id & CAN_EFF_FLAG) { 2321 2306 u32 sid, eid; ··· 2336 2321 * harm, only the lower 7 bits will be transferred into the 2337 2322 * TEF object. 2338 2323 */ 2339 - dlc = can_fd_len2dlc(cfd->len); 2340 - flags |= FIELD_PREP(MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK, seq) | 2341 - FIELD_PREP(MCP251XFD_OBJ_FLAGS_DLC, dlc); 2324 + flags |= FIELD_PREP(MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK, seq); 2342 2325 2343 2326 if (cfd->can_id & CAN_RTR_FLAG) 2344 2327 flags |= MCP251XFD_OBJ_FLAGS_RTR; 2328 + else 2329 + len_sanitized = canfd_sanitize_len(cfd->len); 2345 2330 2346 2331 /* CANFD */ 2347 2332 if (can_is_canfd_skb(skb)) { ··· 2352 2337 2353 2338 if (cfd->flags & CANFD_BRS) 2354 2339 flags |= MCP251XFD_OBJ_FLAGS_BRS; 2340 + 2341 + dlc = can_fd_len2dlc(cfd->len); 2342 + } else { 2343 + dlc = can_get_cc_dlc((struct can_frame *)cfd, 2344 + priv->can.ctrlmode); 2355 2345 } 2346 + 2347 + flags |= FIELD_PREP(MCP251XFD_OBJ_FLAGS_DLC, dlc); 2356 2348 2357 2349 load_buf = &tx_obj->buf; 2358 2350 if (priv->devtype_data.quirks & MCP251XFD_QUIRK_CRC_TX) ··· 2370 2348 put_unaligned_le32(id, &hw_tx_obj->id); 2371 2349 put_unaligned_le32(flags, &hw_tx_obj->flags); 2372 2350 2373 - /* Clear data at end of CAN frame */ 2374 - offset = round_down(cfd->len, sizeof(u32)); 2375 - len = round_up(can_fd_dlc2len(dlc), sizeof(u32)) - offset; 2376 - if (MCP251XFD_SANITIZE_CAN && len) 2377 - memset(hw_tx_obj->data + offset, 0x0, len); 2351 + /* Copy data */ 2378 2352 memcpy(hw_tx_obj->data, cfd->data, cfd->len); 2353 + 2354 + /* Clear unused data at end of CAN frame */ 2355 + if (MCP251XFD_SANITIZE_CAN && len_sanitized) { 2356 + int pad_len; 2357 + 2358 + pad_len = len_sanitized - cfd->len; 2359 + if (pad_len) 2360 + memset(hw_tx_obj->data + cfd->len, 0x0, pad_len); 2361 + } 2379 2362 2380 2363 /* Number of bytes to be written into the RAM of the controller */ 2381 2364 len = sizeof(hw_tx_obj->id) + sizeof(hw_tx_obj->flags); 2382 2365 if (MCP251XFD_SANITIZE_CAN) 2383 - len += round_up(can_fd_dlc2len(dlc), sizeof(u32)); 2366 + len += round_up(len_sanitized, sizeof(u32)); 2384 2367 else 2385 2368 len += round_up(cfd->len, sizeof(u32)); 2386 2369 ··· 2445 2418 struct mcp251xfd_priv *priv = netdev_priv(ndev); 2446 2419 struct mcp251xfd_tx_ring *tx_ring = priv->tx; 2447 2420 struct mcp251xfd_tx_obj *tx_obj; 2421 + unsigned int frame_len; 2448 2422 u8 tx_head; 2449 2423 int err; 2450 2424 ··· 2461 2433 /* Stop queue if we occupy the complete TX FIFO */ 2462 2434 tx_head = mcp251xfd_get_tx_head(tx_ring); 2463 2435 tx_ring->head++; 2464 - if (tx_ring->head - tx_ring->tail >= tx_ring->obj_num) 2436 + if (mcp251xfd_get_tx_free(tx_ring) == 0) 2465 2437 netif_stop_queue(ndev); 2466 2438 2467 - can_put_echo_skb(skb, ndev, tx_head, 0); 2439 + frame_len = can_skb_get_frame_len(skb); 2440 + can_put_echo_skb(skb, ndev, tx_head, frame_len); 2441 + netdev_sent_queue(priv->ndev, frame_len); 2468 2442 2469 2443 err = mcp251xfd_tx_obj_write(priv, tx_obj); 2470 2444 if (err) ··· 2915 2885 priv->can.data_bittiming_const = &mcp251xfd_data_bittiming_const; 2916 2886 priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK | 2917 2887 CAN_CTRLMODE_LISTENONLY | CAN_CTRLMODE_BERR_REPORTING | 2918 - CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO; 2888 + CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO | 2889 + CAN_CTRLMODE_CC_LEN8_DLC; 2919 2890 priv->ndev = ndev; 2920 2891 priv->spi = spi; 2921 2892 priv->rx_int = rx_int;
+3 -3
drivers/net/can/usb/mcba_usb.c
··· 466 466 struct mcba_usb_msg_ka_usb *msg) 467 467 { 468 468 if (unlikely(priv->usb_ka_first_pass)) { 469 - netdev_info(priv->netdev, "PIC USB version %hhu.%hhu\n", 469 + netdev_info(priv->netdev, "PIC USB version %u.%u\n", 470 470 msg->soft_ver_major, msg->soft_ver_minor); 471 471 472 472 priv->usb_ka_first_pass = false; ··· 492 492 struct mcba_usb_msg_ka_can *msg) 493 493 { 494 494 if (unlikely(priv->can_ka_first_pass)) { 495 - netdev_info(priv->netdev, "PIC CAN version %hhu.%hhu\n", 495 + netdev_info(priv->netdev, "PIC CAN version %u.%u\n", 496 496 msg->soft_ver_major, msg->soft_ver_minor); 497 497 498 498 priv->can_ka_first_pass = false; ··· 554 554 break; 555 555 556 556 default: 557 - netdev_warn(priv->netdev, "Unsupported msg (0x%hhX)", 557 + netdev_warn(priv->netdev, "Unsupported msg (0x%X)", 558 558 msg->cmd_id); 559 559 break; 560 560 }
+1
include/linux/can/dev.h
··· 123 123 int can_restart_now(struct net_device *dev); 124 124 void can_bus_off(struct net_device *dev); 125 125 126 + const char *can_get_state_str(const enum can_state state); 126 127 void can_change_state(struct net_device *dev, struct can_frame *cf, 127 128 enum can_state tx_state, enum can_state rx_state); 128 129
+1 -1
net/can/gw.c
··· 225 225 if (ccf->len <= CAN_MAX_DLEN) 226 226 return; 227 227 228 - /* potentially broken values are catched in can_can_gw_rcv() */ 228 + /* potentially broken values are caught in can_can_gw_rcv() */ 229 229 if (ccf->len > CAN_MAX_RAW_DLC) 230 230 return; 231 231