Commit e06eea55 authored by Madalin Bucur's avatar Madalin Bucur Committed by David S. Miller

dpaa_eth: register a device link for the qman portal used

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: default avatarMadalin Bucur <madalin.bucur@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a2d00f3d
...@@ -750,7 +750,7 @@ static void dpaa_release_channel(void) ...@@ -750,7 +750,7 @@ static void dpaa_release_channel(void)
qman_release_pool(rx_pool_channel); 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); u32 pool = QM_SDQCR_CHANNELS_POOL_CONV(channel);
const cpumask_t *cpus = qman_affine_cpus(); const cpumask_t *cpus = qman_affine_cpus();
...@@ -760,6 +760,7 @@ static void dpaa_eth_add_channel(u16 channel) ...@@ -760,6 +760,7 @@ static void dpaa_eth_add_channel(u16 channel)
for_each_cpu_and(cpu, cpus, cpu_online_mask) { for_each_cpu_and(cpu, cpus, cpu_online_mask) {
portal = qman_get_affine_portal(cpu); portal = qman_get_affine_portal(cpu);
qman_p_static_dequeue_add(portal, pool); 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) ...@@ -2873,7 +2874,7 @@ static int dpaa_eth_probe(struct platform_device *pdev)
/* Walk the CPUs with affine portals /* Walk the CPUs with affine portals
* and add this pool channel to each's dequeue mask. * 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]); dpaa_fq_setup(priv, &dpaa_fq_cbs, priv->mac_dev->port[TX]);
......
...@@ -1756,12 +1756,6 @@ int qman_start_using_portal(struct qman_portal *p, struct device *dev) ...@@ -1756,12 +1756,6 @@ int qman_start_using_portal(struct qman_portal *p, struct device *dev)
} }
EXPORT_SYMBOL(qman_start_using_portal); 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) int qman_p_poll_dqrr(struct qman_portal *p, unsigned int limit)
{ {
return __poll_portal_fast(p, limit); return __poll_portal_fast(p, limit);
......
...@@ -925,13 +925,6 @@ struct qman_portal *qman_get_affine_portal(int cpu); ...@@ -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); 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 * qman_p_poll_dqrr - process DQRR (fast-path) entries
* @limit: the maximum number of DQRR entries to process * @limit: the maximum number of DQRR entries to process
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment