aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/b44.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/b44.c')
-rw-r--r--drivers/net/b44.c30
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/net/b44.c b/drivers/net/b44.c
index d10d31cd12d7..8fdcb698d611 100644
--- a/drivers/net/b44.c
+++ b/drivers/net/b44.c
@@ -15,6 +15,7 @@
15#include <linux/ethtool.h> 15#include <linux/ethtool.h>
16#include <linux/mii.h> 16#include <linux/mii.h>
17#include <linux/if_ether.h> 17#include <linux/if_ether.h>
18#include <linux/if_vlan.h>
18#include <linux/etherdevice.h> 19#include <linux/etherdevice.h>
19#include <linux/pci.h> 20#include <linux/pci.h>
20#include <linux/delay.h> 21#include <linux/delay.h>
@@ -68,7 +69,8 @@
68 (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP)) 69 (BP)->tx_cons - (BP)->tx_prod - TX_RING_GAP(BP))
69#define NEXT_TX(N) (((N) + 1) & (B44_TX_RING_SIZE - 1)) 70#define NEXT_TX(N) (((N) + 1) & (B44_TX_RING_SIZE - 1))
70 71
71#define RX_PKT_BUF_SZ (1536 + bp->rx_offset + 64) 72#define RX_PKT_OFFSET 30
73#define RX_PKT_BUF_SZ (1536 + RX_PKT_OFFSET + 64)
72 74
73/* minimum number of free TX descriptors required to wake up TX process */ 75/* minimum number of free TX descriptors required to wake up TX process */
74#define B44_TX_WAKEUP_THRESH (B44_TX_RING_SIZE / 4) 76#define B44_TX_WAKEUP_THRESH (B44_TX_RING_SIZE / 4)
@@ -683,10 +685,9 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
683 } 685 }
684 686
685 skb->dev = bp->dev; 687 skb->dev = bp->dev;
686 skb_reserve(skb, bp->rx_offset); 688 rh = (struct rx_header *) skb->data;
689 skb_reserve(skb, RX_PKT_OFFSET);
687 690
688 rh = (struct rx_header *)
689 (skb->data - bp->rx_offset);
690 rh->len = 0; 691 rh->len = 0;
691 rh->flags = 0; 692 rh->flags = 0;
692 693
@@ -696,13 +697,13 @@ static int b44_alloc_rx_skb(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
696 if (src_map != NULL) 697 if (src_map != NULL)
697 src_map->skb = NULL; 698 src_map->skb = NULL;
698 699
699 ctrl = (DESC_CTRL_LEN & (RX_PKT_BUF_SZ - bp->rx_offset)); 700 ctrl = (DESC_CTRL_LEN & (RX_PKT_BUF_SZ - RX_PKT_OFFSET));
700 if (dest_idx == (B44_RX_RING_SIZE - 1)) 701 if (dest_idx == (B44_RX_RING_SIZE - 1))
701 ctrl |= DESC_CTRL_EOT; 702 ctrl |= DESC_CTRL_EOT;
702 703
703 dp = &bp->rx_ring[dest_idx]; 704 dp = &bp->rx_ring[dest_idx];
704 dp->ctrl = cpu_to_le32(ctrl); 705 dp->ctrl = cpu_to_le32(ctrl);
705 dp->addr = cpu_to_le32((u32) mapping + bp->rx_offset + bp->dma_offset); 706 dp->addr = cpu_to_le32((u32) mapping + RX_PKT_OFFSET + bp->dma_offset);
706 707
707 if (bp->flags & B44_FLAG_RX_RING_HACK) 708 if (bp->flags & B44_FLAG_RX_RING_HACK)
708 b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma, 709 b44_sync_dma_desc_for_device(bp->pdev, bp->rx_ring_dma,
@@ -781,7 +782,7 @@ static int b44_rx(struct b44 *bp, int budget)
781 PCI_DMA_FROMDEVICE); 782 PCI_DMA_FROMDEVICE);
782 rh = (struct rx_header *) skb->data; 783 rh = (struct rx_header *) skb->data;
783 len = le16_to_cpu(rh->len); 784 len = le16_to_cpu(rh->len);
784 if ((len > (RX_PKT_BUF_SZ - bp->rx_offset)) || 785 if ((len > (RX_PKT_BUF_SZ - RX_PKT_OFFSET)) ||
785 (rh->flags & cpu_to_le16(RX_FLAG_ERRORS))) { 786 (rh->flags & cpu_to_le16(RX_FLAG_ERRORS))) {
786 drop_it: 787 drop_it:
787 b44_recycle_rx(bp, cons, bp->rx_prod); 788 b44_recycle_rx(bp, cons, bp->rx_prod);
@@ -813,8 +814,8 @@ static int b44_rx(struct b44 *bp, int budget)
813 pci_unmap_single(bp->pdev, map, 814 pci_unmap_single(bp->pdev, map,
814 skb_size, PCI_DMA_FROMDEVICE); 815 skb_size, PCI_DMA_FROMDEVICE);
815 /* Leave out rx_header */ 816 /* Leave out rx_header */
816 skb_put(skb, len+bp->rx_offset); 817 skb_put(skb, len + RX_PKT_OFFSET);
817 skb_pull(skb,bp->rx_offset); 818 skb_pull(skb, RX_PKT_OFFSET);
818 } else { 819 } else {
819 struct sk_buff *copy_skb; 820 struct sk_buff *copy_skb;
820 821
@@ -826,7 +827,7 @@ static int b44_rx(struct b44 *bp, int budget)
826 skb_reserve(copy_skb, 2); 827 skb_reserve(copy_skb, 2);
827 skb_put(copy_skb, len); 828 skb_put(copy_skb, len);
828 /* DMA sync done above, copy just the actual packet */ 829 /* DMA sync done above, copy just the actual packet */
829 skb_copy_from_linear_data_offset(skb, bp->rx_offset, 830 skb_copy_from_linear_data_offset(skb, RX_PKT_OFFSET,
830 copy_skb->data, len); 831 copy_skb->data, len);
831 skb = copy_skb; 832 skb = copy_skb;
832 } 833 }
@@ -1393,12 +1394,12 @@ static void b44_init_hw(struct b44 *bp, int reset_kind)
1393 bw32(bp, B44_TX_WMARK, 56); /* XXX magic */ 1394 bw32(bp, B44_TX_WMARK, 56); /* XXX magic */
1394 if (reset_kind == B44_PARTIAL_RESET) { 1395 if (reset_kind == B44_PARTIAL_RESET) {
1395 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | 1396 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
1396 (bp->rx_offset << DMARX_CTRL_ROSHIFT))); 1397 (RX_PKT_OFFSET << DMARX_CTRL_ROSHIFT)));
1397 } else { 1398 } else {
1398 bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE); 1399 bw32(bp, B44_DMATX_CTRL, DMATX_CTRL_ENABLE);
1399 bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset); 1400 bw32(bp, B44_DMATX_ADDR, bp->tx_ring_dma + bp->dma_offset);
1400 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE | 1401 bw32(bp, B44_DMARX_CTRL, (DMARX_CTRL_ENABLE |
1401 (bp->rx_offset << DMARX_CTRL_ROSHIFT))); 1402 (RX_PKT_OFFSET << DMARX_CTRL_ROSHIFT)));
1402 bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset); 1403 bw32(bp, B44_DMARX_ADDR, bp->rx_ring_dma + bp->dma_offset);
1403 1404
1404 bw32(bp, B44_DMARX_PTR, bp->rx_pending); 1405 bw32(bp, B44_DMARX_PTR, bp->rx_pending);
@@ -2090,11 +2091,6 @@ static int __devinit b44_get_invariants(struct b44 *bp)
2090 2091
2091 bp->phy_addr = eeprom[90] & 0x1f; 2092 bp->phy_addr = eeprom[90] & 0x1f;
2092 2093
2093 /* With this, plus the rx_header prepended to the data by the
2094 * hardware, we'll land the ethernet header on a 2-byte boundary.
2095 */
2096 bp->rx_offset = 30;
2097
2098 bp->imask = IMASK_DEF; 2094 bp->imask = IMASK_DEF;
2099 2095
2100 bp->core_unit = ssb_core_unit(bp); 2096 bp->core_unit = ssb_core_unit(bp);