Skip to content

Commit a08e4dd

Browse files
committed
can: mcp25xxfd: setup tdc more reliably and allow configuration
Missing CAN framework support for control/configuration of tdc via netlink so for now these are module parameters. Signed-off-by: Martin Sperl <[email protected]>
1 parent 034dc9b commit a08e4dd

File tree

1 file changed

+32
-3
lines changed

1 file changed

+32
-3
lines changed

drivers/net/can/spi/mcp25xxfd/mcp25xxfd_can.c

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,23 @@ unsigned int bw_sharing_log2bits;
106106
module_param(bw_sharing_log2bits, uint, 0664);
107107
MODULE_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 */
110127
static
111128
const 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

Comments
 (0)