[PATCH v2 net-next 8/8] net: mvneta: Use the new hwbm framework
Now that the hardware buffer management framework had been introduced, let's use it. Signed-off-by: Gregory CLEMENT--- drivers/net/ethernet/marvell/Kconfig | 1 + drivers/net/ethernet/marvell/mvneta.c| 45 +++--- drivers/net/ethernet/marvell/mvneta_bm.c | 140 +++ drivers/net/ethernet/marvell/mvneta_bm.h | 11 +-- 4 files changed, 69 insertions(+), 128 deletions(-) diff --git a/drivers/net/ethernet/marvell/Kconfig b/drivers/net/ethernet/marvell/Kconfig index 6c8dc6d62572..3ae9450c7f1c 100644 --- a/drivers/net/ethernet/marvell/Kconfig +++ b/drivers/net/ethernet/marvell/Kconfig @@ -43,6 +43,7 @@ config MVMDIO config MVNETA_BM tristate "Marvell Armada 38x/XP network interface BM support" depends on MVNETA + select HWBM ---help--- This driver supports auxiliary block of the network interface units in the Marvell ARMADA XP and ARMADA 38x SoC diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 1db70565ce8b..981d786b270e 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "mvneta_bm.h" #include #include @@ -1018,11 +1019,12 @@ static int mvneta_bm_port_init(struct platform_device *pdev, static void mvneta_bm_update_mtu(struct mvneta_port *pp, int mtu) { struct mvneta_bm_pool *bm_pool = pp->pool_long; + struct hwbm_pool *hwbm_pool = _pool->hwbm_pool; int num; /* Release all buffers from long pool */ mvneta_bm_bufs_free(pp->bm_priv, bm_pool, 1 << pp->id); - if (bm_pool->buf_num) { + if (hwbm_pool->buf_num) { WARN(1, "cannot free all buffers in pool %d\n", bm_pool->id); goto bm_mtu_err; @@ -1030,14 +1032,14 @@ static void mvneta_bm_update_mtu(struct mvneta_port *pp, int mtu) bm_pool->pkt_size = MVNETA_RX_PKT_SIZE(mtu); bm_pool->buf_size = MVNETA_RX_BUF_SIZE(bm_pool->pkt_size); - bm_pool->frag_size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) + + hwbm_pool->size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) + SKB_DATA_ALIGN(MVNETA_RX_BUF_SIZE(bm_pool->pkt_size)); /* Fill entire long pool */ - num = mvneta_bm_bufs_add(pp->bm_priv, bm_pool, bm_pool->size); - if (num != bm_pool->size) { + num = hwbm_pool_add(hwbm_pool, hwbm_pool->size, GFP_ATOMIC); + if (num != hwbm_pool->size) { WARN(1, "pool %d: %d of %d allocated\n", -bm_pool->id, num, bm_pool->size); +bm_pool->id, num, hwbm_pool->size); goto bm_mtu_err; } mvneta_bm_pool_bufsize_set(pp, bm_pool->buf_size, bm_pool->id); @@ -1717,6 +1719,14 @@ static void mvneta_txq_done(struct mvneta_port *pp, } } +void *mvneta_frag_alloc(unsigned int frag_size) +{ + if (likely(frag_size <= PAGE_SIZE)) + return netdev_alloc_frag(frag_size); + else + return kmalloc(frag_size, GFP_ATOMIC); +} + /* Refill processing for SW buffer management */ static int mvneta_rx_refill(struct mvneta_port *pp, struct mvneta_rx_desc *rx_desc) @@ -1772,6 +1782,14 @@ static u32 mvneta_skb_tx_csum(struct mvneta_port *pp, struct sk_buff *skb) return MVNETA_TX_L4_CSUM_NOT; } +void mvneta_frag_free(unsigned int frag_size, void *data) +{ + if (likely(frag_size <= PAGE_SIZE)) + skb_free_frag(data); + else + kfree(data); +} + /* Drop packets received by the RXQ and free buffers */ static void mvneta_rxq_drop_pkts(struct mvneta_port *pp, struct mvneta_rx_queue *rxq) @@ -1892,7 +1910,8 @@ err_drop_frame: } /* Refill processing */ - err = bm_in_use ? mvneta_bm_pool_refill(pp->bm_priv, bm_pool) : + err = bm_in_use ? hwbm_pool_refill(_pool->hwbm_pool, + GFP_ATOMIC) : mvneta_rx_refill(pp, rx_desc); if (err) { netdev_err(dev, "Linux processing - Can't refill\n"); @@ -1900,7 +1919,8 @@ err_drop_frame: goto err_drop_frame_ret_pool; } - frag_size = bm_in_use ? bm_pool->frag_size : pp->frag_size; + frag_size = bm_in_use ? bm_pool->hwbm_pool.size : + pp->frag_size; skb = build_skb(data, frag_size > PAGE_SIZE ? 0 : frag_size); @@ -3963,11 +3983,6 @@ static int mvneta_probe(struct platform_device *pdev) dev->priv_flags |= IFF_UNICAST_FLT; dev->gso_max_segs = MVNETA_MAX_TSO_SEGS; - err = register_netdev(dev); - if (err < 0) { -
[PATCH v2 net-next 8/8] net: mvneta: Use the new hwbm framework
Now that the hardware buffer management framework had been introduced, let's use it. Signed-off-by: Gregory CLEMENT --- drivers/net/ethernet/marvell/Kconfig | 1 + drivers/net/ethernet/marvell/mvneta.c| 45 +++--- drivers/net/ethernet/marvell/mvneta_bm.c | 140 +++ drivers/net/ethernet/marvell/mvneta_bm.h | 11 +-- 4 files changed, 69 insertions(+), 128 deletions(-) diff --git a/drivers/net/ethernet/marvell/Kconfig b/drivers/net/ethernet/marvell/Kconfig index 6c8dc6d62572..3ae9450c7f1c 100644 --- a/drivers/net/ethernet/marvell/Kconfig +++ b/drivers/net/ethernet/marvell/Kconfig @@ -43,6 +43,7 @@ config MVMDIO config MVNETA_BM tristate "Marvell Armada 38x/XP network interface BM support" depends on MVNETA + select HWBM ---help--- This driver supports auxiliary block of the network interface units in the Marvell ARMADA XP and ARMADA 38x SoC diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c index 1db70565ce8b..981d786b270e 100644 --- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "mvneta_bm.h" #include #include @@ -1018,11 +1019,12 @@ static int mvneta_bm_port_init(struct platform_device *pdev, static void mvneta_bm_update_mtu(struct mvneta_port *pp, int mtu) { struct mvneta_bm_pool *bm_pool = pp->pool_long; + struct hwbm_pool *hwbm_pool = _pool->hwbm_pool; int num; /* Release all buffers from long pool */ mvneta_bm_bufs_free(pp->bm_priv, bm_pool, 1 << pp->id); - if (bm_pool->buf_num) { + if (hwbm_pool->buf_num) { WARN(1, "cannot free all buffers in pool %d\n", bm_pool->id); goto bm_mtu_err; @@ -1030,14 +1032,14 @@ static void mvneta_bm_update_mtu(struct mvneta_port *pp, int mtu) bm_pool->pkt_size = MVNETA_RX_PKT_SIZE(mtu); bm_pool->buf_size = MVNETA_RX_BUF_SIZE(bm_pool->pkt_size); - bm_pool->frag_size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) + + hwbm_pool->size = SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) + SKB_DATA_ALIGN(MVNETA_RX_BUF_SIZE(bm_pool->pkt_size)); /* Fill entire long pool */ - num = mvneta_bm_bufs_add(pp->bm_priv, bm_pool, bm_pool->size); - if (num != bm_pool->size) { + num = hwbm_pool_add(hwbm_pool, hwbm_pool->size, GFP_ATOMIC); + if (num != hwbm_pool->size) { WARN(1, "pool %d: %d of %d allocated\n", -bm_pool->id, num, bm_pool->size); +bm_pool->id, num, hwbm_pool->size); goto bm_mtu_err; } mvneta_bm_pool_bufsize_set(pp, bm_pool->buf_size, bm_pool->id); @@ -1717,6 +1719,14 @@ static void mvneta_txq_done(struct mvneta_port *pp, } } +void *mvneta_frag_alloc(unsigned int frag_size) +{ + if (likely(frag_size <= PAGE_SIZE)) + return netdev_alloc_frag(frag_size); + else + return kmalloc(frag_size, GFP_ATOMIC); +} + /* Refill processing for SW buffer management */ static int mvneta_rx_refill(struct mvneta_port *pp, struct mvneta_rx_desc *rx_desc) @@ -1772,6 +1782,14 @@ static u32 mvneta_skb_tx_csum(struct mvneta_port *pp, struct sk_buff *skb) return MVNETA_TX_L4_CSUM_NOT; } +void mvneta_frag_free(unsigned int frag_size, void *data) +{ + if (likely(frag_size <= PAGE_SIZE)) + skb_free_frag(data); + else + kfree(data); +} + /* Drop packets received by the RXQ and free buffers */ static void mvneta_rxq_drop_pkts(struct mvneta_port *pp, struct mvneta_rx_queue *rxq) @@ -1892,7 +1910,8 @@ err_drop_frame: } /* Refill processing */ - err = bm_in_use ? mvneta_bm_pool_refill(pp->bm_priv, bm_pool) : + err = bm_in_use ? hwbm_pool_refill(_pool->hwbm_pool, + GFP_ATOMIC) : mvneta_rx_refill(pp, rx_desc); if (err) { netdev_err(dev, "Linux processing - Can't refill\n"); @@ -1900,7 +1919,8 @@ err_drop_frame: goto err_drop_frame_ret_pool; } - frag_size = bm_in_use ? bm_pool->frag_size : pp->frag_size; + frag_size = bm_in_use ? bm_pool->hwbm_pool.size : + pp->frag_size; skb = build_skb(data, frag_size > PAGE_SIZE ? 0 : frag_size); @@ -3963,11 +3983,6 @@ static int mvneta_probe(struct platform_device *pdev) dev->priv_flags |= IFF_UNICAST_FLT; dev->gso_max_segs = MVNETA_MAX_TSO_SEGS; - err = register_netdev(dev); - if (err < 0) { - dev_err(>dev, "failed to