/* CAN payload length and DLC definitions according to ISO 11898-1 */
 #define CAN_MAX_DLC 8
+#define CAN_MAX_RAW_DLC 15
 #define CAN_MAX_DLEN 8
 
 /* CAN FD payload length and DLC definitions according to ISO 11898-7 */
 #define CANFD_MAX_DLEN 64
 
 /**
- * struct can_frame - basic CAN frame structure
- * @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
- * @__pad:   padding
- * @__res0:  reserved / padding
- * @__res1:  reserved / padding
- * @data:    CAN frame payload (up to 8 byte)
+ * struct can_frame - Classical CAN frame structure (aka CAN 2.0B)
+ * @can_id:   CAN ID of the frame and CAN_*_FLAG flags, see canid_t definition
+ * @len:      CAN frame payload length in byte (0 .. 8)
+ * @can_dlc:  deprecated name for CAN frame payload length in byte (0 .. 8)
+ * @__pad:    padding
+ * @__res0:   reserved / padding
+ * @len8_dlc: optional DLC value (9 .. 15) at 8 byte payload length
+ *            len8_dlc contains values from 9 .. 15 when the payload length is
+ *            8 bytes but the DLC value (see ISO 11898-1) is greater then 8.
+ *            CAN_CTRLMODE_CC_LEN8_DLC flag has to be enabled in CAN driver.
+ * @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; /* frame payload length in byte (0 .. CAN_MAX_DLEN) */
-       __u8    __pad;   /* padding */
-       __u8    __res0;  /* reserved / padding */
-       __u8    __res1;  /* reserved / padding */
-       __u8    data[CAN_MAX_DLEN] __attribute__((aligned(8)));
+       union {
+               /* CAN frame payload length in byte (0 .. CAN_MAX_DLEN)
+                * was previously named can_dlc so we need to carry that
+                * name for legacy support
+                */
+               __u8 len;
+               __u8 can_dlc; /* deprecated */
+       };
+       __u8 __pad; /* padding */
+       __u8 __res0; /* reserved / padding */
+       __u8 len8_dlc; /* optional DLC for 8 byte payload length (9 .. 15) */
+       __u8 data[CAN_MAX_DLEN] __attribute__((aligned(8)));
 };
 
 /*