diff options
Diffstat (limited to 'include/linux/can.h')
| -rw-r--r-- | include/linux/can.h | 71 | 
1 files changed, 62 insertions, 9 deletions
diff --git a/include/linux/can.h b/include/linux/can.h index 9a19bcb3eeaf..e52958d7c2d1 100644 --- a/include/linux/can.h +++ b/include/linux/can.h @@ -21,7 +21,7 @@  /* special address description flags for the CAN_ID */  #define CAN_EFF_FLAG 0x80000000U /* EFF/SFF is set in the MSB */  #define CAN_RTR_FLAG 0x40000000U /* remote transmission request */ -#define CAN_ERR_FLAG 0x20000000U /* error frame */ +#define CAN_ERR_FLAG 0x20000000U /* error message frame */  /* valid bits in CAN ID for frame formats */  #define CAN_SFF_MASK 0x000007FFU /* standard frame format (SFF) */ @@ -32,32 +32,85 @@   * Controller Area Network Identifier structure   *   * bit 0-28	: CAN identifier (11/29 bit) - * bit 29	: error frame flag (0 = data frame, 1 = error frame) + * bit 29	: error message frame flag (0 = data frame, 1 = error message)   * bit 30	: remote transmission request flag (1 = rtr frame)   * bit 31	: frame format flag (0 = standard 11 bit, 1 = extended 29 bit)   */  typedef __u32 canid_t; +#define CAN_SFF_ID_BITS		11 +#define CAN_EFF_ID_BITS		29 +  /* - * Controller Area Network Error Frame Mask structure + * Controller Area Network Error Message Frame Mask structure   *   * bit 0-28	: error class mask (see include/linux/can/error.h)   * bit 29-31	: set to zero   */  typedef __u32 can_err_mask_t; +/* CAN payload length and DLC definitions according to ISO 11898-1 */ +#define CAN_MAX_DLC 8 +#define CAN_MAX_DLEN 8 + +/* CAN FD payload length and DLC definitions according to ISO 11898-7 */ +#define CANFD_MAX_DLC 15 +#define CANFD_MAX_DLEN 64 +  /**   * struct can_frame - basic CAN frame structure - * @can_id:  the CAN ID of the frame and CAN_*_FLAG flags, see above. - * @can_dlc: the data length field of the CAN frame - * @data:    the CAN frame payload. + * @can_id:  CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition + * @can_dlc: frame payload length in byte (0 .. 8) aka data length code + *           N.B. the DLC field from ISO 11898-1 Chapter 8.4.2.3 has a 1:1 + *           mapping of the 'data length code' to the real payload length + * @data:    CAN frame payload (up to 8 byte)   */  struct can_frame {  	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */ -	__u8    can_dlc; /* data length code: 0 .. 8 */ -	__u8    data[8] __attribute__((aligned(8))); +	__u8    can_dlc; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */ +	__u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));  }; +/* + * defined bits for canfd_frame.flags + * + * The use of struct canfd_frame implies the Extended Data Length (EDL) bit to + * be set in the CAN frame bitstream on the wire. The EDL bit switch turns + * the CAN controllers bitstream processor into the CAN FD mode which creates + * two new options within the CAN FD frame specification: + * + * Bit Rate Switch - to indicate a second bitrate is/was used for the payload + * Error State Indicator - represents the error state of the transmitting node + * + * As the CANFD_ESI bit is internally generated by the transmitting CAN + * controller only the CANFD_BRS bit is relevant for real CAN controllers when + * building a CAN FD frame for transmission. Setting the CANFD_ESI bit can make + * sense for virtual CAN interfaces to test applications with echoed frames. + */ +#define CANFD_BRS 0x01 /* bit rate switch (second bitrate for payload data) */ +#define CANFD_ESI 0x02 /* error state indicator of the transmitting node */ + +/** + * struct canfd_frame - CAN flexible data rate frame structure + * @can_id: CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition + * @len:    frame payload length in byte (0 .. CANFD_MAX_DLEN) + * @flags:  additional flags for CAN FD + * @__res0: reserved / padding + * @__res1: reserved / padding + * @data:   CAN FD frame payload (up to CANFD_MAX_DLEN byte) + */ +struct canfd_frame { +	canid_t can_id;  /* 32 bit CAN_ID + EFF/RTR/ERR flags */ +	__u8    len;     /* frame payload length in byte */ +	__u8    flags;   /* additional flags for CAN FD */ +	__u8    __res0;  /* reserved / padding */ +	__u8    __res1;  /* reserved / padding */ +	__u8    data[CANFD_MAX_DLEN] __attribute__((aligned(8))); +}; + +#define CAN_MTU		(sizeof(struct can_frame)) +#define CANFD_MTU	(sizeof(struct canfd_frame)) +  /* particular protocols of the protocol family PF_CAN */  #define CAN_RAW		1 /* RAW sockets */  #define CAN_BCM		2 /* Broadcast Manager */ @@ -97,7 +150,7 @@ struct sockaddr_can {   *          <received_can_id> & mask == can_id & mask   *   * The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can - * filter for error frames (CAN_ERR_FLAG bit set in mask). + * filter for error message frames (CAN_ERR_FLAG bit set in mask).   */  struct can_filter {  	canid_t can_id;  | 
