From 0ea065e52eb6a0f029b5fa5ed2f142be1b66a153 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Fri, 14 Aug 2009 15:36:41 -0700 Subject: sky2: fix pause negotiation The sky2 driver combines auto speed negotiation with automatic negotiation of pause parameters; but the ethtool interface expects them to be split. This patch allows autonegotiation to be used for speed, but manually disable flow control. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 4486b066b43..c9548d6d567 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -1583,7 +1583,6 @@ enum { }; #define GM_GPCR_SPEED_1000 (GM_GPCR_GIGS_ENA | GM_GPCR_SPEED_100) -#define GM_GPCR_AU_ALL_DIS (GM_GPCR_AU_DUP_DIS | GM_GPCR_AU_FCT_DIS|GM_GPCR_AU_SPD_DIS) /* GM_TX_CTRL 16 bit r/w Transmit Control Register */ enum { @@ -2042,15 +2041,18 @@ struct sky2_port { u8 fifo_lev; } check; - dma_addr_t rx_le_map; dma_addr_t tx_le_map; + u16 advertising; /* ADVERTISED_ bits */ - u16 speed; /* SPEED_1000, SPEED_100, ... */ - u8 autoneg; /* AUTONEG_ENABLE, AUTONEG_DISABLE */ - u8 duplex; /* DUPLEX_HALF, DUPLEX_FULL */ - u8 rx_csum; - u8 wol; + u16 speed; /* SPEED_1000, SPEED_100, ... */ + u8 wol; /* WAKE_ bits */ + u8 duplex; /* DUPLEX_HALF, DUPLEX_FULL */ + u16 flags; +#define SKY2_FLAG_RX_CHECKSUM 0x0001 +#define SKY2_FLAG_AUTO_SPEED 0x0002 +#define SKY2_FLAG_AUTO_PAUSE 0x0004 + u8 restarting; enum flow_control flow_mode; enum flow_control flow_status; -- cgit v1.2.3 From 49d4b8ba97034469b941d00d5ca1e3b897394e35 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Fri, 14 Aug 2009 13:33:17 +0000 Subject: sky2: remove restarting workaround flag The whole restarting flag was introduced by Mike McCormack and was a temporary duct tape patch around issues with transmits inflight during restart. The problems it was covering are now fixed and the code should have been reverted. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index c9548d6d567..65b94c366fb 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -2053,7 +2053,6 @@ struct sky2_port { #define SKY2_FLAG_AUTO_SPEED 0x0002 #define SKY2_FLAG_AUTO_PAUSE 0x0004 - u8 restarting; enum flow_control flow_mode; enum flow_control flow_status; -- cgit v1.2.3 From 5dce95e5687a5a335202b03d133c1b4411ef7ce3 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 18 Aug 2009 15:17:06 +0000 Subject: sky2: transmit ring 64 bit conservation This patch saves elements on transmit ring by only updating the upper 64 bit address when it changes. With many workloads skb's are located in same region, so it saves space. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 65b94c366fb..feb3204134e 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -2017,6 +2017,7 @@ struct sky2_port { u16 tx_pending; u16 tx_last_mss; + u32 tx_last_upper; u32 tx_tcpsum; struct rx_ring_info *rx_ring ____cacheline_aligned_in_smp; -- cgit v1.2.3 From ee5f68fea27b53b16c265b1f9ed8aa3bc9024c96 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 18 Aug 2009 15:17:08 +0000 Subject: sky2: dynamic size transmit ring Allocate and size transmit ring based on parameters. Saves excess space and allows configuring larger rings for testing. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 1 + 1 file changed, 1 insertion(+) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index feb3204134e..2c262f763f9 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -2011,6 +2011,7 @@ struct sky2_port { struct tx_ring_info *tx_ring; struct sky2_tx_le *tx_le; + u16 tx_ring_size; u16 tx_cons; /* next le to check */ u16 tx_prod; /* next le to use */ u16 tx_next; /* debug only */ -- cgit v1.2.3 From 6b84dacadbdc3dab6a5b313d20d5a93b0d998641 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 18 Aug 2009 15:17:09 +0000 Subject: sky2: optimize transmit completion Don't reference the list element in hardware transmit ring on transmit completion. The list element is updated by hardware, therefore it causes a cache miss. Do book keeping in software structure. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 3 +++ 1 file changed, 3 insertions(+) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 2c262f763f9..9d07a466aec 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -1984,6 +1984,9 @@ struct sky2_status_le { struct tx_ring_info { struct sk_buff *skb; + unsigned long flags; +#define TX_MAP_SINGLE 0x0001 +#define TX_MAP_PAGE 000002 DECLARE_PCI_UNMAP_ADDR(mapaddr); DECLARE_PCI_UNMAP_LEN(maplen); }; -- cgit v1.2.3 From 724b694225e711f95e6265afdbc304c9e7eb3721 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Tue, 18 Aug 2009 15:17:10 +0000 Subject: sky2: no recycling Recycling turns out to be a bad idea! For most use cases, the packet can not be reused: TCP packets are cloned. Even for the ideal case of forwarding, it hurts performance because of CPU ping/pong. On a multi-core system forwarding of 64 byte packets is worse much worse: recycling = 24% forwarded vs no recycling = 42% forwarded Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 1 - 1 file changed, 1 deletion(-) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 9d07a466aec..73c95471246 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -2032,7 +2032,6 @@ struct sky2_port { u16 rx_pending; u16 rx_data_size; u16 rx_nfrags; - struct sk_buff_head rx_recycle; #ifdef SKY2_VLAN_TAG_USED u16 rx_tag; -- cgit v1.2.3 From 10547ae2c01acdace636e23c991b21fef05428b4 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger Date: Mon, 31 Aug 2009 07:31:41 +0000 Subject: sky2: fix management of driver LED Observed by Mike McCormack. The LED bit here is just a software controlled value used to turn on one of the LED's on some boards. The register value was wrong, which could have been causing some power control issues. Get rid of problematic define use the correct mask. Signed-off-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 73c95471246..34042ff7c12 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -155,7 +155,7 @@ enum pci_cfg_reg1 { enum csr_regs { B0_RAP = 0x0000, B0_CTST = 0x0004, - B0_Y2LED = 0x0005, + B0_POWER_CTRL = 0x0007, B0_ISRC = 0x0008, B0_IMSK = 0x000c, @@ -283,13 +283,6 @@ enum { CS_RST_SET = 1, /* Set Software reset */ }; -/* B0_LED 8 Bit LED register */ -enum { -/* Bit 7.. 2: reserved */ - LED_STAT_ON = 1<<1, /* Status LED on */ - LED_STAT_OFF = 1, /* Status LED off */ -}; - /* B0_POWER_CTRL 8 Bit Power Control reg (YUKON only) */ enum { PC_VAUX_ENA = 1<<7, /* Switch VAUX Enable */ -- cgit v1.2.3 From 72c60683282a6cd047db47d605eb96e2a6fac72c Mon Sep 17 00:00:00 2001 From: Mike McCormack Date: Tue, 1 Sep 2009 03:54:27 +0000 Subject: sky2: Use 32bit read to read Y2_VAUX_AVAIL B0_CTST is a 24bit register according to the vendor driver (sk98lin). A 16bit read on B0_CTST will always return 0 for Y2_VAUX_AVAIL (1<<16), so use a 32bit read when testing Y2_VAUX_AVAIL Signed-off-by: Mike McCormack Acked-by: Stephen Hemminger Signed-off-by: David S. Miller --- drivers/net/sky2.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'drivers/net/sky2.h') diff --git a/drivers/net/sky2.h b/drivers/net/sky2.h index 34042ff7c12..e0f23a10104 100644 --- a/drivers/net/sky2.h +++ b/drivers/net/sky2.h @@ -260,7 +260,7 @@ enum csr_regs { Y2_CFG_AER = 0x1d00, /* PCI Advanced Error Report region */ }; -/* B0_CTST 16 bit Control/Status register */ +/* B0_CTST 24 bit Control/Status register */ enum { Y2_VMAIN_AVAIL = 1<<17,/* VMAIN available (YUKON-2 only) */ Y2_VAUX_AVAIL = 1<<16,/* VAUX available (YUKON-2 only) */ -- cgit v1.2.3