Lines Matching +full:re +full:- +full:started

1 // SPDX-License-Identifier: GPL-2.0
3 /* Copyright (c) 2014-2018, The Linux Foundation. All rights reserved.
4 * Copyright (C) 2018-2024 Linaro Ltd.
38 * struct ipa_priv - IPA network device private data
51 /** ipa_open() - Opens the modem network interface */
55 struct ipa *ipa = priv->ipa; in ipa_open()
59 dev = ipa->dev; in ipa_open()
64 ret = ipa_endpoint_enable_one(priv->tx); in ipa_open()
68 ret = ipa_endpoint_enable_one(priv->rx); in ipa_open()
80 ipa_endpoint_disable_one(priv->tx); in ipa_open()
87 /** ipa_stop() - Stops the modem network interface. */
91 struct ipa *ipa = priv->ipa; in ipa_stop()
95 dev = ipa->dev; in ipa_stop()
102 ipa_endpoint_disable_one(priv->rx); in ipa_stop()
103 ipa_endpoint_disable_one(priv->tx); in ipa_stop()
111 /** ipa_start_xmit() - Transmit an skb
125 struct net_device_stats *stats = &netdev->stats; in ipa_start_xmit()
128 struct ipa *ipa = priv->ipa; in ipa_start_xmit()
129 u32 skb_len = skb->len; in ipa_start_xmit()
136 endpoint = ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]; in ipa_start_xmit()
137 if (endpoint->config.qmap && skb->protocol != htons(ETH_P_MAP)) in ipa_start_xmit()
140 /* The hardware must be powered for us to transmit, so if we're not in ipa_start_xmit()
146 * If it was not, powering up is either started or already underway. in ipa_start_xmit()
148 * re-enabled once power is ACTIVE. But runtime PM and network in ipa_start_xmit()
149 * transmit run concurrently, and if we're not careful the requests in ipa_start_xmit()
159 dev = ipa->dev; in ipa_start_xmit()
163 if (ret < 0 && ret != -EINPROGRESS) { in ipa_start_xmit()
182 if (ret != -E2BIG) in ipa_start_xmit()
187 stats->tx_packets++; in ipa_start_xmit()
188 stats->tx_bytes += skb_len; in ipa_start_xmit()
194 stats->tx_dropped++; in ipa_start_xmit()
201 struct net_device_stats *stats = &netdev->stats; in ipa_modem_skb_rx()
204 skb->dev = netdev; in ipa_modem_skb_rx()
205 skb->protocol = htons(ETH_P_MAP); in ipa_modem_skb_rx()
206 stats->rx_packets++; in ipa_modem_skb_rx()
207 stats->rx_bytes += skb->len; in ipa_modem_skb_rx()
211 stats->rx_dropped++; in ipa_modem_skb_rx()
221 /** ipa_modem_netdev_setup() - netdev setup function for the modem */
224 netdev->netdev_ops = &ipa_modem_ops; in ipa_modem_netdev_setup()
226 netdev->header_ops = NULL; in ipa_modem_netdev_setup()
227 netdev->type = ARPHRD_RAWIP; in ipa_modem_netdev_setup()
228 netdev->hard_header_len = 0; in ipa_modem_netdev_setup()
229 netdev->min_header_len = ETH_HLEN; in ipa_modem_netdev_setup()
230 netdev->min_mtu = ETH_MIN_MTU; in ipa_modem_netdev_setup()
231 netdev->max_mtu = IPA_MTU; in ipa_modem_netdev_setup()
232 netdev->mtu = netdev->max_mtu; in ipa_modem_netdev_setup()
233 netdev->addr_len = 0; in ipa_modem_netdev_setup()
234 netdev->tx_queue_len = DEFAULT_TX_QUEUE_LEN; in ipa_modem_netdev_setup()
235 netdev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST); in ipa_modem_netdev_setup()
236 netdev->priv_flags |= IFF_TX_SKB_SHARING; in ipa_modem_netdev_setup()
237 eth_broadcast_addr(netdev->broadcast); in ipa_modem_netdev_setup()
240 netdev->needed_headroom = sizeof(struct rmnet_map_header); in ipa_modem_netdev_setup()
241 netdev->needed_tailroom = IPA_NETDEV_TAILROOM; in ipa_modem_netdev_setup()
242 netdev->watchdog_timeo = IPA_NETDEV_TIMEOUT * HZ; in ipa_modem_netdev_setup()
243 netdev->hw_features = NETIF_F_SG; in ipa_modem_netdev_setup()
246 /** ipa_modem_suspend() - suspend callback
255 if (!(netdev->flags & IFF_UP)) in ipa_modem_suspend()
259 ipa_endpoint_suspend_one(priv->rx); in ipa_modem_suspend()
260 ipa_endpoint_suspend_one(priv->tx); in ipa_modem_suspend()
264 * ipa_modem_wake_queue_work() - enable modem netdev queue
267 * Re-enable transmit on the modem network device. This is called
278 netif_wake_queue(priv->tx->netdev); in ipa_modem_wake_queue_work()
281 /** ipa_modem_resume() - resume callback for runtime_pm
290 if (!(netdev->flags & IFF_UP)) in ipa_modem_resume()
294 ipa_endpoint_resume_one(priv->tx); in ipa_modem_resume()
295 ipa_endpoint_resume_one(priv->rx); in ipa_modem_resume()
298 (void)queue_pm_work(&priv->work); in ipa_modem_resume()
309 state = atomic_cmpxchg(&ipa->modem_state, IPA_MODEM_STATE_STOPPED, in ipa_modem_start()
319 ret = -ENOMEM; in ipa_modem_start()
323 SET_NETDEV_DEV(netdev, ipa->dev); in ipa_modem_start()
325 priv->ipa = ipa; in ipa_modem_start()
326 priv->tx = ipa->name_map[IPA_ENDPOINT_AP_MODEM_TX]; in ipa_modem_start()
327 priv->rx = ipa->name_map[IPA_ENDPOINT_AP_MODEM_RX]; in ipa_modem_start()
328 INIT_WORK(&priv->work, ipa_modem_wake_queue_work); in ipa_modem_start()
330 priv->tx->netdev = netdev; in ipa_modem_start()
331 priv->rx->netdev = netdev; in ipa_modem_start()
333 ipa->modem_netdev = netdev; in ipa_modem_start()
337 ipa->modem_netdev = NULL; in ipa_modem_start()
338 priv->rx->netdev = NULL; in ipa_modem_start()
339 priv->tx->netdev = NULL; in ipa_modem_start()
346 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); in ipa_modem_start()
348 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_RUNNING); in ipa_modem_start()
356 struct net_device *netdev = ipa->modem_netdev; in ipa_modem_stop()
360 state = atomic_cmpxchg(&ipa->modem_state, IPA_MODEM_STATE_RUNNING, in ipa_modem_stop()
367 /* If we're somewhere between stopped and starting, we're busy */ in ipa_modem_stop()
369 return -EBUSY; in ipa_modem_stop()
371 /* Clean up the netdev and endpoints if it was started */ in ipa_modem_stop()
375 cancel_work_sync(&priv->work); in ipa_modem_stop()
377 if (netdev->flags & IFF_UP) in ipa_modem_stop()
381 ipa->modem_netdev = NULL; in ipa_modem_stop()
382 priv->rx->netdev = NULL; in ipa_modem_stop()
383 priv->tx->netdev = NULL; in ipa_modem_stop()
388 atomic_set(&ipa->modem_state, IPA_MODEM_STATE_STOPPED); in ipa_modem_stop()
397 struct device *dev = ipa->dev; in ipa_modem_crashed()
444 struct device *dev = ipa->dev; in ipa_modem_notify()
459 notify_data->crashed ? "crashed" : "stopping"); in ipa_modem_notify()
460 if (ipa->setup_complete) in ipa_modem_notify()
480 ipa->nb.notifier_call = ipa_modem_notify; in ipa_modem_config()
482 notifier = qcom_register_ssr_notifier("mpss", &ipa->nb); in ipa_modem_config()
486 ipa->notifier = notifier; in ipa_modem_config()
493 struct device *dev = ipa->dev; in ipa_modem_deconfig()
496 ret = qcom_unregister_ssr_notifier(ipa->notifier, &ipa->nb); in ipa_modem_deconfig()
500 ipa->notifier = NULL; in ipa_modem_deconfig()
501 memset(&ipa->nb, 0, sizeof(ipa->nb)); in ipa_modem_deconfig()