diff options
Diffstat (limited to 'drivers/net/gianfar.c')
-rw-r--r-- | drivers/net/gianfar.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/net/gianfar.c b/drivers/net/gianfar.c index 61a7b4351e78..080d1cea5b26 100644 --- a/drivers/net/gianfar.c +++ b/drivers/net/gianfar.c | |||
@@ -676,7 +676,7 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev) | |||
676 | priv->rx_queue[i] = NULL; | 676 | priv->rx_queue[i] = NULL; |
677 | 677 | ||
678 | for (i = 0; i < priv->num_tx_queues; i++) { | 678 | for (i = 0; i < priv->num_tx_queues; i++) { |
679 | priv->tx_queue[i] = (struct gfar_priv_tx_q *)kmalloc( | 679 | priv->tx_queue[i] = (struct gfar_priv_tx_q *)kzalloc( |
680 | sizeof (struct gfar_priv_tx_q), GFP_KERNEL); | 680 | sizeof (struct gfar_priv_tx_q), GFP_KERNEL); |
681 | if (!priv->tx_queue[i]) { | 681 | if (!priv->tx_queue[i]) { |
682 | err = -ENOMEM; | 682 | err = -ENOMEM; |
@@ -689,7 +689,7 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev) | |||
689 | } | 689 | } |
690 | 690 | ||
691 | for (i = 0; i < priv->num_rx_queues; i++) { | 691 | for (i = 0; i < priv->num_rx_queues; i++) { |
692 | priv->rx_queue[i] = (struct gfar_priv_rx_q *)kmalloc( | 692 | priv->rx_queue[i] = (struct gfar_priv_rx_q *)kzalloc( |
693 | sizeof (struct gfar_priv_rx_q), GFP_KERNEL); | 693 | sizeof (struct gfar_priv_rx_q), GFP_KERNEL); |
694 | if (!priv->rx_queue[i]) { | 694 | if (!priv->rx_queue[i]) { |
695 | err = -ENOMEM; | 695 | err = -ENOMEM; |
@@ -1120,10 +1120,10 @@ static int gfar_probe(struct of_device *ofdev, | |||
1120 | /* provided which set of benchmarks. */ | 1120 | /* provided which set of benchmarks. */ |
1121 | printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name); | 1121 | printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name); |
1122 | for (i = 0; i < priv->num_rx_queues; i++) | 1122 | for (i = 0; i < priv->num_rx_queues; i++) |
1123 | printk(KERN_INFO "%s: :RX BD ring size for Q[%d]: %d\n", | 1123 | printk(KERN_INFO "%s: RX BD ring size for Q[%d]: %d\n", |
1124 | dev->name, i, priv->rx_queue[i]->rx_ring_size); | 1124 | dev->name, i, priv->rx_queue[i]->rx_ring_size); |
1125 | for(i = 0; i < priv->num_tx_queues; i++) | 1125 | for(i = 0; i < priv->num_tx_queues; i++) |
1126 | printk(KERN_INFO "%s:TX BD ring size for Q[%d]: %d\n", | 1126 | printk(KERN_INFO "%s: TX BD ring size for Q[%d]: %d\n", |
1127 | dev->name, i, priv->tx_queue[i]->tx_ring_size); | 1127 | dev->name, i, priv->tx_queue[i]->tx_ring_size); |
1128 | 1128 | ||
1129 | return 0; | 1129 | return 0; |
@@ -1638,13 +1638,13 @@ static void free_skb_resources(struct gfar_private *priv) | |||
1638 | /* Go through all the buffer descriptors and free their data buffers */ | 1638 | /* Go through all the buffer descriptors and free their data buffers */ |
1639 | for (i = 0; i < priv->num_tx_queues; i++) { | 1639 | for (i = 0; i < priv->num_tx_queues; i++) { |
1640 | tx_queue = priv->tx_queue[i]; | 1640 | tx_queue = priv->tx_queue[i]; |
1641 | if(!tx_queue->tx_skbuff) | 1641 | if(tx_queue->tx_skbuff) |
1642 | free_skb_tx_queue(tx_queue); | 1642 | free_skb_tx_queue(tx_queue); |
1643 | } | 1643 | } |
1644 | 1644 | ||
1645 | for (i = 0; i < priv->num_rx_queues; i++) { | 1645 | for (i = 0; i < priv->num_rx_queues; i++) { |
1646 | rx_queue = priv->rx_queue[i]; | 1646 | rx_queue = priv->rx_queue[i]; |
1647 | if(!rx_queue->rx_skbuff) | 1647 | if(rx_queue->rx_skbuff) |
1648 | free_skb_rx_queue(rx_queue); | 1648 | free_skb_rx_queue(rx_queue); |
1649 | } | 1649 | } |
1650 | 1650 | ||
@@ -2021,7 +2021,6 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2021 | } | 2021 | } |
2022 | 2022 | ||
2023 | /* setup the TxBD length and buffer pointer for the first BD */ | 2023 | /* setup the TxBD length and buffer pointer for the first BD */ |
2024 | tx_queue->tx_skbuff[tx_queue->skb_curtx] = skb; | ||
2025 | txbdp_start->bufPtr = dma_map_single(&priv->ofdev->dev, skb->data, | 2024 | txbdp_start->bufPtr = dma_map_single(&priv->ofdev->dev, skb->data, |
2026 | skb_headlen(skb), DMA_TO_DEVICE); | 2025 | skb_headlen(skb), DMA_TO_DEVICE); |
2027 | 2026 | ||
@@ -2053,6 +2052,10 @@ static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2053 | 2052 | ||
2054 | txbdp_start->lstatus = lstatus; | 2053 | txbdp_start->lstatus = lstatus; |
2055 | 2054 | ||
2055 | eieio(); /* force lstatus write before tx_skbuff */ | ||
2056 | |||
2057 | tx_queue->tx_skbuff[tx_queue->skb_curtx] = skb; | ||
2058 | |||
2056 | /* Update the current skb pointer to the next entry we will use | 2059 | /* Update the current skb pointer to the next entry we will use |
2057 | * (wrapping if necessary) */ | 2060 | * (wrapping if necessary) */ |
2058 | tx_queue->skb_curtx = (tx_queue->skb_curtx + 1) & | 2061 | tx_queue->skb_curtx = (tx_queue->skb_curtx + 1) & |
@@ -2390,6 +2393,7 @@ struct sk_buff * gfar_new_skb(struct net_device *dev) | |||
2390 | * as many bytes as needed to align the data properly | 2393 | * as many bytes as needed to align the data properly |
2391 | */ | 2394 | */ |
2392 | skb_reserve(skb, alignamount); | 2395 | skb_reserve(skb, alignamount); |
2396 | GFAR_CB(skb)->alignamount = alignamount; | ||
2393 | 2397 | ||
2394 | return skb; | 2398 | return skb; |
2395 | } | 2399 | } |
@@ -2530,13 +2534,13 @@ int gfar_clean_rx_ring(struct gfar_priv_rx_q *rx_queue, int rx_work_limit) | |||
2530 | newskb = skb; | 2534 | newskb = skb; |
2531 | else if (skb) { | 2535 | else if (skb) { |
2532 | /* | 2536 | /* |
2533 | * We need to reset ->data to what it | 2537 | * We need to un-reserve() the skb to what it |
2534 | * was before gfar_new_skb() re-aligned | 2538 | * was before gfar_new_skb() re-aligned |
2535 | * it to an RXBUF_ALIGNMENT boundary | 2539 | * it to an RXBUF_ALIGNMENT boundary |
2536 | * before we put the skb back on the | 2540 | * before we put the skb back on the |
2537 | * recycle list. | 2541 | * recycle list. |
2538 | */ | 2542 | */ |
2539 | skb->data = skb->head + NET_SKB_PAD; | 2543 | skb_reserve(skb, -GFAR_CB(skb)->alignamount); |
2540 | __skb_queue_head(&priv->rx_recycle, skb); | 2544 | __skb_queue_head(&priv->rx_recycle, skb); |
2541 | } | 2545 | } |
2542 | } else { | 2546 | } else { |