Revert skge: fix ram buffer size calculation

2007-11-15 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=279e1dab949d33737557babfe9f74e0b74fbe39a
Commit: 279e1dab949d33737557babfe9f74e0b74fbe39a
Parent: 8cc91677ae027e15654d7d86a735a7ab6f5c2ec1
Author: Linus Torvalds [EMAIL PROTECTED]
AuthorDate: Thu Nov 15 08:44:36 2007 -0800
Committer:  Linus Torvalds [EMAIL PROTECTED]
CommitDate: Thu Nov 15 08:44:36 2007 -0800

Revert skge: fix ram buffer size calculation

This reverts commit 7fb7ac241162dc51ec0f7644d4a97b2855213c32.

Heikki Orsila reports that it causes a regression:

  Doing

nc host port  /dev/zero

   on a sending machine (not skge) to an skge machine that is receiving:

nc -l -p port /dev/null

   with ~60 MiB/s speed, causes the interface go malfunct. A slow
   transfer doesn't cause a problem.

See

http://bugzilla.kernel.org/show_bug.cgi?id=9321

for some more information.

There is a workaround (also reported by Heikki):

  After some fiddling, I noticed that not changing the register write
   order on patch:

   +   skge_write32(hw, RB_ADDR(q, RB_END), end);
   skge_write32(hw, RB_ADDR(q, RB_WP), start);
   skge_write32(hw, RB_ADDR(q, RB_RP), start);
   -   skge_write32(hw, RB_ADDR(q, RB_END), end);

   fixes the visible effect..  Possibly not the root cause of the
   problem, but changing the order back fixes networking here.

but that has yet to be ack'ed or tested more widely, so the whole
problem-causing commit gets reverted until this is resolved properly.

Bisected-and-requested-by: Heikki Orsila [EMAIL PROTECTED]
Cc: Stephen Hemminger [EMAIL PROTECTED]
Cc: Jeff Garzik [EMAIL PROTECTED]
Signed-off-by: Linus Torvalds [EMAIL PROTECTED]
---
 drivers/net/skge.c |   51 +++
 1 files changed, 27 insertions(+), 24 deletions(-)

diff --git a/drivers/net/skge.c b/drivers/net/skge.c
index b9961dc..6d62250 100644
--- a/drivers/net/skge.c
+++ b/drivers/net/skge.c
@@ -2512,31 +2512,32 @@ static int skge_ioctl(struct net_device *dev, struct 
ifreq *ifr, int cmd)
return err;
 }
 
-/* Assign Ram Buffer allocation to queue */
-static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, u32 space)
+static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, size_t len)
 {
u32 end;
 
-   /* convert from K bytes to qwords used for hw register */
-   start *= 1024/8;
-   space *= 1024/8;
-   end = start + space - 1;
+   start /= 8;
+   len /= 8;
+   end = start + len - 1;
 
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
skge_write32(hw, RB_ADDR(q, RB_START), start);
-   skge_write32(hw, RB_ADDR(q, RB_END), end);
skge_write32(hw, RB_ADDR(q, RB_WP), start);
skge_write32(hw, RB_ADDR(q, RB_RP), start);
+   skge_write32(hw, RB_ADDR(q, RB_END), end);
 
if (q == Q_R1 || q == Q_R2) {
-   u32 tp = space - space/4;
-
/* Set thresholds on receive queue's */
-   skge_write32(hw, RB_ADDR(q, RB_RX_UTPP), tp);
-   skge_write32(hw, RB_ADDR(q, RB_RX_LTPP), space/4);
-   } else if (hw-chip_id != CHIP_ID_GENESIS)
-   /* Genesis Tx Fifo is too small for normal store/forward */
+   skge_write32(hw, RB_ADDR(q, RB_RX_UTPP),
+start + (2*len)/3);
+   skge_write32(hw, RB_ADDR(q, RB_RX_LTPP),
+start + (len/3));
+   } else {
+   /* Enable store  forward on Tx queue's because
+* Tx FIFO is only 4K on Genesis and 1K on Yukon
+*/
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
+   }
 
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
 }
@@ -2564,7 +2565,7 @@ static int skge_up(struct net_device *dev)
struct skge_port *skge = netdev_priv(dev);
struct skge_hw *hw = skge-hw;
int port = skge-port;
-   u32 ramaddr, ramsize, rxspace;
+   u32 chunk, ram_addr;
size_t rx_size, tx_size;
int err;
 
@@ -2619,15 +2620,14 @@ static int skge_up(struct net_device *dev)
spin_unlock_bh(hw-phy_lock);
 
/* Configure RAMbuffers */
-   ramsize = (hw-ram_size - hw-ram_offset) / hw-ports;
-   ramaddr = hw-ram_offset + port * ramsize;
-   rxspace = 8 + (2*(ramsize - 16))/3;
-
-   skge_ramset(hw, rxqaddr[port], ramaddr, rxspace);
-   skge_ramset(hw, txqaddr[port], ramaddr + rxspace, ramsize - rxspace);
+   chunk = hw-ram_size / ((hw-ports + 1)*2);
+   ram_addr = hw-ram_offset + 2 * chunk * port;
 
