1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * linux/can/rx-offload.h |
4 | * |
5 | * Copyright (c) 2014 David Jander, Protonic Holland |
6 | * Copyright (c) 2014-2017, 2023 Pengutronix, Marc Kleine-Budde <kernel@pengutronix.de> |
7 | */ |
8 | |
9 | #ifndef _CAN_RX_OFFLOAD_H |
10 | #define _CAN_RX_OFFLOAD_H |
11 | |
12 | #include <linux/netdevice.h> |
13 | #include <linux/can.h> |
14 | |
15 | struct can_rx_offload { |
16 | struct net_device *dev; |
17 | |
18 | struct sk_buff *(*mailbox_read)(struct can_rx_offload *offload, |
19 | unsigned int mb, u32 *timestamp, |
20 | bool drop); |
21 | |
22 | struct sk_buff_head skb_queue; |
23 | struct sk_buff_head skb_irq_queue; |
24 | u32 skb_queue_len_max; |
25 | |
26 | unsigned int mb_first; |
27 | unsigned int mb_last; |
28 | |
29 | struct napi_struct napi; |
30 | |
31 | bool inc; |
32 | }; |
33 | |
34 | int can_rx_offload_add_timestamp(struct net_device *dev, |
35 | struct can_rx_offload *offload); |
36 | int can_rx_offload_add_fifo(struct net_device *dev, |
37 | struct can_rx_offload *offload, |
38 | unsigned int weight); |
39 | int can_rx_offload_add_manual(struct net_device *dev, |
40 | struct can_rx_offload *offload, |
41 | unsigned int weight); |
42 | int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, |
43 | u64 reg); |
44 | int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload); |
45 | int can_rx_offload_queue_timestamp(struct can_rx_offload *offload, |
46 | struct sk_buff *skb, u32 timestamp); |
47 | unsigned int can_rx_offload_get_echo_skb_queue_timestamp(struct can_rx_offload *offload, |
48 | unsigned int idx, u32 timestamp, |
49 | unsigned int *frame_len_ptr); |
50 | int can_rx_offload_queue_tail(struct can_rx_offload *offload, |
51 | struct sk_buff *skb); |
52 | unsigned int can_rx_offload_get_echo_skb_queue_tail(struct can_rx_offload *offload, |
53 | unsigned int idx, |
54 | unsigned int *frame_len_ptr); |
55 | void can_rx_offload_irq_finish(struct can_rx_offload *offload); |
56 | void can_rx_offload_threaded_irq_finish(struct can_rx_offload *offload); |
57 | void can_rx_offload_del(struct can_rx_offload *offload); |
58 | void can_rx_offload_enable(struct can_rx_offload *offload); |
59 | |
60 | static inline void can_rx_offload_disable(struct can_rx_offload *offload) |
61 | { |
62 | napi_disable(n: &offload->napi); |
63 | } |
64 | |
65 | #endif /* !_CAN_RX_OFFLOAD_H */ |
66 | |