]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
dpaa_eth: register a device link for the qman portal used
authorMadalin Bucur <madalin.bucur@nxp.com>
Thu, 31 Oct 2019 14:37:59 +0000 (16:37 +0200)
committerDavid S. Miller <davem@davemloft.net>
Thu, 31 Oct 2019 19:13:34 +0000 (12:13 -0700)
Before this change, unbinding the QMan portals did not trigger a
corresponding unbinding of the dpaa_eth making use of it; the first
QMan portal related operation issued afterwards crashed the kernel.
The device link ensures the dpaa_eth dependency upon the qman portal
used is honoured at the QMan portal removal.

Signed-off-by: Madalin Bucur <madalin.bucur@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
drivers/soc/fsl/qbman/qman.c
include/soc/fsl/qman.h

index d8b41a0a7e3c9f011fc67f5e680e0872991ede43..6a9d12dad5d9d7be22a8f10970d8173e13dc858e 100644 (file)
@@ -750,7 +750,7 @@ static void dpaa_release_channel(void)
        qman_release_pool(rx_pool_channel);
 }
 
-static void dpaa_eth_add_channel(u16 channel)
+static void dpaa_eth_add_channel(u16 channel, struct device *dev)
 {
        u32 pool = QM_SDQCR_CHANNELS_POOL_CONV(channel);
        const cpumask_t *cpus = qman_affine_cpus();
@@ -760,6 +760,7 @@ static void dpaa_eth_add_channel(u16 channel)
        for_each_cpu_and(cpu, cpus, cpu_online_mask) {
                portal = qman_get_affine_portal(cpu);
                qman_p_static_dequeue_add(portal, pool);
+               qman_start_using_portal(portal, dev);
        }
 }
 
@@ -2873,7 +2874,7 @@ static int dpaa_eth_probe(struct platform_device *pdev)
        /* Walk the CPUs with affine portals
         * and add this pool channel to each's dequeue mask.
         */
-       dpaa_eth_add_channel(priv->channel);
+       dpaa_eth_add_channel(priv->channel, &pdev->dev);
 
        dpaa_fq_setup(priv, &dpaa_fq_cbs, priv->mac_dev->port[TX]);
 
index bc75a5882b9e9bbda3d84d941c7ea45e35e41fa7..1e164e03410af13182530db69890f9a2e023fdfb 100644 (file)
@@ -1756,12 +1756,6 @@ int qman_start_using_portal(struct qman_portal *p, struct device *dev)
 }
 EXPORT_SYMBOL(qman_start_using_portal);
 
-void qman_stop_using_portal(struct qman_portal *p, struct device *dev)
-{
-       device_link_remove(dev, p->config->dev);
-}
-EXPORT_SYMBOL(qman_stop_using_portal);
-
 int qman_p_poll_dqrr(struct qman_portal *p, unsigned int limit)
 {
        return __poll_portal_fast(p, limit);
index c499c5cfa7c913b160887531cd0d9c1e69f17d63..cfe00e08e85b0fdaff4b830426e2b52e1120e212 100644 (file)
@@ -925,13 +925,6 @@ struct qman_portal *qman_get_affine_portal(int cpu);
  */
 int qman_start_using_portal(struct qman_portal *p, struct device *dev);
 
-/**
- * qman_stop_using_portal - deregister a device link for the portal user
- * @p: the portal that will no longer be in use
- * @dev: the device that uses the portal
- */
-void qman_stop_using_portal(struct qman_portal *p, struct device *dev);
-
 /**
  * qman_p_poll_dqrr - process DQRR (fast-path) entries
  * @limit: the maximum number of DQRR entries to process