Lines Matching +full:termination +full:- +full:ohms

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>
14 #include <linux/can/can-ml.h>
32 if (new_state <= priv->state) in can_update_state_error_stats()
37 priv->can_stats.error_warning++; in can_update_state_error_stats()
40 priv->can_stats.error_passive++; in can_update_state_error_stats()
43 priv->can_stats.bus_off++; in can_update_state_error_stats()
107 if (unlikely(new_state == priv->state)) { in can_change_state()
113 can_get_state_str(priv->state), priv->state, in can_change_state()
117 priv->state = new_state; in can_change_state()
123 cf->can_id |= CAN_ERR_BUSOFF; in can_change_state()
127 cf->can_id |= CAN_ERR_CRTL; in can_change_state()
128 cf->data[1] |= tx_state >= rx_state ? in can_change_state()
130 cf->data[1] |= tx_state <= rx_state ? in can_change_state()
135 /* CAN device restart for bus-off recovery */
139 struct net_device_stats *stats = &dev->stats; in can_restart()
146 /* No synchronization needed because the device is bus-off and in can_restart()
156 cf->can_id |= CAN_ERR_RESTARTED; in can_restart()
158 stats->rx_packets++; in can_restart()
159 stats->rx_bytes += cf->len; in can_restart()
165 priv->can_stats.restarts++; in can_restart()
168 err = priv->do_set_mode(dev, CAN_MODE_START); in can_restart()
181 can_restart(priv->dev); in can_restart_work()
189 * disabled and the device is in the bus-off state in can_restart_now()
191 if (priv->restart_ms) in can_restart_now()
192 return -EINVAL; in can_restart_now()
193 if (priv->state != CAN_STATE_BUS_OFF) in can_restart_now()
194 return -EBUSY; in can_restart_now()
196 cancel_delayed_work_sync(&priv->restart_work); in can_restart_now()
202 /* CAN bus-off
204 * This functions should be called when the device goes bus-off to
206 * If enabled, a timer is started to trigger bus-off recovery.
212 if (priv->restart_ms) in can_bus_off()
213 netdev_info(dev, "bus-off, scheduling restart in %d ms\n", in can_bus_off()
214 priv->restart_ms); in can_bus_off()
216 netdev_info(dev, "bus-off\n"); in can_bus_off()
220 if (priv->restart_ms) in can_bus_off()
221 schedule_delayed_work(&priv->restart_work, in can_bus_off()
222 msecs_to_jiffies(priv->restart_ms)); in can_bus_off()
228 dev->type = ARPHRD_CAN; in can_setup()
229 dev->mtu = CAN_MTU; in can_setup()
230 dev->hard_header_len = 0; in can_setup()
231 dev->addr_len = 0; in can_setup()
232 dev->tx_queue_len = 10; in can_setup()
234 /* New-style flags. */ in can_setup()
235 dev->flags = IFF_NOARP; in can_setup()
236 dev->features = NETIF_F_HW_CSUM; in can_setup()
252 * +-------------------------+ in alloc_candev_mqs()
254 * +-------------------------+ in alloc_candev_mqs()
256 * +-------------------------+ in alloc_candev_mqs()
258 * +-------------------------+ in alloc_candev_mqs()
273 priv->dev = dev; in alloc_candev_mqs()
279 priv->echo_skb_max = echo_skb_max; in alloc_candev_mqs()
280 priv->echo_skb = (void *)priv + in alloc_candev_mqs()
281 (size - echo_skb_max * sizeof(struct sk_buff *)); in alloc_candev_mqs()
284 priv->state = CAN_STATE_STOPPED; in alloc_candev_mqs()
286 INIT_DELAYED_WORK(&priv->restart_work, can_restart_work); in alloc_candev_mqs()
305 if (dev->flags & IFF_UP) in can_change_mtu()
306 return -EBUSY; in can_change_mtu()
311 /* 'CANFD-only' controllers can not switch to CAN_MTU */ in can_change_mtu()
312 if (priv->ctrlmode_static & CAN_CTRLMODE_FD) in can_change_mtu()
313 return -EINVAL; in can_change_mtu()
315 priv->ctrlmode &= ~CAN_CTRLMODE_FD; in can_change_mtu()
320 if (!(priv->ctrlmode_supported & CAN_CTRLMODE_FD) && in can_change_mtu()
321 !(priv->ctrlmode_static & CAN_CTRLMODE_FD)) in can_change_mtu()
322 return -EINVAL; in can_change_mtu()
324 priv->ctrlmode |= CAN_CTRLMODE_FD; in can_change_mtu()
328 return -EINVAL; in can_change_mtu()
331 dev->mtu = new_mtu; in can_change_mtu()
345 if (!priv->bittiming.bitrate) { in open_candev()
346 netdev_err(dev, "bit-timing not yet defined\n"); in open_candev()
347 return -EINVAL; in open_candev()
351 if ((priv->ctrlmode & CAN_CTRLMODE_FD) && in open_candev()
352 (!priv->data_bittiming.bitrate || in open_candev()
353 priv->data_bittiming.bitrate < priv->bittiming.bitrate)) { in open_candev()
354 netdev_err(dev, "incorrect/missing data bit-timing\n"); in open_candev()
355 return -EINVAL; in open_candev()
358 /* Switch carrier on if device was stopped while in bus-off state */ in open_candev()
375 struct device_node *np = dev->dev.parent->of_node; in of_can_transceiver()
378 dn = of_get_child_by_name(np, "can-transceiver"); in of_can_transceiver()
382 ret = of_property_read_u32(dn, "max-bitrate", &priv->bitrate_max); in of_can_transceiver()
384 if ((ret && ret != -EINVAL) || (!ret && !priv->bitrate_max)) in of_can_transceiver()
399 cancel_delayed_work_sync(&priv->restart_work); in close_candev()
409 if (term == priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_ENABLED]) in can_set_termination()
414 gpiod_set_value(priv->termination_gpio, set); in can_set_termination()
422 struct device *dev = ndev->dev.parent; in can_get_termination()
427 /* Disabling termination by default is the safe choice: Else if many in can_get_termination()
430 gpio = devm_gpiod_get_optional(dev, "termination", GPIOD_OUT_LOW); in can_get_termination()
433 "Cannot get termination-gpios\n"); in can_get_termination()
438 ret = device_property_read_u32(dev, "termination-ohms", &term); in can_get_termination()
440 netdev_err(ndev, "Cannot get termination-ohms: %pe\n", in can_get_termination()
446 netdev_err(ndev, "Invalid termination-ohms value (%u > %u)\n", in can_get_termination()
448 return -EINVAL; in can_get_termination()
451 priv->termination_const_cnt = ARRAY_SIZE(priv->termination_gpio_ohms); in can_get_termination()
452 priv->termination_const = priv->termination_gpio_ohms; in can_get_termination()
453 priv->termination_gpio = gpio; in can_get_termination()
454 priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_DISABLED] = in can_get_termination()
456 priv->termination_gpio_ohms[CAN_TERMINATION_GPIO_ENABLED] = term; in can_get_termination()
457 priv->do_set_termination = can_set_termination; in can_get_termination()
472 if ((!priv->termination_const != !priv->termination_const_cnt) || in register_candev()
473 (!priv->termination_const != !priv->do_set_termination)) in register_candev()
474 return -EINVAL; in register_candev()
476 if (!priv->bitrate_const != !priv->bitrate_const_cnt) in register_candev()
477 return -EINVAL; in register_candev()
479 if (!priv->data_bitrate_const != !priv->data_bitrate_const_cnt) in register_candev()
480 return -EINVAL; in register_candev()
482 if (!priv->termination_const) { in register_candev()
488 dev->rtnl_link_ops = &can_link_ops; in register_candev()
507 if (dev->type != ARPHRD_CAN || dev->rtnl_link_ops != &can_link_ops) in safe_candev_priv()