]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
add sky2 patches to 2.6.19 review
authorGreg Kroah-Hartman <gregkh@suse.de>
Sat, 3 Mar 2007 00:27:53 +0000 (16:27 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Sat, 3 Mar 2007 00:27:53 +0000 (16:27 -0800)
review-2.6.19/series
review-2.6.19/sky2-napi-dual.patch [new file with mode: 0644]
review-2.6.19/sky2-netconsole-free.patch [new file with mode: 0644]
review-2.6.19/sky2-pause-flush.patch [new file with mode: 0644]
review-2.6.19/sky2-pci-write.patch [new file with mode: 0644]
review-2.6.19/sky2-ramset.patch [new file with mode: 0644]
review-2.6.19/sky2-tx-timeout-deadlock.patch [new file with mode: 0644]

index 224ff1d8b4f04f8b5c55fe4c90faa7c03d2bdb2f..db7145e1a0c00d80693554bf1148acaed50ef9d9 100644 (file)
@@ -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 (file)
index 0000000..4389cbd
--- /dev/null
@@ -0,0 +1,39 @@
+From shemminger@linux-foundation.org Mon Feb 26 17:36:12 2007
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+Date: Mon, 26 Feb 2007 17:18:35 -0800
+Subject: sky2: fix for NAPI with dual port boards
+To: Greg KH <greg@kroah.com>
+Cc: stable@kernel.org
+Message-ID: <20070227012021.391931938@linux-foundation.org>
+Content-Disposition: inline; filename=sky2-napi-dual.patch
+
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+
+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 <shemminger@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ 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 (file)
index 0000000..cd624cb
--- /dev/null
@@ -0,0 +1,34 @@
+From shemminger@linux-foundation.org Mon Feb 26 17:36:04 2007
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+Date: Mon, 26 Feb 2007 17:18:36 -0800
+Subject: sky2: kfree_skb with IRQ with netconsole
+To: Greg KH <greg@kroah.com>
+Cc: stable@kernel.org
+Message-ID: <20070227012021.494864678@linux-foundation.org>
+Content-Disposition: inline; filename=sky2-netconsole-free.patch
+
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+
+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 <shemminger@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ 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 (file)
index 0000000..2537674
--- /dev/null
@@ -0,0 +1,32 @@
+From shemminger@linux-foundation.org Mon Feb 26 17:36:20 2007
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+Date: Mon, 26 Feb 2007 17:18:38 -0800
+Subject: sky2: dont flush good pause frames
+To: Greg KH <greg@kroah.com>
+Cc: stable@kernel.org
+Message-ID: <20070227012021.809906985@linux-foundation.org>
+Content-Disposition: inline; filename=sky2-pause-flush.patch
+
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+
+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 <shemminger@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ 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 (file)
index 0000000..9cd0e24
--- /dev/null
@@ -0,0 +1,42 @@
+From shemminger@linux-foundation.org Mon Feb 26 17:36:04 2007
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+Date: Mon, 26 Feb 2007 17:18:34 -0800
+Subject: sky2: pci config blocks phy power control
+To: Greg KH <greg@kroah.com>
+Cc: stable@kernel.org
+Message-ID: <20070227012021.255367846@linux-foundation.org>
+Content-Disposition: inline; filename=sky2-pci-write.patch
+
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+
+PHY power control won't work because writes to PCI config space
+are not re-enabled.
+
+Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ 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 (file)
index 0000000..082512e
--- /dev/null
@@ -0,0 +1,77 @@
+From shemminger@linux-foundation.org Mon Feb 26 17:36:27 2007
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+Date: Mon, 26 Feb 2007 17:18:39 -0800
+Subject: sky2: fix ram buffer allocation settings
+To: Greg KH <greg@kroah.com>
+Cc: stable@kernel.org
+Message-ID: <20070227012021.877726206@linux-foundation.org>
+Content-Disposition: inline; filename=sky2-ramset.patch
+
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+
+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 <shemminger@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ 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 (file)
index 0000000..4f85a40
--- /dev/null
@@ -0,0 +1,51 @@
+From shemminger@linux-foundation.org Mon Feb 26 17:36:12 2007
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+Date: Mon, 26 Feb 2007 17:18:37 -0800
+Subject: sky2: transmit timeout deadlock
+To: Greg KH <greg@kroah.com>
+Cc: stable@kernel.org
+Message-ID: <20070227012021.597873758@linux-foundation.org>
+Content-Disposition: inline; filename=sky2-tx-timeout-deadlock.patch
+
+From: Stephen Hemminger <shemminger@linux-foundation.org>
+
+The code in transmit timeout incorrectly assumed that netif_tx_lock
+was not set.
+
+Signed-off-by: Stephen Hemminger <shemminger@linux-foundation.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ 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);