Lines Matching +full:ipa +full:- +full:setup +full:- +full:ready

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.
18 #include "ipa.h"
38 * struct ipa_priv - IPA network device private data
39 * @ipa: IPA pointer
45 struct ipa *ipa; member
51 /** ipa_open() - Opens the modem network interface */
55 struct ipa *ipa = priv->ipa; in ipa_open() local
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() local
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() local
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()
141 * ready we want the network stack to stop queueing until power is in ipa_start_xmit()
148 * re-enabled once power is ACTIVE. But runtime PM and network 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()
301 int ipa_modem_start(struct ipa *ipa) in ipa_modem_start() argument
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()
354 int ipa_modem_stop(struct ipa *ipa) in ipa_modem_stop() argument
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()
369 return -EBUSY; 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()
395 static void ipa_modem_crashed(struct ipa *ipa) in ipa_modem_crashed() argument
397 struct device *dev = ipa->dev; in ipa_modem_crashed()
401 ipa_smp2p_irq_disable_setup(ipa); in ipa_modem_crashed()
409 ipa_endpoint_modem_pause_all(ipa, true); in ipa_modem_crashed()
411 ipa_endpoint_modem_hol_block_clear_all(ipa); in ipa_modem_crashed()
413 ipa_table_reset(ipa, true); in ipa_modem_crashed()
415 ret = ipa_table_hash_flush(ipa); in ipa_modem_crashed()
419 ret = ipa_endpoint_modem_exception_reset_all(ipa); in ipa_modem_crashed()
423 ipa_endpoint_modem_pause_all(ipa, false); in ipa_modem_crashed()
425 ret = ipa_modem_stop(ipa); in ipa_modem_crashed()
430 ret = ipa_mem_zero_modem(ipa); in ipa_modem_crashed()
442 struct ipa *ipa = container_of(nb, struct ipa, nb); in ipa_modem_notify() local
444 struct device *dev = ipa->dev; in ipa_modem_notify()
449 ipa_uc_power(ipa); in ipa_modem_notify()
450 ipa_smp2p_notify_reset(ipa); in ipa_modem_notify()
459 notify_data->crashed ? "crashed" : "stopping"); in ipa_modem_notify()
460 if (ipa->setup_complete) in ipa_modem_notify()
461 ipa_modem_crashed(ipa); in ipa_modem_notify()
476 int ipa_modem_config(struct ipa *ipa) in ipa_modem_config() argument
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()
491 void ipa_modem_deconfig(struct ipa *ipa) in ipa_modem_deconfig() argument
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()