|
136 | 136 | #define IFI_CANFD_RXFIFO_ID 0x6c
|
137 | 137 | #define IFI_CANFD_RXFIFO_ID_ID_OFFSET 0
|
138 | 138 | #define IFI_CANFD_RXFIFO_ID_ID_STD_MASK CAN_SFF_MASK
|
| 139 | +#define IFI_CANFD_RXFIFO_ID_ID_STD_OFFSET 0 |
| 140 | +#define IFI_CANFD_RXFIFO_ID_ID_STD_WIDTH 10 |
139 | 141 | #define IFI_CANFD_RXFIFO_ID_ID_XTD_MASK CAN_EFF_MASK
|
| 142 | +#define IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET 11 |
| 143 | +#define IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH 18 |
140 | 144 | #define IFI_CANFD_RXFIFO_ID_IDE BIT(29)
|
141 | 145 |
|
142 | 146 | #define IFI_CANFD_RXFIFO_DATA 0x70 /* 0x70..0xac */
|
|
157 | 161 | #define IFI_CANFD_TXFIFO_ID 0xbc
|
158 | 162 | #define IFI_CANFD_TXFIFO_ID_ID_OFFSET 0
|
159 | 163 | #define IFI_CANFD_TXFIFO_ID_ID_STD_MASK CAN_SFF_MASK
|
| 164 | +#define IFI_CANFD_TXFIFO_ID_ID_STD_OFFSET 0 |
| 165 | +#define IFI_CANFD_TXFIFO_ID_ID_STD_WIDTH 10 |
160 | 166 | #define IFI_CANFD_TXFIFO_ID_ID_XTD_MASK CAN_EFF_MASK
|
| 167 | +#define IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET 11 |
| 168 | +#define IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH 18 |
161 | 169 | #define IFI_CANFD_TXFIFO_ID_IDE BIT(29)
|
162 | 170 |
|
163 | 171 | #define IFI_CANFD_TXFIFO_DATA 0xc0 /* 0xb0..0xfc */
|
@@ -229,10 +237,20 @@ static void ifi_canfd_read_fifo(struct net_device *ndev)
|
229 | 237 |
|
230 | 238 | rxid = readl(priv->base + IFI_CANFD_RXFIFO_ID);
|
231 | 239 | id = (rxid >> IFI_CANFD_RXFIFO_ID_ID_OFFSET);
|
232 |
| - if (id & IFI_CANFD_RXFIFO_ID_IDE) |
| 240 | + if (id & IFI_CANFD_RXFIFO_ID_IDE) { |
233 | 241 | id &= IFI_CANFD_RXFIFO_ID_ID_XTD_MASK;
|
234 |
| - else |
| 242 | + /* |
| 243 | + * In case the Extended ID frame is received, the standard |
| 244 | + * and extended part of the ID are swapped in the register, |
| 245 | + * so swap them back to obtain the correct ID. |
| 246 | + */ |
| 247 | + id = (id >> IFI_CANFD_RXFIFO_ID_ID_XTD_OFFSET) | |
| 248 | + ((id & IFI_CANFD_RXFIFO_ID_ID_STD_MASK) << |
| 249 | + IFI_CANFD_RXFIFO_ID_ID_XTD_WIDTH); |
| 250 | + id |= CAN_EFF_FLAG; |
| 251 | + } else { |
235 | 252 | id &= IFI_CANFD_RXFIFO_ID_ID_STD_MASK;
|
| 253 | + } |
236 | 254 | cf->can_id = id;
|
237 | 255 |
|
238 | 256 | if (rxdlc & IFI_CANFD_RXFIFO_DLC_ESI) {
|
@@ -767,6 +785,15 @@ static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
|
767 | 785 |
|
768 | 786 | if (cf->can_id & CAN_EFF_FLAG) {
|
769 | 787 | txid = cf->can_id & CAN_EFF_MASK;
|
| 788 | + /* |
| 789 | + * In case the Extended ID frame is transmitted, the |
| 790 | + * standard and extended part of the ID are swapped |
| 791 | + * in the register, so swap them back to send the |
| 792 | + * correct ID. |
| 793 | + */ |
| 794 | + txid = (txid >> IFI_CANFD_TXFIFO_ID_ID_XTD_WIDTH) | |
| 795 | + ((txid & IFI_CANFD_TXFIFO_ID_ID_XTD_MASK) << |
| 796 | + IFI_CANFD_TXFIFO_ID_ID_XTD_OFFSET); |
770 | 797 | txid |= IFI_CANFD_TXFIFO_ID_IDE;
|
771 | 798 | } else {
|
772 | 799 | txid = cf->can_id & CAN_SFF_MASK;
|
|
0 commit comments