When running kexec feature, it needs to release dpaa ethernet driver and fman resource so that the second kernel can bootup normally. So, create shutdown callback functions to improve ethernet driver.
Signed-off-by: Meng Li <[email protected]> --- .../ethernet/freescale/sdk_dpaa/dpaa_eth.c | 3 +++ .../freescale/sdk_dpaa/dpaa_eth_common.c | 20 +++++++++++++++++++ .../freescale/sdk_dpaa/dpaa_eth_common.h | 3 +++ .../sdk_fman/src/wrapper/lnxwrp_fm.c | 18 +++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c index e20a4351afb1..7f309229b5f1 100644 --- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth.c @@ -1161,6 +1161,9 @@ static struct platform_driver dpa_driver = { .pm = DPAA_PM_OPS, }, .probe = dpaa_eth_priv_probe, +#if defined(CONFIG_KEXEC) + .shutdown = dpa_shutdown, +#endif .remove = dpa_remove }; diff --git a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c index 13a31b59036a..42776555d1f5 100644 --- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.c @@ -510,6 +510,26 @@ int __cold dpa_remove(struct platform_device *of_dev) } EXPORT_SYMBOL(dpa_remove); +#if defined(CONFIG_KEXEC) +void __cold dpa_shutdown(struct platform_device *of_dev) +{ + struct device *dev; + struct net_device *net_dev; + struct dpa_priv_s *priv; + + dev = &of_dev->dev; + net_dev = dev_get_drvdata(dev); + + priv = netdev_priv(net_dev); + + dpa_fq_free(dev, &priv->dpa_fq_list); + + dpa_bp_free(priv); + + return; +} +#endif + struct mac_device * __cold __must_check __attribute__((nonnull)) dpa_mac_probe(struct platform_device *_of_dev) diff --git a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h index c686d04f1c05..a6df8bf97ab6 100644 --- a/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h +++ b/drivers/net/ethernet/freescale/sdk_dpaa/dpaa_eth_common.h @@ -158,6 +158,9 @@ int dpa_get_ts(const struct dpa_priv_s *priv, enum port_type rx_tx, #endif /* CONFIG_FSL_DPAA_TS */ int dpa_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); int __cold dpa_remove(struct platform_device *of_dev); +#if defined(CONFIG_KEXEC) +void __cold dpa_shutdown(struct platform_device *of_dev); +#endif struct mac_device * __cold __must_check __attribute__((nonnull)) dpa_mac_probe(struct platform_device *_of_dev); int dpa_set_mac_address(struct net_device *net_dev, void *addr); diff --git a/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c index 3fa99df195ac..da327b6accfb 100755 --- a/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c +++ b/drivers/net/ethernet/freescale/sdk_fman/src/wrapper/lnxwrp_fm.c @@ -1337,6 +1337,21 @@ static int fm_remove(struct platform_device *of_dev) return 0; } +#if defined(CONFIG_KEXEC) +static void fm_shutdown(struct platform_device *of_dev) +{ + t_LnxWrpFmDev *p_LnxWrpFmDev; + struct device *dev; + + dev = &of_dev->dev; + p_LnxWrpFmDev = dev_get_drvdata(dev); + if (!p_LnxWrpFmDev->active) + return; + + FreeFmPcdDev(p_LnxWrpFmDev); +} +#endif + static const struct of_device_id fm_match[] = { { .compatible = "fsl,fman" @@ -1414,6 +1429,9 @@ static struct platform_driver fm_driver = { .pm = FM_PM_OPS, }, .probe = fm_probe, +#if defined(CONFIG_KEXEC) + .shutdown = fm_shutdown, +#endif .remove = fm_remove }; -- 2.35.3
-=-=-=-=-=-=-=-=-=-=-=- Links: You receive all messages sent to this group. View/Reply Online (#11270): https://lists.yoctoproject.org/g/linux-yocto/message/11270 Mute This Topic: https://lists.yoctoproject.org/mt/90772519/21656 Group Owner: [email protected] Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub [[email protected]] -=-=-=-=-=-=-=-=-=-=-=-
