Lines Matching +full:tx +full:- +full:ts +full:- +full:mask

1 // SPDX-License-Identifier: GPL-2.0
3 // mcp251xfd - Microchip MCP251xFD Family CAN controller driver
6 // Marc Kleine-Budde <kernel@pengutronix.de>
36 err = regmap_read(priv->map_reg, MCP251XFD_REG_TEFUA, &tef_ua); in mcp251xfd_tef_tail_get_from_chip()
59 netdev_err(priv->ndev, in mcp251xfd_check_tef_tail()
62 return -EILSEQ; in mcp251xfd_check_tef_tail()
73 struct net_device_stats *stats = &priv->ndev->stats; in mcp251xfd_handle_tefif_one()
77 /* Use the MCP2517FD mask on the MCP2518FD, too. We only in mcp251xfd_handle_tefif_one()
81 hw_tef_obj->flags); in mcp251xfd_handle_tefif_one()
82 tef_tail_masked = priv->tef->tail & in mcp251xfd_handle_tefif_one()
86 * bits of a FIFOSTA register, here the TX FIFO tail index in mcp251xfd_handle_tefif_one()
92 * -EBADMSG if an old CAN frame is detected. in mcp251xfd_handle_tefif_one()
95 netdev_dbg(priv->ndev, "%s: chip=0x%02x ring=0x%02x\n", __func__, in mcp251xfd_handle_tefif_one()
97 stats->tx_fifo_errors++; in mcp251xfd_handle_tefif_one()
99 return -EBADMSG; in mcp251xfd_handle_tefif_one()
103 skb = priv->can.echo_skb[tef_tail]; in mcp251xfd_handle_tefif_one()
105 mcp251xfd_skb_set_timestamp_raw(priv, skb, hw_tef_obj->ts); in mcp251xfd_handle_tefif_one()
106 stats->tx_bytes += in mcp251xfd_handle_tefif_one()
107 can_rx_offload_get_echo_skb_queue_timestamp(&priv->offload, in mcp251xfd_handle_tefif_one()
108 tef_tail, hw_tef_obj->ts, in mcp251xfd_handle_tefif_one()
110 stats->tx_packets++; in mcp251xfd_handle_tefif_one()
111 priv->tef->tail++; in mcp251xfd_handle_tefif_one()
119 const struct mcp251xfd_tx_ring *tx_ring = priv->tx; in mcp251xfd_get_tef_len()
120 const u8 shift = tx_ring->obj_num_shift_to_u8; in mcp251xfd_get_tef_len()
125 err = regmap_read(priv->map_reg, MCP251XFD_REG_FIFOSTA(priv->tx->fifo_nr), in mcp251xfd_get_tef_len()
130 /* If the chip says the TX-FIFO is empty, but there are no TX in mcp251xfd_get_tef_len()
135 *len_p = tx_ring->obj_num; in mcp251xfd_get_tef_len()
150 BUILD_BUG_ON(sizeof(tx_ring->obj_num) != sizeof(chip_tx_tail)); in mcp251xfd_get_tef_len()
151 BUILD_BUG_ON(sizeof(tx_ring->obj_num) != sizeof(tail)); in mcp251xfd_get_tef_len()
152 BUILD_BUG_ON(sizeof(tx_ring->obj_num) != sizeof(len)); in mcp251xfd_get_tef_len()
154 len = (chip_tx_tail << shift) - (tail << shift); in mcp251xfd_get_tef_len()
158 * bits of a FIFOSTA register, here the TX-FIFO tail index in mcp251xfd_get_tef_len()
161 * However here it seems the bit indicating that the TX-FIFO in mcp251xfd_get_tef_len()
163 * while the TX-FIFO tail index is. in mcp251xfd_get_tef_len()
165 * We assume the TX-FIFO is empty, i.e. all pending CAN frames in mcp251xfd_get_tef_len()
167 * - Chip's head and tail index are equal (len == 0). in mcp251xfd_get_tef_len()
168 * - The TX-FIFO is less than half full. in mcp251xfd_get_tef_len()
169 * (The TX-FIFO empty case has already been checked at the in mcp251xfd_get_tef_len()
171 * - No free buffers in the TX ring. in mcp251xfd_get_tef_len()
175 len = tx_ring->obj_num; in mcp251xfd_get_tef_len()
187 const struct mcp251xfd_tx_ring *tx_ring = priv->tx; in mcp251xfd_tef_obj_read()
188 const int val_bytes = regmap_get_val_bytes(priv->map_rx); in mcp251xfd_tef_obj_read()
191 (offset > tx_ring->obj_num || in mcp251xfd_tef_obj_read()
192 len > tx_ring->obj_num || in mcp251xfd_tef_obj_read()
193 offset + len > tx_ring->obj_num)) { in mcp251xfd_tef_obj_read()
194 netdev_err(priv->ndev, in mcp251xfd_tef_obj_read()
196 tx_ring->obj_num, offset, len); in mcp251xfd_tef_obj_read()
197 return -ERANGE; in mcp251xfd_tef_obj_read()
200 return regmap_bulk_read(priv->map_rx, in mcp251xfd_tef_obj_read()
208 struct mcp251xfd_ecc *ecc = &priv->ecc; in mcp251xfd_ecc_tefif_successful()
210 ecc->ecc_stat = 0; in mcp251xfd_ecc_tefif_successful()
231 err = mcp251xfd_tef_obj_read(priv, &hw_tef_obj[l], 0, len - l); in mcp251xfd_handle_tefif()
240 /* -EBADMSG means we're affected by mcp2518fd erratum in mcp251xfd_handle_tefif()
245 if (err == -EBADMSG) in mcp251xfd_handle_tefif()
256 struct mcp251xfd_tef_ring *ring = priv->tef; in mcp251xfd_handle_tefif()
257 struct mcp251xfd_tx_ring *tx_ring = priv->tx; in mcp251xfd_handle_tefif()
260 ring->head += len; in mcp251xfd_handle_tefif()
271 offset = ARRAY_SIZE(ring->uinc_xfer) - len; in mcp251xfd_handle_tefif()
272 err = spi_sync_transfer(priv->spi, in mcp251xfd_handle_tefif()
273 ring->uinc_xfer + offset, len); in mcp251xfd_handle_tefif()
277 tx_ring->tail += len; in mcp251xfd_handle_tefif()
278 netdev_completed_queue(priv->ndev, len, total_frame_len); in mcp251xfd_handle_tefif()
287 if (mcp251xfd_get_tx_free(priv->tx)) { in mcp251xfd_handle_tefif()
289 * this sees the new tx_ring->tail. in mcp251xfd_handle_tefif()
292 netif_wake_queue(priv->ndev); in mcp251xfd_handle_tefif()
295 if (priv->tx_coalesce_usecs_irq) in mcp251xfd_handle_tefif()
296 hrtimer_start(&priv->tx_irq_timer, in mcp251xfd_handle_tefif()
297 ns_to_ktime(priv->tx_coalesce_usecs_irq * in mcp251xfd_handle_tefif()