Lines Matching +full:max +full:- +full:bitrate

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>
13 #include <linux/can/can-ml.h>
24 if (new_state <= priv->state) in can_update_state_error_stats()
29 priv->can_stats.error_warning++; in can_update_state_error_stats()
32 priv->can_stats.error_passive++; in can_update_state_error_stats()
35 priv->can_stats.bus_off++; in can_update_state_error_stats()
108 *tx_state = can_state_err_to_state(bec->txerr); in can_state_get_by_berr_counter()
109 *rx_state = can_state_err_to_state(bec->rxerr); in can_state_get_by_berr_counter()
117 enum can_state new_state = max(tx_state, rx_state); in can_change_state()
119 if (unlikely(new_state == priv->state)) { in can_change_state()
125 can_get_state_str(priv->state), priv->state, in can_change_state()
129 priv->state = new_state; in can_change_state()
135 cf->can_id |= CAN_ERR_BUSOFF; in can_change_state()
139 cf->can_id |= CAN_ERR_CRTL; in can_change_state()
140 cf->data[1] |= tx_state >= rx_state ? in can_change_state()
142 cf->data[1] |= tx_state <= rx_state ? in can_change_state()
147 /* CAN device restart for bus-off recovery */
156 netdev_err(dev, "Attempt to restart for bus-off recovery, but carrier is OK?\n"); in can_restart()
158 /* No synchronization needed because the device is bus-off and in can_restart()
166 cf->can_id |= CAN_ERR_RESTARTED; in can_restart()
172 err = priv->do_set_mode(dev, CAN_MODE_START); in can_restart()
178 priv->can_stats.restarts++; in can_restart()
188 can_restart(priv->dev); in can_restart_work()
196 * disabled and the device is in the bus-off state in can_restart_now()
198 if (priv->restart_ms) in can_restart_now()
199 return -EINVAL; in can_restart_now()
200 if (priv->state != CAN_STATE_BUS_OFF) in can_restart_now()
201 return -EBUSY; in can_restart_now()
203 cancel_delayed_work_sync(&priv->restart_work); in can_restart_now()
209 /* CAN bus-off
211 * This functions should be called when the device goes bus-off to
213 * If enabled, a timer is started to trigger bus-off recovery.
219 if (priv->restart_ms) in can_bus_off()
220 netdev_info(dev, "bus-off, scheduling restart in %d ms\n", in can_bus_off()
221 priv->restart_ms); in can_bus_off()
223 netdev_info(dev, "bus-off\n"); in can_bus_off()
227 if (priv->restart_ms) in can_bus_off()
228 schedule_delayed_work(&priv->restart_work, in can_bus_off()
229 msecs_to_jiffies(priv->restart_ms)); in can_bus_off()
235 dev->type = ARPHRD_CAN; in can_setup()
236 dev->mtu = CAN_MTU; in can_setup()
237 dev->hard_header_len = 0; in can_setup()
238 dev->addr_len = 0; in can_setup()
239 dev->tx_queue_len = 10; in can_setup()
241 /* New-style flags. */ in can_setup()
242 dev->flags = IFF_NOARP; in can_setup()
243 dev->features = NETIF_F_HW_CSUM; in can_setup()
259 * +-------------------------+ in alloc_candev_mqs()
261 * +-------------------------+ in alloc_candev_mqs()
263 * +-------------------------+ in alloc_candev_mqs()
265 * +-------------------------+ in alloc_candev_mqs()
280 priv->dev = dev; in alloc_candev_mqs()
286 priv->echo_skb_max = echo_skb_max; in alloc_candev_mqs()
287 priv->echo_skb = (void *)priv + in alloc_candev_mqs()
288 (size - echo_skb_max * sizeof(struct sk_buff *)); in alloc_candev_mqs()
291 priv->state = CAN_STATE_STOPPED; in alloc_candev_mqs()
293 INIT_DELAYED_WORK(&priv->restart_work, can_restart_work); in alloc_candev_mqs()
313 if (dev->flags & IFF_UP) in can_change_mtu()
314 return -EBUSY; in can_change_mtu()
319 /* 'CANFD-only' controllers can not switch to CAN_MTU */ in can_change_mtu()
321 return -EINVAL; in can_change_mtu()
323 priv->ctrlmode &= ~CAN_CTRLMODE_FD; in can_change_mtu()
328 if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD) && in can_change_mtu()
330 return -EINVAL; in can_change_mtu()
332 priv->ctrlmode |= CAN_CTRLMODE_FD; in can_change_mtu()
336 return -EINVAL; in can_change_mtu()
339 WRITE_ONCE(dev->mtu, new_mtu); in can_change_mtu()
353 if (copy_from_user(&hwts_cfg, ifr->ifr_data, sizeof(hwts_cfg))) in can_eth_ioctl_hwts()
354 return -EFAULT; in can_eth_ioctl_hwts()
358 return -ERANGE; in can_eth_ioctl_hwts()
363 if (copy_to_user(ifr->ifr_data, &hwts_cfg, sizeof(hwts_cfg))) in can_eth_ioctl_hwts()
364 return -EFAULT; in can_eth_ioctl_hwts()
368 return -EOPNOTSUPP; in can_eth_ioctl_hwts()
379 info->so_timestamping = in can_ethtool_op_get_ts_info_hwts()
384 info->tx_types = BIT(HWTSTAMP_TX_ON); in can_ethtool_op_get_ts_info_hwts()
385 info->rx_filters = BIT(HWTSTAMP_FILTER_ALL); in can_ethtool_op_get_ts_info_hwts()
400 if (!priv->bittiming.bitrate) { in open_candev()
401 netdev_err(dev, "bit-timing not yet defined\n"); in open_candev()
402 return -EINVAL; in open_candev()
405 /* For CAN FD the data bitrate has to be >= the arbitration bitrate */ in open_candev()
406 if ((priv->ctrlmode & CAN_CTRLMODE_FD) && in open_candev()
407 (!priv->data_bittiming.bitrate || in open_candev()
408 priv->data_bittiming.bitrate < priv->bittiming.bitrate)) { in open_candev()
409 netdev_err(dev, "incorrect/missing data bit-timing\n"); in open_candev()
410 return -EINVAL; in open_candev()
413 /* Switch carrier on if device was stopped while in bus-off state */ in open_candev()
430 struct device_node *np = dev->dev.parent->of_node; in of_can_transceiver()
433 dn = of_get_child_by_name(np, "can-transceiver"); in of_can_transceiver()
437 ret = of_property_read_u32(dn, "max-bitrate", &priv->bitrate_max); in of_can_transceiver()
439 if ((ret && ret != -EINVAL) || (!ret && !priv->bitrate_max)) in of_can_transceiver()
440 netdev_warn(dev, "Invalid value for transceiver max bitrate. Ignoring bitrate limit.\n"); in of_can_transceiver()
454 cancel_delayed_work_sync(&priv->restart_work); in close_candev()
464 if (term == priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_ENABLED]) in can_set_termination()
469 gpiod_set_value_cansleep(priv->termination_gpio, set); in can_set_termination()
477 struct device *dev = ndev->dev.parent; in can_get_termination()
488 "Cannot get termination-gpios\n"); in can_get_termination()
493 ret = device_property_read_u32(dev, "termination-ohms", &term); in can_get_termination()
495 netdev_err(ndev, "Cannot get termination-ohms: %pe\n", in can_get_termination()
501 netdev_err(ndev, "Invalid termination-ohms value (%u > %u)\n", in can_get_termination()
503 return -EINVAL; in can_get_termination()
506 priv->termination_const_cnt = ARRAY_SIZE(priv->termination_gpio_ohms); in can_get_termination()
507 priv->termination_const = priv->termination_gpio_ohms; in can_get_termination()
508 priv->termination_gpio = gpio; in can_get_termination()
509 priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_DISABLED] = in can_get_termination()
511 priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_ENABLED] = term; in can_get_termination()
512 priv->do_set_termination = can_set_termination; in can_get_termination()
523 if (!btc->sjw_max) in can_bittiming_const_valid()
539 if ((!priv->termination_const != !priv->termination_const_cnt) || in register_candev()
540 (!priv->termination_const != !priv->do_set_termination)) in register_candev()
541 return -EINVAL; in register_candev()
543 if (!priv->bitrate_const != !priv->bitrate_const_cnt) in register_candev()
544 return -EINVAL; in register_candev()
546 if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt) in register_candev()
547 return -EINVAL; in register_candev()
550 if ((priv->bitrate_const || priv->data_bitrate_const) && in register_candev()
551 (priv->bittiming_const || priv->data_bittiming_const)) in register_candev()
552 return -EINVAL; in register_candev()
554 if (!can_bittiming_const_valid(priv->bittiming_const) || in register_candev()
555 !can_bittiming_const_valid(priv->data_bittiming_const)) in register_candev()
556 return -EINVAL; in register_candev()
558 if (!priv->termination_const) { in register_candev()
564 dev->rtnl_link_ops = &can_link_ops; in register_candev()
583 if (dev->type != ARPHRD_CAN || dev->rtnl_link_ops != &can_link_ops) in safe_candev_priv()