Re: iwl3945 didn't survive after s2ram failure

From: Stanislaw Gruszka
Date: Thu Jan 05 2012 - 06:08:06 EST


On Tue, Jan 03, 2012 at 02:03:06PM +0100, Michal Hocko wrote:
> [ 5622.739466] ieee80211 phy0: U iwl_legacy_apm_init Init card's basic functions
> [ 5622.740021] iwl3945 0000:05:00.0: MAC is in deep sleep!. CSR_GP_CNTRL = 0xFFFFFFFF
[snip]
> Yes and no change. I even tried to disable wireless in BIOS boot and
> then enable it again. No change...
> It seems somebody already had the same problem
> https://bugzilla.redhat.com/show_bug.cgi?id=639184. My BIOS doesn't
> provide any locator setting, unfortunatelly.
>
> The message above says that the HW is still in a deep sleep state. Can
> we somehow force waking it up?

The message is a bit confusing, it happen when on device processor does
not clear bit it suppose to. It can be in some sleep state, reset state
or powered off. But this message could be triggered when there is PCIe
connection problem, since we can not read properly register value, what
seems to be issue here as value is 0xFFFFFFFF.

> Or, can we just ignore the signature check and (maybe) fix it by another
> suspend/resume cycle?

Only interesting thing we do while resume in the driver is:
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
we do the same during erly stage of .probe function too.

In the RH bugzilla case, it was regression. There are no iwlegacy
changes between mentioned kernel versions. There are some APCI and pci
changes. Can you try if any of these kernel boot parameters helps:
pcie_aspm=off
pcie_aspm=force
pci=nocsr
pci=use_csr

More than that, I'm attaching a patch, there is very small chance
it will help.

Stanislaw
diff --git a/drivers/net/wireless/iwlegacy/iwl3945-base.c b/drivers/net/wireless/iwlegacy/iwl3945-base.c
index b282d86..94934eb 100644
--- a/drivers/net/wireless/iwlegacy/iwl3945-base.c
+++ b/drivers/net/wireless/iwlegacy/iwl3945-base.c
@@ -3700,8 +3700,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
/***************************
* 2. Initializing PCI bus
* *************************/
- pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
- PCIE_LINK_STATE_CLKPM);
+ //pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 |
+ // PCIE_LINK_STATE_CLKPM);

if (pci_enable_device(pdev)) {
err = -ENODEV;
@@ -3751,7 +3751,7 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
* strange state ... like being left stranded by a primary kernel
* and this is now the kdump kernel trying to start up
*/
- iwl_write32(priv, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);
+ //iwl_write32(priv, CSR_RESET, CSR_RESET_REG_FLAG_NEVO_RESET);

/***********************
* 4. Read EEPROM