From: Greg Kroah-Hartman Date: Sat, 3 Mar 2007 00:27:53 +0000 (-0800) Subject: add sky2 patches to 2.6.19 review X-Git-Tag: v2.6.19.6~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=00d6bcc382a211b7c49798c34b7b2d3d12003b37;p=thirdparty%2Fkernel%2Fstable-queue.git add sky2 patches to 2.6.19 review --- diff --git a/review-2.6.19/series b/review-2.6.19/series index 224ff1d8b4f..db7145e1a0c 100644 --- a/review-2.6.19/series +++ b/review-2.6.19/series @@ -7,3 +7,9 @@ fix-oops-when-windows-server-sent-bad-domain-name-null-terminator.patch usb-usbnet-driver-bugfix.patch hda-codec-don-t-return-error-at-initialization-of-modem-codec.patch missing-critical-phys_to_virt-in-lib-swiotlb.c.patch +sky2-pci-write.patch +sky2-napi-dual.patch +sky2-netconsole-free.patch +sky2-tx-timeout-deadlock.patch +sky2-pause-flush.patch +sky2-ramset.patch diff --git a/review-2.6.19/sky2-napi-dual.patch b/review-2.6.19/sky2-napi-dual.patch new file mode 100644 index 00000000000..4389cbd470d --- /dev/null +++ b/review-2.6.19/sky2-napi-dual.patch @@ -0,0 +1,39 @@ +From shemminger@linux-foundation.org Mon Feb 26 17:36:12 2007 +From: Stephen Hemminger +Date: Mon, 26 Feb 2007 17:18:35 -0800 +Subject: sky2: fix for NAPI with dual port boards +To: Greg KH +Cc: stable@kernel.org +Message-ID: <20070227012021.391931938@linux-foundation.org> +Content-Disposition: inline; filename=sky2-napi-dual.patch + +From: Stephen Hemminger + +This driver uses port 0 to handle receives on both ports. So +the netif_poll_disable call in dev_close would end up stopping the +second port on dual port cards. + +Signed-off-by: Stephen Hemminger +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/net/sky2.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +--- linux-2.6.19.5.orig/drivers/net/sky2.c ++++ linux-2.6.19.5/drivers/net/sky2.c +@@ -1499,6 +1499,13 @@ static int sky2_down(struct net_device * + imask &= ~portirq_msk[port]; + sky2_write32(hw, B0_IMSK, imask); + ++ /* ++ * Both ports share the NAPI poll on port 0, so if necessary undo the ++ * the disable that is done in dev_close. ++ */ ++ if (sky2->port == 0 && hw->ports > 1) ++ netif_poll_enable(dev); ++ + sky2_gmac_reset(hw, port); + + /* Stop transmitter */ diff --git a/review-2.6.19/sky2-netconsole-free.patch b/review-2.6.19/sky2-netconsole-free.patch new file mode 100644 index 00000000000..cd624cbc631 --- /dev/null +++ b/review-2.6.19/sky2-netconsole-free.patch @@ -0,0 +1,34 @@ +From shemminger@linux-foundation.org Mon Feb 26 17:36:04 2007 +From: Stephen Hemminger +Date: Mon, 26 Feb 2007 17:18:36 -0800 +Subject: sky2: kfree_skb with IRQ with netconsole +To: Greg KH +Cc: stable@kernel.org +Message-ID: <20070227012021.494864678@linux-foundation.org> +Content-Disposition: inline; filename=sky2-netconsole-free.patch + +From: Stephen Hemminger + +When using netconsole, it is possible for the driver to try and +free skb's with IRQ's disabled. This could cause problems if the skb +had a destructor function that didn't expect this. The documented semantics +is that skb->destructor callback happens in softirq. + +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.19.5.orig/drivers/net/sky2.c ++++ linux-2.6.19.5/drivers/net/sky2.c +@@ -1454,7 +1454,7 @@ static void sky2_tx_complete(struct sky2 + if (unlikely(netif_msg_tx_done(sky2))) + printk(KERN_DEBUG "%s: tx done %u\n", + dev->name, idx); +- dev_kfree_skb(re->skb); ++ dev_kfree_skb_any(re->skb); + } + + le->opcode = 0; /* paranoia */ diff --git a/review-2.6.19/sky2-pause-flush.patch b/review-2.6.19/sky2-pause-flush.patch new file mode 100644 index 00000000000..25376749526 --- /dev/null +++ b/review-2.6.19/sky2-pause-flush.patch @@ -0,0 +1,32 @@ +From shemminger@linux-foundation.org Mon Feb 26 17:36:20 2007 +From: Stephen Hemminger +Date: Mon, 26 Feb 2007 17:18:38 -0800 +Subject: sky2: dont flush good pause frames +To: Greg KH +Cc: stable@kernel.org +Message-ID: <20070227012021.809906985@linux-foundation.org> +Content-Disposition: inline; filename=sky2-pause-flush.patch + +From: Stephen Hemminger + +Don't mark pause frames as errors. This caused a bug that would +lockup transmitter, as well as all the other ports on a switch. + +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.19.5.orig/drivers/net/sky2.h ++++ linux-2.6.19.5/drivers/net/sky2.h +@@ -1576,7 +1576,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_GOOD_FC | GMR_FS_BAD_FC | ++ GMR_FS_MII_ERR | GMR_FS_BAD_FC | + GMR_FS_UN_SIZE | GMR_FS_JABBER, + }; + diff --git a/review-2.6.19/sky2-pci-write.patch b/review-2.6.19/sky2-pci-write.patch new file mode 100644 index 00000000000..9cd0e24718c --- /dev/null +++ b/review-2.6.19/sky2-pci-write.patch @@ -0,0 +1,42 @@ +From shemminger@linux-foundation.org Mon Feb 26 17:36:04 2007 +From: Stephen Hemminger +Date: Mon, 26 Feb 2007 17:18:34 -0800 +Subject: sky2: pci config blocks phy power control +To: Greg KH +Cc: stable@kernel.org +Message-ID: <20070227012021.255367846@linux-foundation.org> +Content-Disposition: inline; filename=sky2-pci-write.patch + +From: Stephen Hemminger + +PHY power control won't work because writes to PCI config space +are not re-enabled. + +Signed-off-by: Stephen Hemminger +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/net/sky2.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- linux-2.6.19.5.orig/drivers/net/sky2.c ++++ linux-2.6.19.5/drivers/net/sky2.c +@@ -569,8 +569,8 @@ static void sky2_phy_power(struct sky2_h + if (hw->chip_id == CHIP_ID_YUKON_XL && hw->chip_rev > 1) + onoff = !onoff; + ++ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_ON); + reg1 = sky2_pci_read32(hw, PCI_DEV_REG1); +- + if (onoff) + /* Turn off phy power saving */ + reg1 &= ~phy_power[port]; +@@ -579,6 +579,7 @@ static void sky2_phy_power(struct sky2_h + + sky2_pci_write32(hw, PCI_DEV_REG1, reg1); + sky2_pci_read32(hw, PCI_DEV_REG1); ++ sky2_write8(hw, B2_TST_CTRL1, TST_CFG_WRITE_OFF); + udelay(100); + } + diff --git a/review-2.6.19/sky2-ramset.patch b/review-2.6.19/sky2-ramset.patch new file mode 100644 index 00000000000..082512eed0e --- /dev/null +++ b/review-2.6.19/sky2-ramset.patch @@ -0,0 +1,77 @@ +From shemminger@linux-foundation.org Mon Feb 26 17:36:27 2007 +From: Stephen Hemminger +Date: Mon, 26 Feb 2007 17:18:39 -0800 +Subject: sky2: fix ram buffer allocation settings +To: Greg KH +Cc: stable@kernel.org +Message-ID: <20070227012021.877726206@linux-foundation.org> +Content-Disposition: inline; filename=sky2-ramset.patch + +From: Stephen Hemminger + +Different chipsets have different amount of ram buffer (some have none), +so need to make sure that driver does proper setup for all cases from 0 on +to 48K, in units of 1K. + +This is a backport of the code from 2.6.19 or later + +Signed-off-by: Stephen Hemminger +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/net/sky2.c | 33 ++++++++++++++++++++------------- + 1 file changed, 20 insertions(+), 13 deletions(-) + +--- linux-2.6.19.5.orig/drivers/net/sky2.c ++++ linux-2.6.19.5/drivers/net/sky2.c +@@ -700,8 +700,14 @@ static void sky2_mac_init(struct sky2_hw + } + + /* Assign Ram Buffer allocation in units of 64bit (8 bytes) */ +-static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, u32 end) ++static void sky2_ramset(struct sky2_hw *hw, u16 q, u32 start, u32 space) + { ++ u32 end; ++ ++ start *= 1024/8; ++ space *= 1024/8; ++ end = start + space - 1; ++ + pr_debug(PFX "q %d %#x %#x\n", q, start, end); + + sky2_write8(hw, RB_ADDR(q, RB_CTRL), RB_RST_CLR); +@@ -1193,20 +1199,21 @@ static int sky2_up(struct net_device *de + + sky2_mac_init(hw, port); + +- /* Determine available ram buffer space in qwords. */ +- ramsize = sky2_read8(hw, B2_E_0) * 4096/8; +- +- if (ramsize > 6*1024/8) +- rxspace = ramsize - (ramsize + 2) / 3; +- else +- rxspace = ramsize / 2; ++ /* Determine available ram buffer space (in 4K blocks). */ ++ ramsize = sky2_read8(hw, B2_E_0) * 4; ++ if (ramsize != 0) { ++ if (ramsize < 16) ++ rxspace = ramsize / 2; ++ else ++ rxspace = 8 + (2*(ramsize - 16))/3; + +- sky2_ramset(hw, rxqaddr[port], 0, rxspace-1); +- sky2_ramset(hw, txqaddr[port], rxspace, ramsize-1); ++ sky2_ramset(hw, rxqaddr[port], 0, rxspace); ++ sky2_ramset(hw, txqaddr[port], rxspace, ramsize - rxspace); + +- /* Make sure SyncQ is disabled */ +- sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), +- RB_RST_SET); ++ /* Make sure SyncQ is disabled */ ++ sky2_write8(hw, RB_ADDR(port == 0 ? Q_XS1 : Q_XS2, RB_CTRL), ++ RB_RST_SET); ++ } + + sky2_qset(hw, txqaddr[port]); + diff --git a/review-2.6.19/sky2-tx-timeout-deadlock.patch b/review-2.6.19/sky2-tx-timeout-deadlock.patch new file mode 100644 index 00000000000..4f85a403a91 --- /dev/null +++ b/review-2.6.19/sky2-tx-timeout-deadlock.patch @@ -0,0 +1,51 @@ +From shemminger@linux-foundation.org Mon Feb 26 17:36:12 2007 +From: Stephen Hemminger +Date: Mon, 26 Feb 2007 17:18:37 -0800 +Subject: sky2: transmit timeout deadlock +To: Greg KH +Cc: stable@kernel.org +Message-ID: <20070227012021.597873758@linux-foundation.org> +Content-Disposition: inline; filename=sky2-tx-timeout-deadlock.patch + +From: Stephen Hemminger + +The code in transmit timeout incorrectly assumed that netif_tx_lock +was not set. + +Signed-off-by: Stephen Hemminger +Signed-off-by: Greg Kroah-Hartman + + +--- + drivers/net/sky2.c | 6 ++---- + 1 file changed, 2 insertions(+), 4 deletions(-) + +--- linux-2.6.19.5.orig/drivers/net/sky2.c ++++ linux-2.6.19.5/drivers/net/sky2.c +@@ -1783,6 +1783,7 @@ out: + + /* Transmit timeout is only called if we are running, carries is up + * and tx queue is full (stopped). ++ * Called with netif_tx_lock held. + */ + static void sky2_tx_timeout(struct net_device *dev) + { +@@ -1808,17 +1809,14 @@ static void sky2_tx_timeout(struct net_d + sky2_write8(hw, STAT_TX_TIMER_CTRL, TIM_START); + } else if (report != sky2->tx_cons) { + printk(KERN_INFO PFX "status report lost?\n"); +- +- netif_tx_lock_bh(dev); + sky2_tx_complete(sky2, report); +- netif_tx_unlock_bh(dev); + } else { + printk(KERN_INFO PFX "hardware hung? flushing\n"); + + sky2_write32(hw, Q_ADDR(txq, Q_CSR), BMU_STOP); + sky2_write32(hw, Y2_QADDR(txq, PREF_UNIT_CTRL), PREF_UNIT_RST_SET); + +- sky2_tx_clean(dev); ++ sky2_tx_complete(sky2, sky2->tx_prod); + + sky2_qset(hw, txq); + sky2_prefetch_init(hw, txq, sky2->tx_le_map, TX_RING_SIZE - 1);