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()
97 enum can_state new_state = max(tx_state, rx_state); in can_change_state()
99 if (unlikely(new_state == priv->state)) { in can_change_state()
105 can_get_state_str(priv->state), priv->state, in can_change_state()
109 priv->state = new_state; in can_change_state()
115 cf->can_id |= CAN_ERR_BUSOFF; in can_change_state()
119 cf->can_id |= CAN_ERR_CRTL; in can_change_state()
120 cf->data[1] |= tx_state >= rx_state ? in can_change_state()
122 cf->data[1] |= tx_state <= rx_state ? in can_change_state()
127 /* CAN device restart for bus-off recovery */
137 /* No synchronization needed because the device is bus-off and in can_restart()
147 cf->can_id |= CAN_ERR_RESTARTED; in can_restart()
153 priv->can_stats.restarts++; in can_restart()
156 err = priv->do_set_mode(dev, CAN_MODE_START); in can_restart()
169 can_restart(priv->dev); in can_restart_work()
177 * disabled and the device is in the bus-off state in can_restart_now()
179 if (priv->restart_ms) in can_restart_now()
180 return -EINVAL; in can_restart_now()
181 if (priv->state != CAN_STATE_BUS_OFF) in can_restart_now()
182 return -EBUSY; in can_restart_now()
184 cancel_delayed_work_sync(&priv->restart_work); in can_restart_now()
190 /* CAN bus-off
192 * This functions should be called when the device goes bus-off to
194 * If enabled, a timer is started to trigger bus-off recovery.
200 if (priv->restart_ms) in can_bus_off()
201 netdev_info(dev, "bus-off, scheduling restart in %d ms\n", in can_bus_off()
202 priv->restart_ms); in can_bus_off()
204 netdev_info(dev, "bus-off\n"); in can_bus_off()
208 if (priv->restart_ms) in can_bus_off()
209 schedule_delayed_work(&priv->restart_work, in can_bus_off()
210 msecs_to_jiffies(priv->restart_ms)); in can_bus_off()
216 dev->type = ARPHRD_CAN; in can_setup()
217 dev->mtu = CAN_MTU; in can_setup()
218 dev->hard_header_len = 0; in can_setup()
219 dev->addr_len = 0; in can_setup()
220 dev->tx_queue_len = 10; in can_setup()
222 /* New-style flags. */ in can_setup()
223 dev->flags = IFF_NOARP; in can_setup()
224 dev->features = NETIF_F_HW_CSUM; in can_setup()
240 * +-------------------------+ in alloc_candev_mqs()
242 * +-------------------------+ in alloc_candev_mqs()
244 * +-------------------------+ in alloc_candev_mqs()
246 * +-------------------------+ in alloc_candev_mqs()
261 priv->dev = dev; in alloc_candev_mqs()
267 priv->echo_skb_max = echo_skb_max; in alloc_candev_mqs()
268 priv->echo_skb = (void *)priv + in alloc_candev_mqs()
269 (size - echo_skb_max * sizeof(struct sk_buff *)); in alloc_candev_mqs()
272 priv->state = CAN_STATE_STOPPED; in alloc_candev_mqs()
274 INIT_DELAYED_WORK(&priv->restart_work, can_restart_work); in alloc_candev_mqs()
294 if (dev->flags & IFF_UP) in can_change_mtu()
295 return -EBUSY; in can_change_mtu()
300 /* 'CANFD-only' controllers can not switch to CAN_MTU */ in can_change_mtu()
302 return -EINVAL; in can_change_mtu()
304 priv->ctrlmode &= ~CAN_CTRLMODE_FD; in can_change_mtu()
309 if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD) && in can_change_mtu()
311 return -EINVAL; in can_change_mtu()
313 priv->ctrlmode |= CAN_CTRLMODE_FD; in can_change_mtu()
317 return -EINVAL; in can_change_mtu()
320 dev->mtu = new_mtu; in can_change_mtu()
334 if (copy_from_user(&hwts_cfg, ifr->ifr_data, sizeof(hwts_cfg))) in can_eth_ioctl_hwts()
335 return -EFAULT; in can_eth_ioctl_hwts()
339 return -ERANGE; in can_eth_ioctl_hwts()
344 if (copy_to_user(ifr->ifr_data, &hwts_cfg, sizeof(hwts_cfg))) in can_eth_ioctl_hwts()
345 return -EFAULT; in can_eth_ioctl_hwts()
349 return -EOPNOTSUPP; in can_eth_ioctl_hwts()
360 info->so_timestamping = in can_ethtool_op_get_ts_info_hwts()
367 info->phc_index = -1; in can_ethtool_op_get_ts_info_hwts()
368 info->tx_types = BIT(HWTSTAMP_TX_ON); in can_ethtool_op_get_ts_info_hwts()
369 info->rx_filters = BIT(HWTSTAMP_FILTER_ALL); in can_ethtool_op_get_ts_info_hwts()
384 if (!priv->bittiming.bitrate) { in open_candev()
385 netdev_err(dev, "bit-timing not yet defined\n"); in open_candev()
386 return -EINVAL; in open_candev()
389 /* For CAN FD the data bitrate has to be >= the arbitration bitrate */ in open_candev()
390 if ((priv->ctrlmode & CAN_CTRLMODE_FD) && in open_candev()
391 (!priv->data_bittiming.bitrate || in open_candev()
392 priv->data_bittiming.bitrate < priv->bittiming.bitrate)) { in open_candev()
393 netdev_err(dev, "incorrect/missing data bit-timing\n"); in open_candev()
394 return -EINVAL; in open_candev()
397 /* Switch carrier on if device was stopped while in bus-off state */ in open_candev()
414 struct device_node *np = dev->dev.parent->of_node; in of_can_transceiver()
417 dn = of_get_child_by_name(np, "can-transceiver"); in of_can_transceiver()
421 ret = of_property_read_u32(dn, "max-bitrate", &priv->bitrate_max); in of_can_transceiver()
423 if ((ret && ret != -EINVAL) || (!ret && !priv->bitrate_max)) in of_can_transceiver()
424 netdev_warn(dev, "Invalid value for transceiver max bitrate. Ignoring bitrate limit.\n"); in of_can_transceiver()
438 cancel_delayed_work_sync(&priv->restart_work); in close_candev()
448 if (term == priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_ENABLED]) in can_set_termination()
453 gpiod_set_value(priv->termination_gpio, set); in can_set_termination()
461 struct device *dev = ndev->dev.parent; in can_get_termination()
472 "Cannot get termination-gpios\n"); in can_get_termination()
477 ret = device_property_read_u32(dev, "termination-ohms", &term); in can_get_termination()
479 netdev_err(ndev, "Cannot get termination-ohms: %pe\n", in can_get_termination()
485 netdev_err(ndev, "Invalid termination-ohms value (%u > %u)\n", in can_get_termination()
487 return -EINVAL; in can_get_termination()
490 priv->termination_const_cnt = ARRAY_SIZE(priv->termination_gpio_ohms); in can_get_termination()
491 priv->termination_const = priv->termination_gpio_ohms; in can_get_termination()
492 priv->termination_gpio = gpio; in can_get_termination()
493 priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_DISABLED] = in can_get_termination()
495 priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_ENABLED] = term; in can_get_termination()
496 priv->do_set_termination = can_set_termination; in can_get_termination()
507 if (!btc->sjw_max) in can_bittiming_const_valid()
523 if ((!priv->termination_const != !priv->termination_const_cnt) || in register_candev()
524 (!priv->termination_const != !priv->do_set_termination)) in register_candev()
525 return -EINVAL; in register_candev()
527 if (!priv->bitrate_const != !priv->bitrate_const_cnt) in register_candev()
528 return -EINVAL; in register_candev()
530 if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt) in register_candev()
531 return -EINVAL; in register_candev()
534 if ((priv->bitrate_const || priv->data_bitrate_const) && in register_candev()
535 (priv->bittiming_const || priv->data_bittiming_const)) in register_candev()
536 return -EINVAL; in register_candev()
538 if (!can_bittiming_const_valid(priv->bittiming_const) || in register_candev()
539 !can_bittiming_const_valid(priv->data_bittiming_const)) in register_candev()
540 return -EINVAL; in register_candev()
542 if (!priv->termination_const) { in register_candev()
548 dev->rtnl_link_ops = &can_link_ops; in register_candev()
567 if (dev->type != ARPHRD_CAN || dev->rtnl_link_ops != &can_link_ops) in safe_candev_priv()