[kernel] r11364 - in dists/trunk/linux-2.6/debian/patches: features/all series

Maximilian Attems maks at alioth.debian.org
Sun May 11 22:04:43 UTC 2008


Author: maks
Date: Sun May 11 22:04:42 2008
New Revision: 11364

Log:
net add atl1 suspend and resume patch

2.6.27 target, but we'd want that for Lenny.


Added:
   dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-atl1-suspend-resume.patch
Modified:
   dists/trunk/linux-2.6/debian/patches/series/1~experimental.1

Added: dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-atl1-suspend-resume.patch
==============================================================================
--- (empty file)
+++ dists/trunk/linux-2.6/debian/patches/features/all/drivers-net-atl1-suspend-resume.patch	Sun May 11 22:04:42 2008
@@ -0,0 +1,197 @@
+From: Jay Cliburn <jacliburn at bellsouth.net>
+To: jeff at garzik.org
+Cc: netdev at vger.kernel.org, linux-kernel at vger.kernel.org,
+	csnook at redhat.com, pelle at dsv.su.se,
+	Jay Cliburn <jacliburn at bellsouth.net>
+Subject: [PATCH 2/4] atl1: fix broken suspend and resume
+Date:	Fri,  9 May 2008 22:12:07 -0500
+Message-Id: <1210389129-3868-3-git-send-email-jacliburn at bellsouth.net>
+X-Mailer: git-send-email 1.5.4.1
+In-Reply-To: <1210389129-3868-1-git-send-email-jacliburn at bellsouth.net>
+References: <1210389129-3868-1-git-send-email-jacliburn at bellsouth.net>
+Sender: netdev-owner at vger.kernel.org
+Precedence: bulk
+List-ID: <netdev.vger.kernel.org>
+X-Mailing-List:	netdev at vger.kernel.org
+
+Fix atl1_suspend() and atl1_resume() so they actually work.  We'll use
+the suspend function for wake-on-lan in addition to just suspending.
+
+Signed-off-by: Jay Cliburn <jacliburn at bellsouth.net>
+---
+ drivers/net/atlx/atl1.c |  125 ++++++++++++++++++++++++++++++-----------------
+ 1 files changed, 80 insertions(+), 45 deletions(-)
+
+diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
+index 3beb44e..12fb3e5 100644
+--- a/drivers/net/atlx/atl1.c
++++ b/drivers/net/atlx/atl1.c
+@@ -2781,64 +2781,93 @@ static int atl1_suspend(struct pci_dev *pdev, pm_message_t state)
+ 	struct atl1_hw *hw = &adapter->hw;
+ 	u32 ctrl = 0;
+ 	u32 wufc = adapter->wol;
++	u32 val;
++	int retval;
++	u16 speed;
++	u16 duplex;
+ 
+ 	netif_device_detach(netdev);
+ 	if (netif_running(netdev))
+ 		atl1_down(adapter);
+ 
++	retval = pci_save_state(pdev);
++	if (retval)
++		return retval;
++
+ 	atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl);
+ 	atl1_read_phy_reg(hw, MII_BMSR, (u16 *) & ctrl);
+-	if (ctrl & BMSR_LSTATUS)
++	val = ctrl & BMSR_LSTATUS;
++	if (val)
+ 		wufc &= ~ATLX_WUFC_LNKC;
+ 
+-	/* reduce speed to 10/100M */
+-	if (wufc) {
+-		atl1_phy_enter_power_saving(hw);
+-		/* if resume, let driver to re- setup link */
+-		hw->phy_configured = false;
+-		atl1_set_mac_addr(hw);
+-		atlx_set_multi(netdev);
++	if (val && wufc) {
++		val = atl1_get_speed_and_duplex(hw, &speed, &duplex);
++		if (val) {
++			if (netif_msg_ifdown(adapter))
++				dev_printk(KERN_DEBUG, &pdev->dev,
++					"error getting speed/duplex\n");
++			goto disable_wol;
++		}
+ 
+ 		ctrl = 0;
+-		/* turn on magic packet wol */
+-		if (wufc & ATLX_WUFC_MAG)
+-			ctrl = WOL_MAGIC_EN | WOL_MAGIC_PME_EN;
+ 
+-		/* turn on Link change WOL */
+-		if (wufc & ATLX_WUFC_LNKC)
+-			ctrl |= (WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN);
++		/* enable magic packet WOL */
++		if (wufc & ATLX_WUFC_MAG)
++			ctrl |= (WOL_MAGIC_EN | WOL_MAGIC_PME_EN);
+ 		iowrite32(ctrl, hw->hw_addr + REG_WOL_CTRL);
+-
+-		/* turn on all-multi mode if wake on multicast is enabled */
+-		ctrl = ioread32(hw->hw_addr + REG_MAC_CTRL);
+-		ctrl &= ~MAC_CTRL_DBG;
+-		ctrl &= ~MAC_CTRL_PROMIS_EN;
+-		if (wufc & ATLX_WUFC_MC)
+-			ctrl |= MAC_CTRL_MC_ALL_EN;
+-		else
+-			ctrl &= ~MAC_CTRL_MC_ALL_EN;
+-
+-		/* turn on broadcast mode if wake on-BC is enabled */
+-		if (wufc & ATLX_WUFC_BC)
++		ioread32(hw->hw_addr + REG_WOL_CTRL);
++
++		/* configure the mac */
++		ctrl = MAC_CTRL_RX_EN;
++		ctrl |= ((u32)((speed == SPEED_1000) ? MAC_CTRL_SPEED_1000 :
++			MAC_CTRL_SPEED_10_100) << MAC_CTRL_SPEED_SHIFT);
++		if (duplex == FULL_DUPLEX)
++			ctrl |= MAC_CTRL_DUPLX;
++		ctrl |= (((u32)adapter->hw.preamble_len &
++			MAC_CTRL_PRMLEN_MASK) << MAC_CTRL_PRMLEN_SHIFT);
++		if (adapter->vlgrp)
++			ctrl |= MAC_CTRL_RMV_VLAN;
++		if (wufc & ATLX_WUFC_MAG)
+ 			ctrl |= MAC_CTRL_BC_EN;
+-		else
+-			ctrl &= ~MAC_CTRL_BC_EN;
+-
+-		/* enable RX */
+-		ctrl |= MAC_CTRL_RX_EN;
+ 		iowrite32(ctrl, hw->hw_addr + REG_MAC_CTRL);
+-		pci_enable_wake(pdev, PCI_D3hot, 1);
+-		pci_enable_wake(pdev, PCI_D3cold, 1);
+-	} else {
+-		iowrite32(0, hw->hw_addr + REG_WOL_CTRL);
+-		pci_enable_wake(pdev, PCI_D3hot, 0);
+-		pci_enable_wake(pdev, PCI_D3cold, 0);
++		ioread32(hw->hw_addr + REG_MAC_CTRL);
++
++		/* poke the PHY */
++		ctrl = ioread32(hw->hw_addr + REG_PCIE_PHYMISC);
++		ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
++		iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC);
++		ioread32(hw->hw_addr + REG_PCIE_PHYMISC);
++
++		pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
++		goto exit;
+ 	}
+ 
+-	pci_save_state(pdev);
++	if (!val && wufc) {
++		ctrl |= (WOL_LINK_CHG_EN | WOL_LINK_CHG_PME_EN);
++		iowrite32(ctrl, hw->hw_addr + REG_WOL_CTRL);
++		ioread32(hw->hw_addr + REG_WOL_CTRL);
++		iowrite32(0, hw->hw_addr + REG_MAC_CTRL);
++		ioread32(hw->hw_addr + REG_MAC_CTRL);
++		hw->phy_configured = false;
++		pci_enable_wake(pdev, pci_choose_state(pdev, state), 1);
++		goto exit;
++	}
++
++disable_wol:
++	iowrite32(0, hw->hw_addr + REG_WOL_CTRL);
++	ioread32(hw->hw_addr + REG_WOL_CTRL);
++	ctrl = ioread32(hw->hw_addr + REG_PCIE_PHYMISC);
++	ctrl |= PCIE_PHYMISC_FORCE_RCV_DET;
++	iowrite32(ctrl, hw->hw_addr + REG_PCIE_PHYMISC);
++	ioread32(hw->hw_addr + REG_PCIE_PHYMISC);
++	atl1_phy_enter_power_saving(hw);
++	hw->phy_configured = false;
++	pci_enable_wake(pdev, pci_choose_state(pdev, state), 0);
++exit:
++	if (netif_running(netdev))
++		pci_disable_msi(adapter->pdev);
+ 	pci_disable_device(pdev);
+-
+-	pci_set_power_state(pdev, PCI_D3hot);
++	pci_set_power_state(pdev, pci_choose_state(pdev, state));
+ 
+ 	return 0;
+ }
+@@ -2852,20 +2881,26 @@ static int atl1_resume(struct pci_dev *pdev)
+ 	pci_set_power_state(pdev, PCI_D0);
+ 	pci_restore_state(pdev);
+ 
+-	/* FIXME: check and handle */
+ 	err = pci_enable_device(pdev);
++	if (err) {
++		if (netif_msg_ifup(adapter))
++			dev_printk(KERN_DEBUG, &pdev->dev,
++				"error enabling pci device\n");
++		return err;
++	}
++
++	pci_set_master(pdev);
++	iowrite32(0, adapter->hw.hw_addr + REG_WOL_CTRL);
+ 	pci_enable_wake(pdev, PCI_D3hot, 0);
+ 	pci_enable_wake(pdev, PCI_D3cold, 0);
+ 
+-	iowrite32(0, adapter->hw.hw_addr + REG_WOL_CTRL);
+-	atl1_reset(adapter);
++	atl1_reset_hw(&adapter->hw);
++	adapter->cmb.cmb->int_stats = 0;
+ 
+ 	if (netif_running(netdev))
+ 		atl1_up(adapter);
+ 	netif_device_attach(netdev);
+ 
+-	atl1_via_workaround(adapter);
+-
+ 	return 0;
+ }
+ #else
+-- 
+1.5.4.1
+

Modified: dists/trunk/linux-2.6/debian/patches/series/1~experimental.1
==============================================================================
--- dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	(original)
+++ dists/trunk/linux-2.6/debian/patches/series/1~experimental.1	Sun May 11 22:04:42 2008
@@ -31,7 +31,8 @@
 + features/arm/cache-align2.patch
 + features/arm/speed_flush_cache.patch
 + features/arm/5281d0.patch
-+ features/all/atl1-PHY-power-save-mode.patch
++ features/all/drivers-net-atl1-PHY-power-save-mode.patch
++ features/all/drivers-net-atl1-suspend-resume.patch
 + features/all/at76.patch 
 + bugfix/fix-hifn_795X-divdi3.patch
 + bugfix/all/mtd-prevent-physmap-from-causing-request_module-runaway-loop-modprobe-net-pf-1.patch



More information about the Kernel-svn-changes mailing list