diff options
Diffstat (limited to 'include/linux/can/dev.h')
-rw-r--r-- | include/linux/can/dev.h | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/include/linux/can/dev.h b/include/linux/can/dev.h index 5824b20b5fcb..6e5a7f00223d 100644 --- a/include/linux/can/dev.h +++ b/include/linux/can/dev.h | |||
@@ -29,8 +29,6 @@ enum can_mode { | |||
29 | /* | 29 | /* |
30 | * CAN common private data | 30 | * CAN common private data |
31 | */ | 31 | */ |
32 | #define CAN_ECHO_SKB_MAX 4 | ||
33 | |||
34 | struct can_priv { | 32 | struct can_priv { |
35 | struct can_device_stats can_stats; | 33 | struct can_device_stats can_stats; |
36 | 34 | ||
@@ -40,19 +38,47 @@ struct can_priv { | |||
40 | 38 | ||
41 | enum can_state state; | 39 | enum can_state state; |
42 | u32 ctrlmode; | 40 | u32 ctrlmode; |
41 | u32 ctrlmode_supported; | ||
43 | 42 | ||
44 | int restart_ms; | 43 | int restart_ms; |
45 | struct timer_list restart_timer; | 44 | struct timer_list restart_timer; |
46 | 45 | ||
47 | struct sk_buff *echo_skb[CAN_ECHO_SKB_MAX]; | ||
48 | |||
49 | int (*do_set_bittiming)(struct net_device *dev); | 46 | int (*do_set_bittiming)(struct net_device *dev); |
50 | int (*do_set_mode)(struct net_device *dev, enum can_mode mode); | 47 | int (*do_set_mode)(struct net_device *dev, enum can_mode mode); |
51 | int (*do_get_state)(const struct net_device *dev, | 48 | int (*do_get_state)(const struct net_device *dev, |
52 | enum can_state *state); | 49 | enum can_state *state); |
50 | int (*do_get_berr_counter)(const struct net_device *dev, | ||
51 | struct can_berr_counter *bec); | ||
52 | |||
53 | unsigned int echo_skb_max; | ||
54 | struct sk_buff **echo_skb; | ||
53 | }; | 55 | }; |
54 | 56 | ||
55 | struct net_device *alloc_candev(int sizeof_priv); | 57 | /* |
58 | * get_can_dlc(value) - helper macro to cast a given data length code (dlc) | ||
59 | * to __u8 and ensure the dlc value to be max. 8 bytes. | ||
60 | * | ||
61 | * To be used in the CAN netdriver receive path to ensure conformance with | ||
62 | * ISO 11898-1 Chapter 8.4.2.3 (DLC field) | ||
63 | */ | ||
64 | #define get_can_dlc(i) (min_t(__u8, (i), 8)) | ||
65 | |||
66 | /* Drop a given socketbuffer if it does not contain a valid CAN frame. */ | ||
67 | static inline int can_dropped_invalid_skb(struct net_device *dev, | ||
68 | struct sk_buff *skb) | ||
69 | { | ||
70 | const struct can_frame *cf = (struct can_frame *)skb->data; | ||
71 | |||
72 | if (unlikely(skb->len != sizeof(*cf) || cf->can_dlc > 8)) { | ||
73 | kfree_skb(skb); | ||
74 | dev->stats.tx_dropped++; | ||
75 | return 1; | ||
76 | } | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max); | ||
56 | void free_candev(struct net_device *dev); | 82 | void free_candev(struct net_device *dev); |
57 | 83 | ||
58 | int open_candev(struct net_device *dev); | 84 | int open_candev(struct net_device *dev); |
@@ -64,8 +90,13 @@ void unregister_candev(struct net_device *dev); | |||
64 | int can_restart_now(struct net_device *dev); | 90 | int can_restart_now(struct net_device *dev); |
65 | void can_bus_off(struct net_device *dev); | 91 | void can_bus_off(struct net_device *dev); |
66 | 92 | ||
67 | void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, int idx); | 93 | void can_put_echo_skb(struct sk_buff *skb, struct net_device *dev, |
68 | void can_get_echo_skb(struct net_device *dev, int idx); | 94 | unsigned int idx); |
69 | void can_free_echo_skb(struct net_device *dev, int idx); | 95 | void can_get_echo_skb(struct net_device *dev, unsigned int idx); |
96 | void can_free_echo_skb(struct net_device *dev, unsigned int idx); | ||
97 | |||
98 | struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf); | ||
99 | struct sk_buff *alloc_can_err_skb(struct net_device *dev, | ||
100 | struct can_frame **cf); | ||
70 | 101 | ||
71 | #endif /* CAN_DEV_H */ | 102 | #endif /* CAN_DEV_H */ |