diff options
author | Zhangfei Gao <zhangfei.gao@linaro.org> | 2014-03-18 11:46:52 +0800 |
---|---|---|
committer | Zhangfei Gao <zhangfei.gao@linaro.org> | 2014-03-18 11:47:22 +0800 |
commit | 626a8d49e2d127f9491397bf827e8c7db75e6677 (patch) | |
tree | 1038dbff7c0eddaa76dfa5c822d06a8ed740558f | |
parent | c8af35bd568bd1f1500c4e9c27213f6762072a37 (diff) |
ether: hip04: use build_skbtracking-hilt-ether-polish-0317
If check performance with old method, pls #define OBSOLETE_BUFFER
Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org>
-rw-r--r-- | drivers/net/ethernet/hisilicon/hip04_eth.c | 74 |
1 files changed, 34 insertions, 40 deletions
diff --git a/drivers/net/ethernet/hisilicon/hip04_eth.c b/drivers/net/ethernet/hisilicon/hip04_eth.c index 877526b95ed3..4470588ef2bc 100644 --- a/drivers/net/ethernet/hisilicon/hip04_eth.c +++ b/drivers/net/ethernet/hisilicon/hip04_eth.c @@ -66,8 +66,6 @@ #define DRV_NAME "hip04-ether" -#define OBSOLETE_BUFFER - struct tx_desc { u32 send_addr; u16 send_size; @@ -317,7 +315,6 @@ hip04_rx_refill_one_buffer(struct net_device *ndev, unsigned int index) if (NULL == skb) return -ENOMEM; - memset(skb->data, 0x0, RX_BUF_SIZE); priv->rx_skb[index] = skb; dma_map_single(&(ndev->dev), skb->data, RX_BUF_SIZE, DMA_TO_DEVICE); hip04_set_recv_desc(priv, virt_to_phys(skb->data)); @@ -367,12 +364,14 @@ static int hip04_rx_poll(struct napi_struct *napi, int budget) #ifdef OBSOLETE_BUFFER hip04_rx_refill_one_buffer(ndev, priv->rx_head); #else - dma_map_single(&ndev->dev, buf, RX_BUF_SIZE, DMA_TO_DEVICE); - /* reuse the buffer after data exhausted */ + buf = netdev_alloc_frag(priv->rx_buf_size); + if (!buf) + return -ENOMEM; + priv->rx_buf[priv->rx_head] = buf; hip04_set_recv_desc(priv, virt_to_phys(buf)); + dma_map_single(&ndev->dev, buf, RX_BUF_SIZE, DMA_TO_DEVICE); #endif priv->rx_head = RX_NEXT(priv->rx_head); - if (rx++ >= budget) break; @@ -555,30 +554,14 @@ static struct net_device_ops hip04_netdev_ops = { .ndo_change_mtu = eth_change_mtu, }; -#ifdef OBSOLETE_BUFFER -static int hip04_rx_ring_init(struct net_device *dev) -{ - struct hip04_priv *priv = netdev_priv(dev); - struct sk_buff *skb = NULL; - unsigned int i; - - for (i = 0; i < RX_DESC_NUM; i++) { - skb = dev_alloc_skb(RX_BUF_SIZE); - if (NULL == skb) - return -ENOMEM; - priv->rx_skb[i] = skb; - } - priv->rx_head = 0; - return 0; -} -#endif - static int hip04_alloc_ring(struct net_device *ndev, struct device *d) { struct hip04_priv *priv = netdev_priv(ndev); - void *base; int i; + priv->rx_buf_size = RX_BUF_SIZE + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + priv->desc_pool = dma_pool_create(DRV_NAME, d, sizeof(struct tx_desc), SKB_DATA_ALIGN(sizeof(struct tx_desc)), 0); if (!priv->desc_pool) @@ -591,18 +574,21 @@ static int hip04_alloc_ring(struct net_device *ndev, struct device *d) return -ENOMEM; } -#ifndef OBSOLETE_BUFFER - priv->rx_head = 0; - priv->rx_buf_size = RX_BUF_SIZE + - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); - /* mallco one more buffer for SKB_DATA_ALIGN */ - base = devm_kzalloc(d, priv->rx_buf_size * (RX_DESC_NUM + 1), - GFP_ATOMIC); - if (!base) - return -ENOMEM; - base = (void *)SKB_DATA_ALIGN((unsigned int)base); - for (i = 0; i < RX_DESC_NUM; i++) - priv->rx_buf[i] = base + i * priv->rx_buf_size; +#ifdef OBSOLETE_BUFFER + for (i = 0; i < RX_DESC_NUM; i++) { + struct sk_buff *skb = NULL; + skb = dev_alloc_skb(RX_BUF_SIZE); + if (NULL == skb) + return -ENOMEM; + priv->rx_skb[i] = skb; + } +#else + for (i = 0; i < RX_DESC_NUM; i++) { + priv->rx_buf[i] = netdev_alloc_frag(priv->rx_buf_size); + if (!priv->rx_buf[i]) + return -ENOMEM; + } + #endif return 0; } @@ -612,6 +598,15 @@ static void hip04_free_ring(struct net_device *dev) struct hip04_priv *priv = netdev_priv(dev); int i; + for (i = 0; i < RX_DESC_NUM; i++) +#ifdef OBSOLETE_BUFFER + if (priv->rx_skb[i]) + dev_kfree_skb_any(priv->rx_skb[i]); +#else + if (priv->rx_buf[i]) + put_page(virt_to_head_page(priv->rx_buf[i])); +#endif + for (i = 0; i < TX_DESC_NUM; i++) { if (priv->tx_skb[i]) dev_kfree_skb_any(priv->tx_skb[i]); @@ -709,9 +704,7 @@ static int hip04_mac_probe(struct platform_device *pdev) hip04_config_fifo(priv); random_ether_addr(ndev->dev_addr); hip04_update_mac_address(ndev); -#ifdef OBSOLETE_BUFFER - hip04_rx_ring_init(ndev); -#endif + ret = hip04_alloc_ring(ndev, d); if (ret) { netdev_err(ndev, "alloc ring fail\n"); @@ -747,6 +740,7 @@ static int hip04_remove(struct platform_device *pdev) struct net_device *ndev = platform_get_drvdata(pdev); struct hip04_priv *priv = netdev_priv(ndev); + hip04_free_ring(ndev); unregister_netdev(ndev); free_irq(ndev->irq, ndev); of_node_put(priv->phy_node); |