aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhangfei Gao <zhangfei.gao@linaro.org>2014-03-18 11:46:52 +0800
committerZhangfei Gao <zhangfei.gao@linaro.org>2014-03-18 11:47:22 +0800
commit626a8d49e2d127f9491397bf827e8c7db75e6677 (patch)
tree1038dbff7c0eddaa76dfa5c822d06a8ed740558f
parentc8af35bd568bd1f1500c4e9c27213f6762072a37 (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.c74
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);