Commit 1c28f6ba authored by Stephen Hemminger's avatar Stephen Hemminger Committed by Jeff Garzik

[PATCH] sky2: fix ram buffer for Yukon FE rev 2

Fix problems with Yukon FE rev 2 chipset. Don't cut and paste bugs in from
sk98lin driver. Change how the ram buffer is divided up, and make the math
clearer. Also, set the thresholds where rx takes precedence. The threshold
values are just guesses at this point, it might be worth tuning them later.
Signed-off-by: default avatarStephen Hemminger <shemminger@osdl.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent e0c94455
...@@ -625,13 +625,16 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port) ...@@ -625,13 +625,16 @@ static void sky2_mac_init(struct sky2_hw *hw, unsigned port)
} }
static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, size_t len) /* Assign Ram Buffer allocation.
* start and end are in units of 4k bytes
* ram registers are in units of 64bit words
*/
static void sky2_ramset(struct sky2_hw *hw, u16 q, u8 startk, u8 endk)
{ {
u32 end; u32 start, end;
start /= 8; start = startk * 4096/8;
len /= 8; end = (endk * 4096/8) - 1;
end = start + len - 1;
sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR); sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
sky2_write32(hw, RB_ADDR(q, RB_START), start); sky2_write32(hw, RB_ADDR(q, RB_START), start);
...@@ -640,14 +643,19 @@ static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, size_t len) ...@@ -640,14 +643,19 @@ static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, size_t len)
sky2_write32(hw, RB_ADDR(q, RB_RP), start); sky2_write32(hw, RB_ADDR(q, RB_RP), start);
if (q == Q_R1 || q == Q_R2) { if (q == Q_R1 || q == Q_R2) {
u32 rxup, rxlo; u32 space = (endk - startk) * 4096/8;
u32 tp = space - space/4;
rxlo = len/2; /* On receive queue's set the thresholds
rxup = rxlo + len/4; * give receiver priority when > 3/4 full
* send pause when down to 2K
*/
sky2_write32(hw, RB_ADDR(q, RB_RX_UTHP), tp);
sky2_write32(hw, RB_ADDR(q, RB_RX_LTHP), space/2);
/* Set thresholds on receive queue's */ tp = space - 2048/8;
sky2_write32(hw, RB_ADDR(q, RB_RX_UTPP), rxup); sky2_write32(hw, RB_ADDR(q, RB_RX_UTPP), tp);
sky2_write32(hw, RB_ADDR(q, RB_RX_LTPP), rxlo); sky2_write32(hw, RB_ADDR(q, RB_RX_LTPP), space/4);
} else { } else {
/* Enable store & forward on Tx queue's because /* Enable store & forward on Tx queue's because
* Tx FIFO is only 1K on Yukon * Tx FIFO is only 1K on Yukon
...@@ -1002,19 +1010,19 @@ static int sky2_up(struct net_device *dev) ...@@ -1002,19 +1010,19 @@ static int sky2_up(struct net_device *dev)
sky2_mac_init(hw, port); sky2_mac_init(hw, port);
/* Configure RAM buffers */ /* Determine available ram buffer space (in 4K blocks).
if (hw->chip_id == CHIP_ID_YUKON_FE || * Note: not sure about the FE setting below yet
(hw->chip_id == CHIP_ID_YUKON_EC && hw->chip_rev == 2)) */
ramsize = 4096; if (hw->chip_id == CHIP_ID_YUKON_FE)
else { ramsize = 4;
u8 e0 = sky2_read8(hw, B2_E_0); else
ramsize = (e0 == 0) ? (128 * 1024) : (e0 * 4096); ramsize = sky2_read8(hw, B2_E_0);
}
/* Give transmitter one third (rounded up) */
rxspace = ramsize - (ramsize + 2) / 3;
/* 2/3 for Rx */
rxspace = (2 * ramsize) / 3;
sky2_ramset(hw, rxqaddr[port], 0, rxspace); sky2_ramset(hw, rxqaddr[port], 0, rxspace);
sky2_ramset(hw, txqaddr[port], rxspace, ramsize - rxspace); sky2_ramset(hw, txqaddr[port], rxspace, ramsize);
/* Make sure SyncQ is disabled */ /* Make sure SyncQ is disabled */
sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment