Lines Matching +full:reset +full:- +full:bps
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright (C) 2005 Marc Kleine-Budde, Pengutronix
4 * Copyright (C) 2008-2009 Wolfgang Grandegger <wg@grandegger.com>
51 /* sample point is in one-tenth of a percent */ in can_validate_bittiming()
52 if (bt->sample_point >= 1000) { in can_validate_bittiming()
54 return -EINVAL; in can_validate_bittiming()
70 return -EOPNOTSUPP; in can_validate_tdc()
74 * must be set and vice-versa in can_validate_tdc()
78 return -EOPNOTSUPP; in can_validate_tdc()
82 return -EOPNOTSUPP; in can_validate_tdc()
100 return -EOPNOTSUPP; in can_validate_tdc()
106 return -EOPNOTSUPP; in can_validate_tdc()
112 return -EOPNOTSUPP; in can_validate_tdc()
130 * - nominal/arbitration bittiming in can_validate_databittiming()
131 * - data bittiming in can_validate_databittiming()
132 * - control mode with CAN_CTRLMODE_FD set in can_validate_databittiming()
133 * - TDC parameters are coherent (details in can_validate_tdc()) in can_validate_databittiming()
142 return -EOPNOTSUPP; /* Place holder for CAN XL */ in can_validate_databittiming()
150 return -EOPNOTSUPP; in can_validate_databittiming()
157 return -EOPNOTSUPP; in can_validate_databittiming()
163 return -EOPNOTSUPP; in can_validate_databittiming()
190 flags = cm->flags & cm->mask; in can_validate()
217 if (dev->flags & IFF_UP) in can_ctrlmode_changelink()
218 return -EBUSY; in can_ctrlmode_changelink()
222 maskedflags = cm->flags & cm->mask; in can_ctrlmode_changelink()
223 notsupp = maskedflags & ~(priv->ctrlmode_supported | ctrlstatic); in can_ctrlmode_changelink()
230 return -EOPNOTSUPP; in can_ctrlmode_changelink()
233 /* do not check for static fd-non-iso if 'fd' is disabled */ in can_ctrlmode_changelink()
241 return -EOPNOTSUPP; in can_ctrlmode_changelink()
244 /* If a top dependency flag is provided, reset all its dependencies */ in can_ctrlmode_changelink()
245 if (cm->mask & CAN_CTRLMODE_FD) in can_ctrlmode_changelink()
246 priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK; in can_ctrlmode_changelink()
249 priv->ctrlmode &= ~cm->mask; in can_ctrlmode_changelink()
250 priv->ctrlmode |= maskedflags; in can_ctrlmode_changelink()
253 if (!(priv->ctrlmode & CAN_CTRLMODE_FD)) { in can_ctrlmode_changelink()
254 memset(&priv->fd.data_bittiming, 0, in can_ctrlmode_changelink()
255 sizeof(priv->fd.data_bittiming)); in can_ctrlmode_changelink()
256 priv->ctrlmode &= ~CAN_CTRLMODE_FD_TDC_MASK; in can_ctrlmode_changelink()
257 memset(&priv->fd.tdc, 0, sizeof(priv->fd.tdc)); in can_ctrlmode_changelink()
271 const struct can_tdc_const *tdc_const = dbt_params->tdc_const; in can_tdc_changelink()
276 return -EOPNOTSUPP; in can_tdc_changelink()
287 if (tdcv < tdc_const->tdcv_min || tdcv > tdc_const->tdcv_max) in can_tdc_changelink()
288 return -EINVAL; in can_tdc_changelink()
296 if (tdco < tdc_const->tdco_min || tdco > tdc_const->tdco_max) in can_tdc_changelink()
297 return -EINVAL; in can_tdc_changelink()
305 if (tdcf < tdc_const->tdcf_min || tdcf > tdc_const->tdcf_max) in can_tdc_changelink()
306 return -EINVAL; in can_tdc_changelink()
311 dbt_params->tdc = tdc; in can_tdc_changelink()
330 dbt_params = &priv->fd; in can_dbt_changelink()
333 return -EOPNOTSUPP; /* Place holder for CAN XL */ in can_dbt_changelink()
340 if (dev->flags & IFF_UP) in can_dbt_changelink()
341 return -EBUSY; in can_dbt_changelink()
347 if (!dbt_params->data_bittiming_const && !dbt_params->do_set_data_bittiming && in can_dbt_changelink()
348 !dbt_params->data_bitrate_const) in can_dbt_changelink()
349 return -EOPNOTSUPP; in can_dbt_changelink()
352 err = can_get_bittiming(dev, &dbt, dbt_params->data_bittiming_const, in can_dbt_changelink()
353 dbt_params->data_bitrate_const, in can_dbt_changelink()
354 dbt_params->data_bitrate_const_cnt, extack); in can_dbt_changelink()
358 if (priv->bitrate_max && dbt.bitrate > priv->bitrate_max) { in can_dbt_changelink()
360 "CAN data bitrate %u bps surpasses transceiver capabilities of %u bps", in can_dbt_changelink()
361 dbt.bitrate, priv->bitrate_max); in can_dbt_changelink()
362 return -EINVAL; in can_dbt_changelink()
365 memset(&dbt_params->tdc, 0, sizeof(dbt_params->tdc)); in can_dbt_changelink()
369 need_tdc_calc = !(cm->mask & tdc_mask); in can_dbt_changelink()
375 priv->ctrlmode &= ~tdc_mask; in can_dbt_changelink()
382 can_calc_tdco(&dbt_params->tdc, dbt_params->tdc_const, &dbt, in can_dbt_changelink()
383 tdc_mask, &priv->ctrlmode, priv->ctrlmode_supported); in can_dbt_changelink()
388 memcpy(&dbt_params->data_bittiming, &dbt, sizeof(dbt)); in can_dbt_changelink()
390 if (dbt_params->do_set_data_bittiming) { in can_dbt_changelink()
391 /* Finally, set the bit-timing registers */ in can_dbt_changelink()
392 err = dbt_params->do_set_data_bittiming(dev); in can_dbt_changelink()
407 /* We need synchronization with dev->stop() */ in can_changelink()
416 if (dev->flags & IFF_UP) in can_changelink()
417 return -EBUSY; in can_changelink()
424 if (!priv->bittiming_const && !priv->do_set_bittiming && in can_changelink()
425 !priv->bitrate_const) in can_changelink()
426 return -EOPNOTSUPP; in can_changelink()
430 priv->bittiming_const, in can_changelink()
431 priv->bitrate_const, in can_changelink()
432 priv->bitrate_const_cnt, in can_changelink()
437 if (priv->bitrate_max && bt.bitrate > priv->bitrate_max) { in can_changelink()
439 "arbitration bitrate %u bps surpasses transceiver capabilities of %u bps", in can_changelink()
440 bt.bitrate, priv->bitrate_max); in can_changelink()
441 return -EINVAL; in can_changelink()
444 memcpy(&priv->bittiming, &bt, sizeof(bt)); in can_changelink()
446 if (priv->do_set_bittiming) { in can_changelink()
447 /* Finally, set the bit-timing registers */ in can_changelink()
448 err = priv->do_set_bittiming(dev); in can_changelink()
457 if (restart_ms != 0 && !priv->do_set_mode) { in can_changelink()
460 return -EOPNOTSUPP; in can_changelink()
464 if (dev->flags & IFF_UP) in can_changelink()
465 return -EBUSY; in can_changelink()
466 priv->restart_ms = restart_ms; in can_changelink()
470 if (!priv->do_set_mode) { in can_changelink()
473 return -EOPNOTSUPP; in can_changelink()
477 if (!(dev->flags & IFF_UP)) in can_changelink()
478 return -EINVAL; in can_changelink()
491 const unsigned int num_term = priv->termination_const_cnt; in can_changelink()
494 if (!priv->do_set_termination) { in can_changelink()
497 return -EOPNOTSUPP; in can_changelink()
502 if (termval == priv->termination_const[i]) in can_changelink()
506 return -EINVAL; in can_changelink()
509 err = priv->do_set_termination(dev, termval); in can_changelink()
513 priv->termination = termval; in can_changelink()
525 if (!dbt_params->tdc_const) in can_tdc_get_size()
535 if (dbt_params->tdc_const->tdcf_max) { in can_tdc_get_size()
541 if (tdc_manual || dbt_params->do_get_auto_tdcv) in can_tdc_get_size()
544 if (dbt_params->tdc_const->tdcf_max) in can_tdc_get_size()
556 if (dbt_params->data_bittiming.bitrate) /* IFLA_CAN_DATA_BITTIMING */ in can_data_bittiming_get_size()
557 size += nla_total_size(sizeof(dbt_params->data_bittiming)); in can_data_bittiming_get_size()
558 if (dbt_params->data_bittiming_const) /* IFLA_CAN_DATA_BITTIMING_CONST */ in can_data_bittiming_get_size()
559 size += nla_total_size(sizeof(*dbt_params->data_bittiming_const)); in can_data_bittiming_get_size()
560 if (dbt_params->data_bitrate_const) /* IFLA_CAN_DATA_BITRATE_CONST */ in can_data_bittiming_get_size()
561 size += nla_total_size(sizeof(*dbt_params->data_bitrate_const) * in can_data_bittiming_get_size()
562 dbt_params->data_bitrate_const_cnt); in can_data_bittiming_get_size()
579 if (priv->bittiming.bitrate) /* IFLA_CAN_BITTIMING */ in can_get_size()
581 if (priv->bittiming_const) /* IFLA_CAN_BITTIMING_CONST */ in can_get_size()
587 if (priv->do_get_berr_counter) /* IFLA_CAN_BERR_COUNTER */ in can_get_size()
589 if (priv->termination_const) { in can_get_size()
590 size += nla_total_size(sizeof(priv->termination)); /* IFLA_CAN_TERMINATION */ in can_get_size()
591 size += nla_total_size(sizeof(*priv->termination_const) * /* IFLA_CAN_TERMINATION_CONST */ in can_get_size()
592 priv->termination_const_cnt); in can_get_size()
594 if (priv->bitrate_const) /* IFLA_CAN_BITRATE_CONST */ in can_get_size()
595 size += nla_total_size(sizeof(*priv->bitrate_const) * in can_get_size()
596 priv->bitrate_const_cnt); in can_get_size()
597 size += sizeof(priv->bitrate_max); /* IFLA_CAN_BITRATE_MAX */ in can_get_size()
600 size += can_data_bittiming_get_size(&priv->fd, in can_get_size()
601 priv->ctrlmode & CAN_CTRLMODE_FD_TDC_MASK); in can_get_size()
609 return bittiming->bitrate != CAN_BITRATE_UNSET && in can_bittiming_fill_info()
610 bittiming->bitrate != CAN_BITRATE_UNKNOWN && in can_bittiming_fill_info()
643 dbt_params = &priv->fd; in can_tdc_fill_info()
645 tdc_manual = priv->ctrlmode & CAN_CTRLMODE_TDC_MANUAL; in can_tdc_fill_info()
647 return -EOPNOTSUPP; /* Place holder for CAN XL */ in can_tdc_fill_info()
649 tdc_const = dbt_params->tdc_const; in can_tdc_fill_info()
650 tdc = &dbt_params->tdc; in can_tdc_fill_info()
657 return -EMSGSIZE; in can_tdc_fill_info()
660 (nla_put_u32(skb, IFLA_CAN_TDC_TDCV_MIN, tdc_const->tdcv_min) || in can_tdc_fill_info()
661 nla_put_u32(skb, IFLA_CAN_TDC_TDCV_MAX, tdc_const->tdcv_max))) in can_tdc_fill_info()
663 if (nla_put_u32(skb, IFLA_CAN_TDC_TDCO_MIN, tdc_const->tdco_min) || in can_tdc_fill_info()
664 nla_put_u32(skb, IFLA_CAN_TDC_TDCO_MAX, tdc_const->tdco_max)) in can_tdc_fill_info()
666 if (tdc_const->tdcf_max && in can_tdc_fill_info()
667 (nla_put_u32(skb, IFLA_CAN_TDC_TDCF_MIN, tdc_const->tdcf_min) || in can_tdc_fill_info()
668 nla_put_u32(skb, IFLA_CAN_TDC_TDCF_MAX, tdc_const->tdcf_max))) in can_tdc_fill_info()
673 int err = -EINVAL; in can_tdc_fill_info()
676 tdcv = tdc->tdcv; in can_tdc_fill_info()
678 } else if (dbt_params->do_get_auto_tdcv) { in can_tdc_fill_info()
679 err = dbt_params->do_get_auto_tdcv(dev, &tdcv); in can_tdc_fill_info()
683 if (nla_put_u32(skb, IFLA_CAN_TDC_TDCO, tdc->tdco)) in can_tdc_fill_info()
685 if (tdc_const->tdcf_max && in can_tdc_fill_info()
686 nla_put_u32(skb, IFLA_CAN_TDC_TDCF, tdc->tdcf)) in can_tdc_fill_info()
695 return -EMSGSIZE; in can_tdc_fill_info()
705 return -EMSGSIZE; in can_ctrlmode_ext_fill_info()
708 priv->ctrlmode_supported)) { in can_ctrlmode_ext_fill_info()
710 return -EMSGSIZE; in can_ctrlmode_ext_fill_info()
720 struct can_ctrlmode cm = {.flags = priv->ctrlmode}; in can_fill_info()
722 enum can_state state = priv->state; in can_fill_info()
724 if (priv->do_get_state) in can_fill_info()
725 priv->do_get_state(dev, &state); in can_fill_info()
728 &priv->bittiming) || in can_fill_info()
731 priv->bittiming_const) || in can_fill_info()
733 nla_put(skb, IFLA_CAN_CLOCK, sizeof(priv->clock), &priv->clock) || in can_fill_info()
736 nla_put_u32(skb, IFLA_CAN_RESTART_MS, priv->restart_ms) || in can_fill_info()
738 (priv->do_get_berr_counter && in can_fill_info()
739 !priv->do_get_berr_counter(dev, &bec) && in can_fill_info()
743 &priv->fd.data_bittiming) || in can_fill_info()
746 priv->fd.data_bittiming_const) || in can_fill_info()
748 (priv->termination_const && in can_fill_info()
749 (nla_put_u16(skb, IFLA_CAN_TERMINATION, priv->termination) || in can_fill_info()
751 sizeof(*priv->termination_const) * in can_fill_info()
752 priv->termination_const_cnt, in can_fill_info()
753 priv->termination_const))) || in can_fill_info()
756 priv->bitrate_const, in can_fill_info()
757 priv->bitrate_const_cnt) || in can_fill_info()
760 priv->fd.data_bitrate_const, in can_fill_info()
761 priv->fd.data_bitrate_const_cnt) || in can_fill_info()
764 sizeof(priv->bitrate_max), in can_fill_info()
765 &priv->bitrate_max)) || in can_fill_info()
772 return -EMSGSIZE; in can_fill_info()
787 sizeof(priv->can_stats), &priv->can_stats)) in can_fill_xstats()
792 return -EMSGSIZE; in can_fill_xstats()
799 return -EOPNOTSUPP; in can_newlink()