summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);