@@ -106,6 +106,23 @@ unsigned int bw_sharing_log2bits;
106106module_param (bw_sharing_log2bits , uint , 0664 );
107107MODULE_PARM_DESC (bw_sharing_log2bits ,
108108 "Delay between 2 transmissions in number of arbitration bit times\n" );
109+ bool enable_edge_filter = false;
110+ module_param (enable_edge_filter , bool , 0664 );
111+ MODULE_PARM_DESC (enable_edge_filter ,
112+ "Enable ISO11898-1:2015 edge_filtering" );
113+ unsigned int tdc_mode ;
114+ module_param (tdc_mode , uint , 0664 );
115+ MODULE_PARM_DESC (tdc_mode ,
116+ "Transmitter Delay Mode - 0 = disabled, 1 = fixed, 2 = auto\n" );
117+ int tdc_value ;
118+ module_param (tdc_value , int , 0664 );
119+ MODULE_PARM_DESC (tdc_value ,
120+ "Transmission Delay Value - range: [-64:63]" );
121+ unsigned int tdc_offset = 16 ;
122+ module_param (tdc_offset , uint , 0664 );
123+ MODULE_PARM_DESC (tdc_offset ,
124+ "Transmission Delay Value - range: [0:63]" );
125+
109126/* everything related to bit timing */
110127static
111128const struct can_bittiming_const mcp25xxfd_can_nominal_bittiming_const = {
@@ -178,9 +195,21 @@ static int mcp25xxfd_can_do_set_data_bittiming(struct net_device *net)
178195 int ret ;
179196
180197 /* set up Transmitter delay compensation */
181- if (!cpriv -> regs .tdc )
182- cpriv -> regs .tdc = CAN_TDC_EDGFLTEN |
183- (CAN_TDC_TDCMOD_AUTO << CAN_TDC_TDCMOD_SHIFT );
198+ if (!cpriv -> regs .tdc ) {
199+ /* configure TDC mode */
200+ cpriv -> regs .tdc = min_t (unsigned int , tdc_mode , 3 ) <<
201+ CAN_TDC_TDCMOD_SHIFT ;
202+ /* configure TDC offsets */
203+ cpriv -> regs .tdc |= (clamp_t (int , tdc_offset , -64 , 63 ) <<
204+ CAN_TDC_TDCO_SHIFT ) &&
205+ CAN_TDC_TDCO_MASK ;
206+ /* configure TDC value */
207+ cpriv -> regs .tdc |= min_t (unsigned int , tdc_value , 63 ) <<
208+ CAN_TDC_TDCV_SHIFT ;
209+ /* enable edge filtering */
210+ if (enable_edge_filter )
211+ cpriv -> regs .tdc |= CAN_TDC_EDGFLTEN ;
212+ }
184213 ret = mcp25xxfd_cmd_write (spi , CAN_TDC , cpriv -> regs .tdc );
185214 if (ret )
186215 return ret ;
0 commit comments