diff options
author | David S. Miller <davem@davemloft.net> | 2018-03-14 13:16:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-03-14 13:16:23 -0400 |
commit | 16c2e4db832da4b883b3ee8b9dc32d1ca115759a (patch) | |
tree | fa926cf76dc41bb3a4773dc69e0c522ee421feab | |
parent | 4dcb31d4649df36297296b819437709f5407059c (diff) | |
parent | 82d141cd19d088ee41feafde4a6f86eeb40d93c5 (diff) |
Merge branch 'DPAA-Ethernet-fixes'
Madalin Bucur says:
====================
DPAA Ethernet fixes
This patch set is addressing several issues in the DPAA Ethernet
driver suite:
- module unload crash caused by wrong reference to device being left
in the cleanup code after the DSA related changes
- scheduling wile atomic bug in QMan code revealed during dpaa_eth
module unload
- a couple of error counter fixes, a duplicated init in dpaa_eth.
====================
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 8 | ||||
-rw-r--r-- | drivers/soc/fsl/qbman/qman.c | 28 |
2 files changed, 9 insertions, 27 deletions
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c index 7caa8da48421..e4ec32a9ca15 100644 --- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | |||
@@ -2008,7 +2008,6 @@ static inline int dpaa_xmit(struct dpaa_priv *priv, | |||
2008 | } | 2008 | } |
2009 | 2009 | ||
2010 | if (unlikely(err < 0)) { | 2010 | if (unlikely(err < 0)) { |
2011 | percpu_stats->tx_errors++; | ||
2012 | percpu_stats->tx_fifo_errors++; | 2011 | percpu_stats->tx_fifo_errors++; |
2013 | return err; | 2012 | return err; |
2014 | } | 2013 | } |
@@ -2278,7 +2277,6 @@ static enum qman_cb_dqrr_result rx_default_dqrr(struct qman_portal *portal, | |||
2278 | vaddr = phys_to_virt(addr); | 2277 | vaddr = phys_to_virt(addr); |
2279 | prefetch(vaddr + qm_fd_get_offset(fd)); | 2278 | prefetch(vaddr + qm_fd_get_offset(fd)); |
2280 | 2279 | ||
2281 | fd_format = qm_fd_get_format(fd); | ||
2282 | /* The only FD types that we may receive are contig and S/G */ | 2280 | /* The only FD types that we may receive are contig and S/G */ |
2283 | WARN_ON((fd_format != qm_fd_contig) && (fd_format != qm_fd_sg)); | 2281 | WARN_ON((fd_format != qm_fd_contig) && (fd_format != qm_fd_sg)); |
2284 | 2282 | ||
@@ -2311,8 +2309,10 @@ static enum qman_cb_dqrr_result rx_default_dqrr(struct qman_portal *portal, | |||
2311 | 2309 | ||
2312 | skb_len = skb->len; | 2310 | skb_len = skb->len; |
2313 | 2311 | ||
2314 | if (unlikely(netif_receive_skb(skb) == NET_RX_DROP)) | 2312 | if (unlikely(netif_receive_skb(skb) == NET_RX_DROP)) { |
2313 | percpu_stats->rx_dropped++; | ||
2315 | return qman_cb_dqrr_consume; | 2314 | return qman_cb_dqrr_consume; |
2315 | } | ||
2316 | 2316 | ||
2317 | percpu_stats->rx_packets++; | 2317 | percpu_stats->rx_packets++; |
2318 | percpu_stats->rx_bytes += skb_len; | 2318 | percpu_stats->rx_bytes += skb_len; |
@@ -2860,7 +2860,7 @@ static int dpaa_remove(struct platform_device *pdev) | |||
2860 | struct device *dev; | 2860 | struct device *dev; |
2861 | int err; | 2861 | int err; |
2862 | 2862 | ||
2863 | dev = &pdev->dev; | 2863 | dev = pdev->dev.parent; |
2864 | net_dev = dev_get_drvdata(dev); | 2864 | net_dev = dev_get_drvdata(dev); |
2865 | 2865 | ||
2866 | priv = netdev_priv(net_dev); | 2866 | priv = netdev_priv(net_dev); |
diff --git a/drivers/soc/fsl/qbman/qman.c b/drivers/soc/fsl/qbman/qman.c index e4f5bb056fd2..ba3cfa8e279b 100644 --- a/drivers/soc/fsl/qbman/qman.c +++ b/drivers/soc/fsl/qbman/qman.c | |||
@@ -2443,39 +2443,21 @@ struct cgr_comp { | |||
2443 | struct completion completion; | 2443 | struct completion completion; |
2444 | }; | 2444 | }; |
2445 | 2445 | ||
2446 | static int qman_delete_cgr_thread(void *p) | 2446 | static void qman_delete_cgr_smp_call(void *p) |
2447 | { | 2447 | { |
2448 | struct cgr_comp *cgr_comp = (struct cgr_comp *)p; | 2448 | qman_delete_cgr((struct qman_cgr *)p); |
2449 | int ret; | ||
2450 | |||
2451 | ret = qman_delete_cgr(cgr_comp->cgr); | ||
2452 | complete(&cgr_comp->completion); | ||
2453 | |||
2454 | return ret; | ||
2455 | } | 2449 | } |
2456 | 2450 | ||
2457 | void qman_delete_cgr_safe(struct qman_cgr *cgr) | 2451 | void qman_delete_cgr_safe(struct qman_cgr *cgr) |
2458 | { | 2452 | { |
2459 | struct task_struct *thread; | ||
2460 | struct cgr_comp cgr_comp; | ||
2461 | |||
2462 | preempt_disable(); | 2453 | preempt_disable(); |
2463 | if (qman_cgr_cpus[cgr->cgrid] != smp_processor_id()) { | 2454 | if (qman_cgr_cpus[cgr->cgrid] != smp_processor_id()) { |
2464 | init_completion(&cgr_comp.completion); | 2455 | smp_call_function_single(qman_cgr_cpus[cgr->cgrid], |
2465 | cgr_comp.cgr = cgr; | 2456 | qman_delete_cgr_smp_call, cgr, true); |
2466 | thread = kthread_create(qman_delete_cgr_thread, &cgr_comp, | ||
2467 | "cgr_del"); | ||
2468 | |||
2469 | if (IS_ERR(thread)) | ||
2470 | goto out; | ||
2471 | |||
2472 | kthread_bind(thread, qman_cgr_cpus[cgr->cgrid]); | ||
2473 | wake_up_process(thread); | ||
2474 | wait_for_completion(&cgr_comp.completion); | ||
2475 | preempt_enable(); | 2457 | preempt_enable(); |
2476 | return; | 2458 | return; |
2477 | } | 2459 | } |
2478 | out: | 2460 | |
2479 | qman_delete_cgr(cgr); | 2461 | qman_delete_cgr(cgr); |
2480 | preempt_enable(); | 2462 | preempt_enable(); |
2481 | } | 2463 | } |