From: Greg Kroah-Hartman Date: Wed, 6 Sep 2006 21:20:10 +0000 (-0700) Subject: sky2 patches added X-Git-Tag: v2.6.17.12~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=16b49a7e84ab31787b186e1fc8871e54a3751243;p=thirdparty%2Fkernel%2Fstable-queue.git sky2 patches added --- diff --git a/queue-2.6.17/series b/queue-2.6.17/series index 89a7e884cdc..71130d62947 100644 --- a/queue-2.6.17/series +++ b/queue-2.6.17/series @@ -29,3 +29,9 @@ missing-pci-id-update-for-via-ide.patch dvb-core-proper-handling-ule-sndu-length-of-0.patch remove-redundant-up-in-stop_machine.patch dm-fix-deadlock-under-high-i-o-load-in-raid1-setup.patch +sky2-pause-fixes.patch +sky2-status-clr.patch +sky2-dev-alloc.patch +sky2-post-bug.patch +sky2-fiber.patch +sky2-dotvers.patch diff --git a/queue-2.6.17/sky2-dev-alloc.patch b/queue-2.6.17/sky2-dev-alloc.patch new file mode 100644 index 00000000000..aaf77470003 --- /dev/null +++ b/queue-2.6.17/sky2-dev-alloc.patch @@ -0,0 +1,49 @@ +From stable-bounces@linux.kernel.org Wed Sep 6 11:10:27 2006 +Message-Id: <20060906171921.238190000@localhost.localdomain> +Date: Wed, 06 Sep 2006 10:17:55 -0700 +From: Stephen Hemminger +To: Jeff Garzik +Content-Disposition: inline; filename=sky2-dev-alloc.patch +Cc: netdev@vger.kernel.org, stable@kernel.org +Subject: sky2: use dev_alloc_skb for receive buffers + +From: Stephen Hemminger + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/sky2.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- 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; + diff --git a/queue-2.6.17/sky2-dotvers.patch b/queue-2.6.17/sky2-dotvers.patch new file mode 100644 index 00000000000..af787443f0e --- /dev/null +++ b/queue-2.6.17/sky2-dotvers.patch @@ -0,0 +1,32 @@ +From stable-bounces@linux.kernel.org Wed Sep 6 11:10:14 2006 +Message-Id: <20060906171922.357072000@localhost.localdomain> +Date: Wed, 06 Sep 2006 10:17:58 -0700 +From: Stephen Hemminger +To: Jeff Garzik +Content-Disposition: inline; filename=sky2-dotvers.patch +Cc: netdev@vger.kernel.org, stable@kernel.org +Subject: sky2: version 1.6.1 + +From: Stephen Hemminger + +Since this code incorporates some of the fixes from 2.6.18, change +the version number. + +Signed-off-by: Stephen Hemminger +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/sky2.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- linux-2.6.17.11.orig/drivers/net/sky2.c ++++ linux-2.6.17.11/drivers/net/sky2.c +@@ -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 " " + + /* diff --git a/queue-2.6.17/sky2-fiber.patch b/queue-2.6.17/sky2-fiber.patch new file mode 100644 index 00000000000..3dbdbc167c2 --- /dev/null +++ b/queue-2.6.17/sky2-fiber.patch @@ -0,0 +1,231 @@ +From stable-bounces@linux.kernel.org Wed Sep 6 11:10:27 2006 +Message-Id: <20060906171921.976281000@localhost.localdomain> +Date: Wed, 06 Sep 2006 10:17:57 -0700 +From: Stephen Hemminger +To: Jeff Garzik +Content-Disposition: inline; filename=sky2-fiber.patch +Cc: netdev@vger.kernel.org, stable@kernel.org +Subject: sky2: fix fiber support + +From: Stephen Hemminger + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + 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 ++++ linux-2.6.17.11/drivers/net/sky2.c +@@ -321,7 +321,7 @@ static void sky2_phy_init(struct sky2_hw + } + + 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 @@ static void sky2_phy_init(struct sky2_hw + 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 @@ static void sky2_phy_init(struct sky2_hw + 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 @@ static void sky2_phy_init(struct sky2_hw + 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 int sky2_down(struct net_device * + + 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 inline u32 sky2_clk2us(const stru + static int __devinit 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 @@ static int __devinit sky2_reset(struct s + 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 int __devinit sky2_reset(struct s + + 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 @@ static int sky2_get_settings(struct net_ + 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 @@ static int sky2_get_settings(struct net_ + | 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 ++++ linux-2.6.17.11/drivers/net/sky2.h +@@ -1318,6 +1318,14 @@ enum { + }; + + /* 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 @@ struct sky2_hw { + 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 @@ struct sky2_hw { + 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) + { diff --git a/queue-2.6.17/sky2-pause-fixes.patch b/queue-2.6.17/sky2-pause-fixes.patch new file mode 100644 index 00000000000..c124f10bf88 --- /dev/null +++ b/queue-2.6.17/sky2-pause-fixes.patch @@ -0,0 +1,32 @@ +From stable-bounces@linux.kernel.org Wed Sep 6 11:10:26 2006 +Message-Id: <20060906171920.479727000@localhost.localdomain> +Date: Wed, 06 Sep 2006 10:17:53 -0700 +From: Stephen Hemminger +To: Jeff Garzik +Content-Disposition: inline; filename=sky2-pause-fixes.patch +Cc: netdev@vger.kernel.org, stable@kernel.org +Subject: sky2: accept flow control + +From: Stephen Hemminger + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/sky2.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- linux-2.6.17.11.orig/drivers/net/sky2.h ++++ linux-2.6.17.11/drivers/net/sky2.h +@@ -1566,7 +1566,7 @@ enum { + + 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, + }; + diff --git a/queue-2.6.17/sky2-post-bug.patch b/queue-2.6.17/sky2-post-bug.patch new file mode 100644 index 00000000000..21a47004f15 --- /dev/null +++ b/queue-2.6.17/sky2-post-bug.patch @@ -0,0 +1,45 @@ +From stable-bounces@linux.kernel.org Wed Sep 6 11:09:24 2006 +Message-Id: <20060906171921.612595000@localhost.localdomain> +Date: Wed, 06 Sep 2006 10:17:56 -0700 +From: Stephen Hemminger +To: Jeff Garzik +Content-Disposition: inline; filename=sky2-post-bug.patch +Cc: netdev@vger.kernel.org, stable@kernel.org +Subject: sky2: MSI test timing + +From: Stephen Hemminger + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/sky2.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- 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); + diff --git a/queue-2.6.17/sky2-status-clr.patch b/queue-2.6.17/sky2-status-clr.patch new file mode 100644 index 00000000000..5ff4b461a55 --- /dev/null +++ b/queue-2.6.17/sky2-status-clr.patch @@ -0,0 +1,44 @@ +From stable-bounces@linux.kernel.org Wed Sep 6 11:10:26 2006 +Message-Id: <20060906171920.866115000@localhost.localdomain> +Date: Wed, 06 Sep 2006 10:17:54 -0700 +From: Stephen Hemminger +To: Jeff Garzik +Content-Disposition: inline; filename=sky2-status-clr.patch +Cc: netdev@vger.kernel.org, stable@kernel.org +Subject: sky2: clear status IRQ after empty + +From: Stephen Hemminger + +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 +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/net/sky2.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- 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; +