* [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 a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).