* [PATCH 0/6] sky2 important fixes backport
@ 2006-09-06 17:17 Stephen Hemminger
2006-09-06 17:17 ` [PATCH 1/6] sky2: accept flow control Stephen Hemminger
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
Selective backport of bug fixes in 2.6.18 to 2.6.17 stable.
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/6] sky2: accept flow control
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
@ 2006-09-06 17:17 ` Stephen Hemminger
2006-09-06 17:17 ` [PATCH 2/6] sky2: clear status IRQ after empty Stephen Hemminger
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
[-- Attachment #1: sky2-pause-fixes.patch --]
[-- Type: text/plain, Size: 627 bytes --]
Don't program the GMAC to reject flow control packets.
This maybe the cause of some of the transmit hangs.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
--- linux-2.6.17.11.orig/drivers/net/sky2.h 2006-09-06 10:02:11.000000000 -0700
+++ linux-2.6.17.11/drivers/net/sky2.h 2006-09-06 10:08:59.000000000 -0700
@@ -1566,7 +1566,7 @@
GMR_FS_ANY_ERR = GMR_FS_RX_FF_OV | GMR_FS_CRC_ERR |
GMR_FS_FRAGMENT | GMR_FS_LONG_ERR |
- GMR_FS_MII_ERR | GMR_FS_BAD_FC | GMR_FS_GOOD_FC |
+ GMR_FS_MII_ERR | GMR_FS_BAD_FC |
GMR_FS_UN_SIZE | GMR_FS_JABBER,
};
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/6] sky2: clear status IRQ after empty
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
2006-09-06 17:17 ` [PATCH 1/6] sky2: accept flow control Stephen Hemminger
@ 2006-09-06 17:17 ` Stephen Hemminger
2006-09-06 17:17 ` [PATCH 3/6] sky2: use dev_alloc_skb for receive buffers Stephen Hemminger
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
[-- Attachment #1: sky2-status-clr.patch --]
[-- Type: text/plain, Size: 785 bytes --]
Don't clear status IRQ until list has been read to avoid causing
status list wraparound. Clearing IRQ forces a Transmit Status update
if it is pending.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
--- linux-2.6.17.11.orig/drivers/net/sky2.c
+++ linux-2.6.17.11/drivers/net/sky2.c
@@ -2016,6 +2016,9 @@ static int sky2_status_intr(struct sky2_
}
}
+ /* Fully processed status ring so clear irq */
+ sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
+
exit_loop:
return work_done;
}
@@ -2218,9 +2221,6 @@ static int sky2_poll(struct net_device *
*budget -= work_done;
dev0->quota -= work_done;
- if (status & Y2_IS_STAT_BMU)
- sky2_write32(hw, STAT_CTRL, SC_STAT_CLR_IRQ);
-
if (sky2_more_work(hw))
return 1;
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/6] sky2: use dev_alloc_skb for receive buffers
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
2006-09-06 17:17 ` [PATCH 1/6] sky2: accept flow control Stephen Hemminger
2006-09-06 17:17 ` [PATCH 2/6] sky2: clear status IRQ after empty Stephen Hemminger
@ 2006-09-06 17:17 ` Stephen Hemminger
2006-09-06 17:17 ` [PATCH 4/6] sky2: MSI test timing Stephen Hemminger
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
[-- Attachment #1: sky2-dev-alloc.patch --]
[-- Type: text/plain, Size: 1234 bytes --]
Several code paths assume an additional 16 bytes of header padding
on the receive path. Use dev_alloc_skb to get that padding.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
--- linux-2.6.17.11.orig/drivers/net/sky2.c
+++ linux-2.6.17.11/drivers/net/sky2.c
@@ -949,14 +949,14 @@ static void sky2_vlan_rx_kill_vid(struct
/*
* It appears the hardware has a bug in the FIFO logic that
* cause it to hang if the FIFO gets overrun and the receive buffer
- * is not aligned. ALso alloc_skb() won't align properly if slab
+ * is not aligned. Also dev_alloc_skb() won't align properly if slab
* debugging is enabled.
*/
static inline struct sk_buff *sky2_alloc_skb(unsigned int size, gfp_t gfp_mask)
{
struct sk_buff *skb;
- skb = alloc_skb(size + RX_SKB_ALIGN, gfp_mask);
+ skb = __dev_alloc_skb(size + RX_SKB_ALIGN, gfp_mask);
if (likely(skb)) {
unsigned long p = (unsigned long) skb->data;
skb_reserve(skb, ALIGN(p, RX_SKB_ALIGN) - p);
@@ -1855,7 +1855,7 @@ static struct sk_buff *sky2_receive(stru
goto oversize;
if (length < copybreak) {
- skb = alloc_skb(length + 2, GFP_ATOMIC);
+ skb = dev_alloc_skb(length + 2);
if (!skb)
goto resubmit;
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 4/6] sky2: MSI test timing
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
` (2 preceding siblings ...)
2006-09-06 17:17 ` [PATCH 3/6] sky2: use dev_alloc_skb for receive buffers Stephen Hemminger
@ 2006-09-06 17:17 ` Stephen Hemminger
2006-09-06 17:17 ` [PATCH 5/6] sky2: fix fiber support Stephen Hemminger
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
[-- Attachment #1: sky2-post-bug.patch --]
[-- Type: text/plain, Size: 881 bytes --]
The test for MSI IRQ could have timing issues. The PCI write needs to be
pushed out before waiting, and the wait queue should be initialized before
the IRQ.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
--- linux-2.6.17.11.orig/drivers/net/sky2.c
+++ linux-2.6.17.11/drivers/net/sky2.c
@@ -3184,6 +3184,8 @@ static int __devinit sky2_test_msi(struc
struct pci_dev *pdev = hw->pdev;
int err;
+ init_waitqueue_head (&hw->msi_wait);
+
sky2_write32(hw, B0_IMSK, Y2_IS_IRQ_SW);
err = request_irq(pdev->irq, sky2_test_intr, SA_SHIRQ, DRV_NAME, hw);
@@ -3193,10 +3195,8 @@ static int __devinit sky2_test_msi(struc
return err;
}
- init_waitqueue_head (&hw->msi_wait);
-
sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ);
- wmb();
+ sky2_read8(hw, B0_CTST);
wait_event_timeout(hw->msi_wait, hw->msi_detected, HZ/10);
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 5/6] sky2: fix fiber support
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
` (3 preceding siblings ...)
2006-09-06 17:17 ` [PATCH 4/6] sky2: MSI test timing Stephen Hemminger
@ 2006-09-06 17:17 ` Stephen Hemminger
2006-09-06 17:17 ` [PATCH 6/6] sky2: version 1.6.1 Stephen Hemminger
2006-09-06 21:19 ` [stable] [PATCH 0/6] sky2 important fixes backport Greg KH
6 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
[-- Attachment #1: sky2-fiber.patch --]
[-- Type: text/plain, Size: 6828 bytes --]
Fix support for fiber based devices. Needed to keep track of PMD type to
add workaround in setup. Add support for gigabit half duplex fiber.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
---
drivers/net/sky2.c | 81 ++++++++++++++++++++++++++++++++---------------------
drivers/net/sky2.h | 15 +++++++++
2 files changed, 63 insertions(+), 33 deletions(-)
--- linux-2.6.17.11.orig/drivers/net/sky2.c 2006-09-06 07:21:25.000000000 -0700
+++ linux-2.6.17.11/drivers/net/sky2.c 2006-09-06 07:21:34.000000000 -0700
@@ -321,7 +321,7 @@
}
ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
- if (hw->copper) {
+ if (sky2_is_copper(hw)) {
if (hw->chip_id == CHIP_ID_YUKON_FE) {
/* enable automatic crossover */
ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1;
@@ -338,25 +338,37 @@
ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA;
}
}
- gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
} else {
/* workaround for deviation #4.88 (CRC errors) */
/* disable Automatic Crossover */
ctrl &= ~PHY_M_PC_MDIX_MSK;
- gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+ }
- if (hw->chip_id == CHIP_ID_YUKON_XL) {
- /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */
- gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2);
- ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
- ctrl &= ~PHY_M_MAC_MD_MSK;
- ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX);
- gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+ gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+
+ /* special setup for PHY 88E1112 Fiber */
+ if (hw->chip_id == CHIP_ID_YUKON_XL && !sky2_is_copper(hw)) {
+ pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR);
+ /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */
+ gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 2);
+ ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
+ ctrl &= ~PHY_M_MAC_MD_MSK;
+ ctrl |= PHY_M_MAC_MODE_SEL(PHY_M_MAC_MD_1000BX);
+ gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl);
+
+ if (hw->pmd_type == 'P') {
/* select page 1 to access Fiber registers */
gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 1);
+
+ /* for SFP-module set SIGDET polarity to low */
+ ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL);
+ ctrl |= PHY_M_FIB_SIGD_POL;
+ gm_phy_write(hw, port, PHY_MARV_CTRL, ctrl);
}
+
+ gm_phy_write(hw, port, PHY_MARV_EXT_ADR, pg);
}
ctrl = gm_phy_read(hw, port, PHY_MARV_CTRL);
@@ -373,7 +385,7 @@
adv = PHY_AN_CSMA;
if (sky2->autoneg == AUTONEG_ENABLE) {
- if (hw->copper) {
+ if (sky2_is_copper(hw)) {
if (sky2->advertising & ADVERTISED_1000baseT_Full)
ct1000 |= PHY_M_1000C_AFD;
if (sky2->advertising & ADVERTISED_1000baseT_Half)
@@ -386,8 +398,12 @@
adv |= PHY_M_AN_10_FD;
if (sky2->advertising & ADVERTISED_10baseT_Half)
adv |= PHY_M_AN_10_HD;
- } else /* special defines for FIBER (88E1011S only) */
- adv |= PHY_M_AN_1000X_AHD | PHY_M_AN_1000X_AFD;
+ } else { /* special defines for FIBER (88E1040S only) */
+ if (sky2->advertising & ADVERTISED_1000baseT_Full)
+ adv |= PHY_M_AN_1000X_AFD;
+ if (sky2->advertising & ADVERTISED_1000baseT_Half)
+ adv |= PHY_M_AN_1000X_AHD;
+ }
/* Set Flow-control capabilities */
if (sky2->tx_pause && sky2->rx_pause)
@@ -1497,7 +1513,7 @@
static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux)
{
- if (!hw->copper)
+ if (!sky2_is_copper(hw))
return SPEED_1000;
if (hw->chip_id == CHIP_ID_YUKON_FE)
@@ -2287,7 +2303,7 @@
static int sky2_reset(struct sky2_hw *hw)
{
u16 status;
- u8 t8, pmd_type;
+ u8 t8;
int i;
sky2_write8(hw, B0_CTST, CS_RST_CLR);
@@ -2333,9 +2349,7 @@
sky2_pci_write32(hw, PEX_UNC_ERR_STAT, 0xffffffffUL);
- pmd_type = sky2_read8(hw, B2_PMD_TYP);
- hw->copper = !(pmd_type == 'L' || pmd_type == 'S');
-
+ hw->pmd_type = sky2_read8(hw, B2_PMD_TYP);
hw->ports = 1;
t8 = sky2_read8(hw, B2_Y2_HW_RES);
if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) {
@@ -2432,21 +2446,22 @@
static u32 sky2_supported_modes(const struct sky2_hw *hw)
{
- u32 modes;
- if (hw->copper) {
- modes = SUPPORTED_10baseT_Half
- | SUPPORTED_10baseT_Full
- | SUPPORTED_100baseT_Half
- | SUPPORTED_100baseT_Full
- | SUPPORTED_Autoneg | SUPPORTED_TP;
+ if (sky2_is_copper(hw)) {
+ u32 modes = SUPPORTED_10baseT_Half
+ | SUPPORTED_10baseT_Full
+ | SUPPORTED_100baseT_Half
+ | SUPPORTED_100baseT_Full
+ | SUPPORTED_Autoneg | SUPPORTED_TP;
if (hw->chip_id != CHIP_ID_YUKON_FE)
modes |= SUPPORTED_1000baseT_Half
- | SUPPORTED_1000baseT_Full;
+ | SUPPORTED_1000baseT_Full;
+ return modes;
} else
- modes = SUPPORTED_1000baseT_Full | SUPPORTED_FIBRE
- | SUPPORTED_Autoneg;
- return modes;
+ return SUPPORTED_1000baseT_Half
+ | SUPPORTED_1000baseT_Full
+ | SUPPORTED_Autoneg
+ | SUPPORTED_FIBRE;
}
static int sky2_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd)
@@ -2457,7 +2472,7 @@
ecmd->transceiver = XCVR_INTERNAL;
ecmd->supported = sky2_supported_modes(hw);
ecmd->phy_address = PHY_ADDR_MARV;
- if (hw->copper) {
+ if (sky2_is_copper(hw)) {
ecmd->supported = SUPPORTED_10baseT_Half
| SUPPORTED_10baseT_Full
| SUPPORTED_100baseT_Half
@@ -2466,12 +2481,14 @@
| SUPPORTED_1000baseT_Full
| SUPPORTED_Autoneg | SUPPORTED_TP;
ecmd->port = PORT_TP;
- } else
+ ecmd->speed = sky2->speed;
+ } else {
+ ecmd->speed = SPEED_1000;
ecmd->port = PORT_FIBRE;
+ }
ecmd->advertising = sky2->advertising;
ecmd->autoneg = sky2->autoneg;
- ecmd->speed = sky2->speed;
ecmd->duplex = sky2->duplex;
return 0;
}
--- linux-2.6.17.11.orig/drivers/net/sky2.h 2006-09-06 07:21:02.000000000 -0700
+++ linux-2.6.17.11/drivers/net/sky2.h 2006-09-06 07:21:34.000000000 -0700
@@ -1318,6 +1318,14 @@
};
/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
+/***** PHY_MARV_PHY_CTRL (page 1) 16 bit r/w Fiber Specific Ctrl *****/
+enum {
+ PHY_M_FIB_FORCE_LNK = 1<<10,/* Force Link Good */
+ PHY_M_FIB_SIGD_POL = 1<<9, /* SIGDET Polarity */
+ PHY_M_FIB_TX_DIS = 1<<3, /* Transmitter Disable */
+};
+
+/* for Yukon-2 Gigabit Ethernet PHY (88E1112 only) */
/***** PHY_MARV_PHY_CTRL (page 2) 16 bit r/w MAC Specific Ctrl *****/
enum {
PHY_M_MAC_MD_MSK = 7<<7, /* Bit 9.. 7: Mode Select Mask */
@@ -1879,7 +1887,7 @@
int pm_cap;
u8 chip_id;
u8 chip_rev;
- u8 copper;
+ u8 pmd_type;
u8 ports;
struct sky2_status_le *st_le;
@@ -1891,6 +1899,11 @@
wait_queue_head_t msi_wait;
};
+static inline int sky2_is_copper(const struct sky2_hw *hw)
+{
+ return !(hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P');
+}
+
/* Register accessor for memory mapped device */
static inline u32 sky2_read32(const struct sky2_hw *hw, unsigned reg)
{
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 6/6] sky2: version 1.6.1
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
` (4 preceding siblings ...)
2006-09-06 17:17 ` [PATCH 5/6] sky2: fix fiber support Stephen Hemminger
@ 2006-09-06 17:17 ` Stephen Hemminger
2006-09-06 21:19 ` [stable] [PATCH 0/6] sky2 important fixes backport Greg KH
6 siblings, 0 replies; 8+ messages in thread
From: Stephen Hemminger @ 2006-09-06 17:17 UTC (permalink / raw)
To: Jeff Garzik; +Cc: stable, netdev
[-- Attachment #1: sky2-dotvers.patch --]
[-- Type: text/plain, Size: 500 bytes --]
Since this code incorporates some of the fixes from 2.6.18, change
the version number.
Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
--- linux-2.6.17.11.orig/drivers/net/sky2.c 2006-09-06 09:29:23.000000000 -0700
+++ linux-2.6.17.11/drivers/net/sky2.c 2006-09-06 09:29:30.000000000 -0700
@@ -51,7 +51,7 @@
#include "sky2.h"
#define DRV_NAME "sky2"
-#define DRV_VERSION "1.4"
+#define DRV_VERSION "1.6.1"
#define PFX DRV_NAME " "
/*
--
Stephen Hemminger <shemminger@osdl.org>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [stable] [PATCH 0/6] sky2 important fixes backport
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
` (5 preceding siblings ...)
2006-09-06 17:17 ` [PATCH 6/6] sky2: version 1.6.1 Stephen Hemminger
@ 2006-09-06 21:19 ` Greg KH
6 siblings, 0 replies; 8+ messages in thread
From: Greg KH @ 2006-09-06 21:19 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: Jeff Garzik, netdev, stable
On Wed, Sep 06, 2006 at 10:17:52AM -0700, Stephen Hemminger wrote:
> Selective backport of bug fixes in 2.6.18 to 2.6.17 stable.
All 6 queued to -stable, thanks.
greg k-h
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2006-09-06 21:19 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-06 17:17 [PATCH 0/6] sky2 important fixes backport Stephen Hemminger
2006-09-06 17:17 ` [PATCH 1/6] sky2: accept flow control Stephen Hemminger
2006-09-06 17:17 ` [PATCH 2/6] sky2: clear status IRQ after empty Stephen Hemminger
2006-09-06 17:17 ` [PATCH 3/6] sky2: use dev_alloc_skb for receive buffers Stephen Hemminger
2006-09-06 17:17 ` [PATCH 4/6] sky2: MSI test timing Stephen Hemminger
2006-09-06 17:17 ` [PATCH 5/6] sky2: fix fiber support Stephen Hemminger
2006-09-06 17:17 ` [PATCH 6/6] sky2: version 1.6.1 Stephen Hemminger
2006-09-06 21:19 ` [stable] [PATCH 0/6] sky2 important fixes backport Greg KH
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.