From 2f367dee0d31fa33400f7378b03093cf87643674 Mon Sep 17 00:00:00 2001 From: Marian Rotariu Date: Thu, 27 Jun 2013 21:39:17 +0000 Subject: 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 Change-Id: I3cba65a13599e031dbfe14542699e7e74ac19c1c Reviewed-on: http://git.am.freescale.net:8181/3206 Reviewed-by: Bucur Madalin-Cristian-B32716 Reviewed-by: Sovaiala Cristian-Constantin-B39531 Reviewed-by: Fleming Andrew-AFLEMING Tested-by: Fleming Andrew-AFLEMING 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 +#include #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); -- cgit v0.10.2