diff options
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/Kconfig | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth.h | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_common.c | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.c | 67 | ||||
-rw-r--r-- | drivers/net/ethernet/freescale/dpa/dpaa_eth_unit_test.h | 3 |
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); |