diff options
| author | Oliver Hartkopp <socketcan@hartkopp.net> | 2012-06-13 14:04:33 -0400 |
|---|---|---|
| committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2012-06-19 15:39:50 -0400 |
| commit | 7c9416365c60f150ef8961a2855fafbc7394ad6b (patch) | |
| tree | 56af7e0eb5ad94c6da14ff7dde79935eb58628a5 /include/linux | |
| parent | 5b92da0443c2585e31b64e86c2e1b8e22845d4bb (diff) | |
canfd: add new data structures and constants
- add new struct canfd_frame
- check identical element offsets in struct can_frame and struct canfd_frame
- new ETH_P_CANFD definition to tag CAN FD skbs correctly
- add CAN_MTU and CANFD_MTU definitions for easy frame and mode detection
- add CAN[FD]_MAX_[DLC|DLEN] helper constants to remove hard coded values
- update existing struct can_frame with helper constants and comments
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/can.h | 59 | ||||
| -rw-r--r-- | include/linux/if_ether.h | 3 |
2 files changed, 56 insertions, 6 deletions
diff --git a/include/linux/can.h b/include/linux/can.h index 17334c09bd93..1a66cf6112ae 100644 --- a/include/linux/can.h +++ b/include/linux/can.h | |||
| @@ -46,18 +46,67 @@ typedef __u32 canid_t; | |||
| 46 | */ | 46 | */ |
| 47 | typedef __u32 can_err_mask_t; | 47 | typedef __u32 can_err_mask_t; |
| 48 | 48 | ||
| 49 | /* CAN payload length and DLC definitions according to ISO 11898-1 */ | ||
| 50 | #define CAN_MAX_DLC 8 | ||
| 51 | #define CAN_MAX_DLEN 8 | ||
| 52 | |||
| 53 | /* CAN FD payload length and DLC definitions according to ISO 11898-7 */ | ||
| 54 | #define CANFD_MAX_DLC 15 | ||
| 55 | #define CANFD_MAX_DLEN 64 | ||
| 56 | |||
| 49 | /** | 57 | /** |
| 50 | * struct can_frame - basic CAN frame structure | 58 | * struct can_frame - basic CAN frame structure |
| 51 | * @can_id: the CAN ID of the frame and CAN_*_FLAG flags, see above. | 59 | * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition |
| 52 | * @can_dlc: the data length field of the CAN frame | 60 | * @can_dlc: frame payload length in byte (0 .. 8) aka data length code |
| 53 | * @data: the CAN frame payload. | 61 | * N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1 |
| 62 | * mapping of the 'data length code' to the real payload length | ||
| 63 | * @data: CAN frame payload (up to 8 byte) | ||
| 54 | */ | 64 | */ |
| 55 | struct can_frame { | 65 | struct can_frame { |
| 56 | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ | 66 | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ |
| 57 | __u8 can_dlc; /* data length code: 0 .. 8 */ | 67 | __u8 can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ |
| 58 | __u8 data[8] __attribute__((aligned(8))); | 68 | __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8))); |
| 59 | }; | 69 | }; |
| 60 | 70 | ||
| 71 | /* | ||
| 72 | * defined bits for canfd_frame.flags | ||
| 73 | * | ||
| 74 | * As the default for CAN FD should be to support the high data rate in the | ||
| 75 | * payload section of the frame (HDR) and to support up to 64 byte in the | ||
| 76 | * data section (EDL) the bits are only set in the non-default case. | ||
| 77 | * Btw. as long as there's no real implementation for CAN FD network driver | ||
| 78 | * these bits are only preliminary. | ||
| 79 | * | ||
| 80 | * RX: NOHDR/NOEDL - info about received CAN FD frame | ||
| 81 | * ESI - bit from originating CAN controller | ||
| 82 | * TX: NOHDR/NOEDL - control per-frame settings if supported by CAN controller | ||
| 83 | * ESI - bit is set by local CAN controller | ||
| 84 | */ | ||
| 85 | #define CANFD_NOHDR 0x01 /* frame without high data rate */ | ||
| 86 | #define CANFD_NOEDL 0x02 /* frame without extended data length */ | ||
| 87 | #define CANFD_ESI 0x04 /* error state indicator */ | ||
| 88 | |||
| 89 | /** | ||
| 90 | * struct canfd_frame - CAN flexible data rate frame structure | ||
| 91 | * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition | ||
| 92 | * @len: frame payload length in byte (0 .. CANFD_MAX_DLEN) | ||
| 93 | * @flags: additional flags for CAN FD | ||
| 94 | * @__res0: reserved / padding | ||
| 95 | * @__res1: reserved / padding | ||
| 96 | * @data: CAN FD frame payload (up to CANFD_MAX_DLEN byte) | ||
| 97 | */ | ||
| 98 | struct canfd_frame { | ||
| 99 | canid_t can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */ | ||
| 100 | __u8 len; /* frame payload length in byte */ | ||
| 101 | __u8 flags; /* additional flags for CAN FD */ | ||
| 102 | __u8 __res0; /* reserved / padding */ | ||
| 103 | __u8 __res1; /* reserved / padding */ | ||
| 104 | __u8 data[CANFD_MAX_DLEN] __attribute__((aligned(8))); | ||
| 105 | }; | ||
| 106 | |||
| 107 | #define CAN_MTU (sizeof(struct can_frame)) | ||
| 108 | #define CANFD_MTU (sizeof(struct canfd_frame)) | ||
| 109 | |||
| 61 | /* particular protocols of the protocol family PF_CAN */ | 110 | /* particular protocols of the protocol family PF_CAN */ |
| 62 | #define CAN_RAW 1 /* RAW sockets */ | 111 | #define CAN_RAW 1 /* RAW sockets */ |
| 63 | #define CAN_BCM 2 /* Broadcast Manager */ | 112 | #define CAN_BCM 2 /* Broadcast Manager */ |
diff --git a/include/linux/if_ether.h b/include/linux/if_ether.h index 56d907a2c804..167ce5b363d2 100644 --- a/include/linux/if_ether.h +++ b/include/linux/if_ether.h | |||
| @@ -105,7 +105,8 @@ | |||
| 105 | #define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ | 105 | #define ETH_P_WAN_PPP 0x0007 /* Dummy type for WAN PPP frames*/ |
| 106 | #define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ | 106 | #define ETH_P_PPP_MP 0x0008 /* Dummy type for PPP MP frames */ |
| 107 | #define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ | 107 | #define ETH_P_LOCALTALK 0x0009 /* Localtalk pseudo type */ |
| 108 | #define ETH_P_CAN 0x000C /* Controller Area Network */ | 108 | #define ETH_P_CAN 0x000C /* CAN: Controller Area Network */ |
| 109 | #define ETH_P_CANFD 0x000D /* CANFD: CAN flexible data rate*/ | ||
| 109 | #define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ | 110 | #define ETH_P_PPPTALK 0x0010 /* Dummy type for Atalk over PPP*/ |
| 110 | #define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ | 111 | #define ETH_P_TR_802_2 0x0011 /* 802.2 frames */ |
| 111 | #define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ | 112 | #define ETH_P_MOBITEX 0x0015 /* Mobitex (kaz@cafe.net) */ |