+   skge_ramset(hw, rxqaddr[port], ram_addr, chunk);
skge_qset(skge, rxqaddr[port], skge-rx_ring.to_clean);
+
BUG_ON(skge-tx_ring.to_use != skge-tx_ring.to_clean);
+   skge_ramset(hw

skge: fix ram buffer size calculation

2007-10-16 Thread Linux Kernel Mailing List
Gitweb: 
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=7fb7ac241162dc51ec0f7644d4a97b2855213c32
Commit: 7fb7ac241162dc51ec0f7644d4a97b2855213c32
Parent: 298e1a9ebe37662f2145c07b678ebd09b86c020a
Author: Stephen Hemminger [EMAIL PROTECTED]
AuthorDate: Tue Oct 16 12:15:49 2007 -0700
Committer:  Jeff Garzik [EMAIL PROTECTED]
CommitDate: Tue Oct 16 21:10:28 2007 -0400

skge: fix ram buffer size calculation

This fixes problems with transmit hangs on older fiber based SysKonnect 
boards.

Adjust ram buffer sizing calculation to make it correct on all boards
and make it like the code in sky2 driver.

Signed-off-by: Stephen Hemminger [EMAIL PROTECTED]
Signed-off-by: Jeff Garzik [EMAIL PROTECTED]
---
 drivers/net/skge.c |   51 ---
 1 files changed, 24 insertions(+), 27 deletions(-)

diff --git a/drivers/net/skge.c b/drivers/net/skge.c
index 2aae9fe..e593585 100644
--- a/drivers/net/skge.c
+++ b/drivers/net/skge.c
@@ -2403,32 +2403,31 @@ static int skge_ioctl(struct net_device *dev, struct 
ifreq *ifr, int cmd)
return err;
 }
 
-static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, size_t len)
+/* Assign Ram Buffer allocation to queue */
+static void skge_ramset(struct skge_hw *hw, u16 q, u32 start, u32 space)
 {
u32 end;
 
-   start /= 8;
-   len /= 8;
-   end = start + len - 1;
+   /* convert from K bytes to qwords used for hw register */
+   start *= 1024/8;
+   space *= 1024/8;
+   end = start + space - 1;
 
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR);
skge_write32(hw, RB_ADDR(q, RB_START), start);
+   skge_write32(hw, RB_ADDR(q, RB_END), end);
skge_write32(hw, RB_ADDR(q, RB_WP), start);
skge_write32(hw, RB_ADDR(q, RB_RP), start);
-   skge_write32(hw, RB_ADDR(q, RB_END), end);
 
if (q == Q_R1 || q == Q_R2) {
+   u32 tp = space - space/4;
+
/* Set thresholds on receive queue's */
-   skge_write32(hw, RB_ADDR(q, RB_RX_UTPP),
-start + (2*len)/3);
-   skge_write32(hw, RB_ADDR(q, RB_RX_LTPP),
-start + (len/3));
-   } else {
-   /* Enable store  forward on Tx queue's because
-* Tx FIFO is only 4K on Genesis and 1K on Yukon
-*/
+   skge_write32(hw, RB_ADDR(q, RB_RX_UTPP), tp);
+   skge_write32(hw, RB_ADDR(q, RB_RX_LTPP), space/4);
+   } else if (hw-chip_id != CHIP_ID_GENESIS)
+   /* Genesis Tx Fifo is too small for normal store/forward */
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_STFWD);
-   }
 
skge_write8(hw, RB_ADDR(q, RB_CTRL), RB_ENA_OP_MD);
 }
@@ -2456,7 +2455,7 @@ static int skge_up(struct net_device *dev)
struct skge_port *skge = netdev_priv(dev);
struct skge_hw *hw = skge-hw;
int port = skge-port;
-   u32 chunk, ram_addr;
+   u32 ramaddr, ramsize, rxspace;
size_t rx_size, tx_size;
int err;
 
@@ -2511,14 +2510,15 @@ static int skge_up(struct net_device *dev)
spin_unlock_bh(hw-phy_lock);
 
/* Configure RAMbuffers */
-   chunk = hw-ram_size / ((hw-ports + 1)*2);
-   ram_addr = hw-ram_offset + 2 * chunk * port;
+   ramsize = (hw-ram_size - hw-ram_offset) / hw-ports;
+   ramaddr = hw-ram_offset + port * ramsize;
+   rxspace = 8 + (2*(ramsize - 16))/3;
 
-   skge_ramset(hw, rxqaddr[port], ram_addr, chunk);
-   skge_qset(skge, rxqaddr[port], skge-rx_ring.to_clean);
+   skge_ramset(hw, rxqaddr[port], ramaddr, rxspace);
+   skge_ramset(hw, txqaddr[port], ramaddr + rxspace, ramsize - rxspace);
 
+   skge_qset(skge, rxqaddr[port], skge-rx_ring.to_clean);
BUG_ON(skge-tx_ring.to_use != skge-tx_ring.to_clean);
-   skge_ramset(hw, txqaddr[port], ram_addr+chunk, chunk);
skge_qset(skge, txqaddr[port], skge-tx_ring.to_use);
 
/* Start receiver BMU */
@@ -3450,15 +3450,12 @@ static int skge_reset(struct skge_hw *hw)
if (hw-chip_id == CHIP_ID_GENESIS) {
if (t8 == 3) {
/* special case: 4 x 64k x 36, offset = 0x8 */
-   hw-ram_size = 0x10;
-   hw-ram_offset = 0x8;
+   hw-ram_size = 1024;
+   hw-ram_offset = 512;
} else
hw-ram_size = t8 * 512;
-   }
-   else if (t8 == 0)
-   hw-ram_size = 0x2;
-   else
-   hw-ram_size = t8 * 4096;
+   } else /* Yukon */
+   hw-ram_size = t8 ? t8 * 4 : 128;
 
hw-intr_mask = IS_HW_ERR;
 
-
To unsubscribe from this list: send the line unsubscribe git-commits-head in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html