summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarian Rotariu <marian.rotariu@freescale.com>2013-06-27 21:39:17 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-07-15 21:49:40 (GMT)
commit2f367dee0d31fa33400f7378b03093cf87643674 (patch)
tree33d47ab75f5284af3d64820d98f98e3209aa6b3b
parentcad948fa3296c470fe51c45d5b1861d142138c7a (diff)
downloadlinux-fsl-qoriq-2f367dee0d31fa33400f7378b03093cf87643674.tar.xz
dpaa_eth: Fix unit tests
The unit tests will use the default pool as the buffer pool. Because at bootup the pool is empty, buffer seeding and draining must be provided around the tests. Signed-off-by: Marian Rotariu <marian.rotariu@freescale.com> Change-Id: I3cba65a13599e031dbfe14542699e7e74ac19c1c Reviewed-on: http://git.am.freescale.net:8181/3206 Reviewed-by: Bucur Madalin-Cristian-B32716 <madalin.bucur@freescale.com> Reviewed-by: Sovaiala Cristian-Constantin-B39531 <Cristian.Sovaiala@freescale.com> Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com> Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
-rw-r--r--drivers/net/ethernet/freescale/dpa/Kconfig4
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth.c6
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth.h16
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c16
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.c67
-rw-r--r--drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.h3
6 files changed, 92 insertions, 20 deletions
diff --git a/drivers/net/ethernet/freescale/dpa/Kconfig b/drivers/net/ethernet/freescale/dpa/Kconfig
index 801e8b2..06ea4f9 100644
--- a/drivers/net/ethernet/freescale/dpa/Kconfig
+++ b/drivers/net/ethernet/freescale/dpa/Kconfig
@@ -121,9 +121,11 @@ config FSL_DPAA_ETH_REFILL_THRESHOLD
modify this value unless one has very specific performance reasons.
config FSL_DPAA_ETH_UNIT_TESTS
- bool
+ bool "DPAA Ethernet unit tests"
depends on FSL_DPAA_ETH
default n
+ ---help---
+ A series of tests that will verify basic functionality of DPAA Ethernet driver at bootup.
config FSL_DPAA_ETH_DEBUGFS
tristate "DPAA Ethernet debugfs interface"
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c
index 1266d6b..cca3383 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.c
@@ -118,9 +118,9 @@ int dpa_free_pcd_fqids(struct device *, uint32_t) __attribute__((weak));
#define DPAA_ETH_MAX_PAD (L1_CACHE_BYTES * 8)
-static struct dpa_bp *default_pool;
-static bool default_pool_seeded;
-static uint32_t default_buf_size;
+struct dpa_bp *default_pool;
+bool default_pool_seeded;
+uint32_t default_buf_size;
/* A set of callbacks for hooking into the fastpath at different points. */
struct dpaa_eth_hooks_s dpaa_eth_hooks;
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth.h b/drivers/net/ethernet/freescale/dpa/dpaa_eth.h
index 7b2155d..e3e5d69 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth.h
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth.h
@@ -672,4 +672,20 @@ static inline void _dpa_assign_wq(struct dpa_fq *fq)
skb_get_queue_mapping(skb)
#endif
+#ifndef CONFIG_FSL_DPAA_ETH_SG_SUPPORT
+static inline void _dpa_bp_free_buf(void *addr)
+{
+ struct sk_buff **skbh = addr;
+ struct sk_buff *skb;
+
+ skb = *skbh;
+ dev_kfree_skb_any(skb);
+}
+#else
+static inline void _dpa_bp_free_buf(void *addr)
+{
+ free_page((unsigned long)addr);
+}
+#endif
+
#endif /* __DPA_H */
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
index 3274a49..68e92db 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c
@@ -977,22 +977,6 @@ int dpa_bp_create(struct net_device *net_dev, struct dpa_bp *dpa_bp,
return 0;
}
-#ifndef CONFIG_FSL_DPAA_ETH_SG_SUPPORT
-static inline void _dpa_bp_free_buf(void *addr)
-{
- struct sk_buff **skbh = addr;
- struct sk_buff *skb;
-
- skb = *skbh;
- dev_kfree_skb_any(skb);
-}
-#else
-static inline void _dpa_bp_free_buf(void *addr)
-{
- free_page((unsigned long)addr);
-}
-#endif
-
static void __cold __attribute__((nonnull))
_dpa_bp_free(struct dpa_bp *dpa_bp)
{
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.c b/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.c
index fb82b63..46e8808 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.c
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.c
@@ -29,6 +29,8 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include <linux/module.h>
+#include <linux/fsl_bman.h>
#include "dpaa_eth.h"
#include "dpaa_eth_unit_test.h"
@@ -335,12 +337,77 @@ fq_create_fail:
return err;
}
+void dpa_unit_test_drain_default_pool(struct net_device *net_dev)
+{
+ int i;
+ int num;
+ struct dpa_priv_s *priv;
+ struct dpa_percpu_priv_s *percpu_priv;
+
+ priv = netdev_priv(net_dev);
+
+ do {
+ struct bm_buffer bmb[8];
+
+ num = bman_acquire(default_pool->pool, bmb, 8, 0);
+
+ for (i = 0; i < num; i++) {
+ dma_addr_t addr = bm_buf_addr(&bmb[i]);
+
+ dma_unmap_single(default_pool->dev, addr,
+ default_pool->size,
+ DMA_BIDIRECTIONAL);
+
+ _dpa_bp_free_buf(phys_to_virt(addr));
+ }
+ } while (num == 8);
+
+ /* restore counters to their previous state */
+ free_percpu(default_pool->percpu_count);
+
+ for_each_online_cpu(i) {
+ percpu_priv = per_cpu_ptr(priv->percpu_priv, i);
+ percpu_priv->dpa_bp = NULL;
+ percpu_priv->dpa_bp_count = NULL;
+ }
+}
+
+void dpa_unit_test_seed_default_pool(struct net_device *net_dev)
+{
+ int i;
+ struct dpa_priv_s *priv;
+ struct dpa_percpu_priv_s *percpu_priv;
+
+ priv = netdev_priv(net_dev);
+
+ default_pool->size = default_buf_size;
+ dpa_make_private_pool(default_pool);
+
+ for_each_online_cpu(i) {
+ percpu_priv = per_cpu_ptr(priv->percpu_priv, i);
+ if (!percpu_priv->dpa_bp) {
+ percpu_priv->dpa_bp = priv->dpa_bp;
+ percpu_priv->dpa_bp_count =
+ per_cpu_ptr(priv->dpa_bp->percpu_count,
+ i);
+ }
+ }
+}
+
void dpa_unit_tests(struct net_device *net_dev)
{
int err;
+ /* the unit tests use the default pool */
+ if (!default_pool)
+ return;
+
if (!tx_unit_test_ran) {
+ dpa_unit_test_seed_default_pool(net_dev);
+
err = dpa_tx_unit_test(net_dev);
WARN_ON(err);
+
+ dpa_unit_test_drain_default_pool(net_dev);
}
}
diff --git a/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.h b/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.h
index 9c05e6b..21ee967 100644
--- a/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.h
+++ b/drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.h
@@ -34,6 +34,9 @@
#define DPAA_ETH_UNIT_TEST_H_
extern int dpa_max_frm;
+extern struct dpa_bp *default_pool;
+extern bool default_pool_seeded;
+extern uint32_t default_buf_size;
void dpa_unit_tests(struct net_device *net_dev);