135
135
136
136
#define IFI_CANFD_RXFIFO_ID 0x6c
137
137
#define IFI_CANFD_RXFIFO_ID_ID_OFFSET 0
138
- #define IFI_CANFD_RXFIFO_ID_ID_STD_MASK 0x3ff
139
- #define IFI_CANFD_RXFIFO_ID_ID_XTD_MASK 0x1fffffff
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
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 */
156
160
157
161
#define IFI_CANFD_TXFIFO_ID 0xbc
158
162
#define IFI_CANFD_TXFIFO_ID_ID_OFFSET 0
159
- #define IFI_CANFD_TXFIFO_ID_ID_STD_MASK 0x3ff
160
- #define IFI_CANFD_TXFIFO_ID_ID_XTD_MASK 0x1fffffff
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
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 ) {
@@ -514,25 +532,25 @@ static irqreturn_t ifi_canfd_isr(int irq, void *dev_id)
514
532
515
533
static const struct can_bittiming_const ifi_canfd_bittiming_const = {
516
534
.name = KBUILD_MODNAME ,
517
- .tseg1_min = 2 , /* Time segment 1 = prop_seg + phase_seg1 */
535
+ .tseg1_min = 1 , /* Time segment 1 = prop_seg + phase_seg1 */
518
536
.tseg1_max = 64 ,
519
- .tseg2_min = 1 , /* Time segment 2 = phase_seg2 */
520
- .tseg2_max = 16 ,
537
+ .tseg2_min = 2 , /* Time segment 2 = phase_seg2 */
538
+ .tseg2_max = 64 ,
521
539
.sjw_max = 16 ,
522
- .brp_min = 1 ,
523
- .brp_max = 1024 ,
540
+ .brp_min = 2 ,
541
+ .brp_max = 256 ,
524
542
.brp_inc = 1 ,
525
543
};
526
544
527
545
static const struct can_bittiming_const ifi_canfd_data_bittiming_const = {
528
546
.name = KBUILD_MODNAME ,
529
- .tseg1_min = 2 , /* Time segment 1 = prop_seg + phase_seg1 */
530
- .tseg1_max = 16 ,
531
- .tseg2_min = 1 , /* Time segment 2 = phase_seg2 */
532
- .tseg2_max = 8 ,
533
- .sjw_max = 4 ,
534
- .brp_min = 1 ,
535
- .brp_max = 32 ,
547
+ .tseg1_min = 1 , /* Time segment 1 = prop_seg + phase_seg1 */
548
+ .tseg1_max = 64 ,
549
+ .tseg2_min = 2 , /* Time segment 2 = phase_seg2 */
550
+ .tseg2_max = 64 ,
551
+ .sjw_max = 16 ,
552
+ .brp_min = 2 ,
553
+ .brp_max = 256 ,
536
554
.brp_inc = 1 ,
537
555
};
538
556
@@ -545,32 +563,34 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
545
563
u32 noniso_arg = 0 ;
546
564
u32 time_off ;
547
565
548
- if (priv -> can .ctrlmode & CAN_CTRLMODE_FD_NON_ISO ) {
566
+ if ((priv -> can .ctrlmode & CAN_CTRLMODE_FD ) &&
567
+ !(priv -> can .ctrlmode & CAN_CTRLMODE_FD_NON_ISO )) {
568
+ time_off = IFI_CANFD_TIME_SJW_OFF_ISO ;
569
+ } else {
549
570
noniso_arg = IFI_CANFD_TIME_SET_TIMEB_BOSCH |
550
571
IFI_CANFD_TIME_SET_TIMEA_BOSCH |
551
572
IFI_CANFD_TIME_SET_PRESC_BOSCH |
552
573
IFI_CANFD_TIME_SET_SJW_BOSCH ;
553
574
time_off = IFI_CANFD_TIME_SJW_OFF_BOSCH ;
554
- } else {
555
- time_off = IFI_CANFD_TIME_SJW_OFF_ISO ;
556
575
}
557
576
558
577
/* Configure bit timing */
559
- brp = bt -> brp - 1 ;
578
+ brp = bt -> brp - 2 ;
560
579
sjw = bt -> sjw - 1 ;
561
580
tseg1 = bt -> prop_seg + bt -> phase_seg1 - 1 ;
562
- tseg2 = bt -> phase_seg2 - 1 ;
581
+ tseg2 = bt -> phase_seg2 - 2 ;
563
582
writel ((tseg2 << IFI_CANFD_TIME_TIMEB_OFF ) |
564
583
(tseg1 << IFI_CANFD_TIME_TIMEA_OFF ) |
565
584
(brp << IFI_CANFD_TIME_PRESCALE_OFF ) |
566
- (sjw << time_off ),
585
+ (sjw << time_off ) |
586
+ noniso_arg ,
567
587
priv -> base + IFI_CANFD_TIME );
568
588
569
589
/* Configure data bit timing */
570
- brp = dbt -> brp - 1 ;
590
+ brp = dbt -> brp - 2 ;
571
591
sjw = dbt -> sjw - 1 ;
572
592
tseg1 = dbt -> prop_seg + dbt -> phase_seg1 - 1 ;
573
- tseg2 = dbt -> phase_seg2 - 1 ;
593
+ tseg2 = dbt -> phase_seg2 - 2 ;
574
594
writel ((tseg2 << IFI_CANFD_TIME_TIMEB_OFF ) |
575
595
(tseg1 << IFI_CANFD_TIME_TIMEA_OFF ) |
576
596
(brp << IFI_CANFD_TIME_PRESCALE_OFF ) |
@@ -747,8 +767,7 @@ static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
747
767
{
748
768
struct ifi_canfd_priv * priv = netdev_priv (ndev );
749
769
struct canfd_frame * cf = (struct canfd_frame * )skb -> data ;
750
- u32 txst , txid ;
751
- u32 txdlc = 0 ;
770
+ u32 txst , txid , txdlc ;
752
771
int i ;
753
772
754
773
if (can_dropped_invalid_skb (ndev , skb ))
@@ -766,17 +785,25 @@ static netdev_tx_t ifi_canfd_start_xmit(struct sk_buff *skb,
766
785
767
786
if (cf -> can_id & CAN_EFF_FLAG ) {
768
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 );
769
797
txid |= IFI_CANFD_TXFIFO_ID_IDE ;
770
798
} else {
771
799
txid = cf -> can_id & CAN_SFF_MASK ;
772
800
}
773
801
774
- if (priv -> can .ctrlmode & (CAN_CTRLMODE_FD | CAN_CTRLMODE_FD_NON_ISO )) {
775
- if (can_is_canfd_skb (skb )) {
776
- txdlc |= IFI_CANFD_TXFIFO_DLC_EDL ;
777
- if (cf -> flags & CANFD_BRS )
778
- txdlc |= IFI_CANFD_TXFIFO_DLC_BRS ;
779
- }
802
+ txdlc = can_len2dlc (cf -> len );
803
+ if ((priv -> can .ctrlmode & CAN_CTRLMODE_FD ) && can_is_canfd_skb (skb )) {
804
+ txdlc |= IFI_CANFD_TXFIFO_DLC_EDL ;
805
+ if (cf -> flags & CANFD_BRS )
806
+ txdlc |= IFI_CANFD_TXFIFO_DLC_BRS ;
780
807
}
781
808
782
809
if (cf -> can_id & CAN_RTR_FLAG )
@@ -847,7 +874,7 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
847
874
848
875
priv -> can .state = CAN_STATE_STOPPED ;
849
876
850
- priv -> can .clock .freq = readl (addr + IFI_CANFD_SYSCLOCK );
877
+ priv -> can .clock .freq = readl (addr + IFI_CANFD_CANCLOCK );
851
878
852
879
priv -> can .bittiming_const = & ifi_canfd_bittiming_const ;
853
880
priv -> can .data_bittiming_const = & ifi_canfd_data_bittiming_const ;
0 commit comments