Skip to content

Commit

Permalink
8139cp: set ring address before enabling receiver
Browse files Browse the repository at this point in the history
Currently, we enable the receiver before setting the ring address which could
lead the card DMA into unexpected areas. Solving this by set the ring address
before enabling the receiver.

btw. I find and test this in qemu as I didn't have a 8139cp card in hand. please
review it carefully.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
jasowang authored and davem330 committed Jun 1, 2012
1 parent 20e2a86 commit b01af45
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions drivers/net/ethernet/realtek/8139cp.c
Expand Up @@ -979,6 +979,17 @@ static void cp_init_hw (struct cp_private *cp)
cpw32_f (MAC0 + 0, le32_to_cpu (*(__le32 *) (dev->dev_addr + 0)));
cpw32_f (MAC0 + 4, le32_to_cpu (*(__le32 *) (dev->dev_addr + 4)));

cpw32_f(HiTxRingAddr, 0);
cpw32_f(HiTxRingAddr + 4, 0);

ring_dma = cp->ring_dma;
cpw32_f(RxRingAddr, ring_dma & 0xffffffff);
cpw32_f(RxRingAddr + 4, (ring_dma >> 16) >> 16);

ring_dma += sizeof(struct cp_desc) * CP_RX_RING_SIZE;
cpw32_f(TxRingAddr, ring_dma & 0xffffffff);
cpw32_f(TxRingAddr + 4, (ring_dma >> 16) >> 16);

cp_start_hw(cp);
cpw8(TxThresh, 0x06); /* XXX convert magic num to a constant */

Expand All @@ -992,17 +1003,6 @@ static void cp_init_hw (struct cp_private *cp)

cpw8(Config5, cpr8(Config5) & PMEStatus);

cpw32_f(HiTxRingAddr, 0);
cpw32_f(HiTxRingAddr + 4, 0);

ring_dma = cp->ring_dma;
cpw32_f(RxRingAddr, ring_dma & 0xffffffff);
cpw32_f(RxRingAddr + 4, (ring_dma >> 16) >> 16);

ring_dma += sizeof(struct cp_desc) * CP_RX_RING_SIZE;
cpw32_f(TxRingAddr, ring_dma & 0xffffffff);
cpw32_f(TxRingAddr + 4, (ring_dma >> 16) >> 16);

cpw16(MultiIntr, 0);

cpw8_f(Cfg9346, Cfg9346_Lock);
Expand Down

0 comments on commit b01af45

Please sign in to comment.