From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754947Ab2CWRU4 (ORCPT ); Fri, 23 Mar 2012 13:20:56 -0400 Received: from cavan.codon.org.uk ([93.93.128.6]:54701 "EHLO cavan.codon.org.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753207Ab2CWRUz (ORCPT ); Fri, 23 Mar 2012 13:20:55 -0400 Date: Fri, 23 Mar 2012 17:20:53 +0000 From: Matthew Garrett To: Chris Holland Cc: Robert Hancock , linux-kernel@vger.kernel.org, jbarnes@virtuousgeek.org Subject: Re: IDE DVD and CD drive seem to not work with Linux desktop 3.3.0-030300-generic Message-ID: <20120323172053.GA24571@srcf.ucam.org> References: <20120323162930.GB23376@srcf.ucam.org> <20120323165118.GA24014@srcf.ucam.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.20 (2009-06-14) X-SA-Exim-Connect-IP: X-SA-Exim-Mail-From: mjg59@cavan.codon.org.uk X-SA-Exim-Scanned: No (on cavan.codon.org.uk); SAEximRunCond expanded to false Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Ok, this is very odd - ASPM is disabled in both cases. The only thing I can think of here is that the hardware dislikes us writing to the registers? Can you test this patch on top of the broken kernel? diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c index 24f049e..04eb680 100644 --- a/drivers/pci/pcie/aspm.c +++ b/drivers/pci/pcie/aspm.c @@ -185,6 +185,7 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) int ppos, cpos, same_clock = 1; u16 reg16, parent_reg, child_reg[8]; unsigned long start_jiffies; + bool retrain = false; struct pci_dev *child, *parent = link->pdev; struct pci_bus *linkbus = parent->subordinate; /* @@ -215,7 +216,10 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) reg16 |= PCI_EXP_LNKCTL_CCC; else reg16 &= ~PCI_EXP_LNKCTL_CCC; - pci_write_config_word(child, cpos + PCI_EXP_LNKCTL, reg16); + if (reg16 != child_reg[PCI_FUNC(child->devfn)]) { + retrain = true; + pci_write_config_word(child, cpos + PCI_EXP_LNKCTL, reg16); + } } /* Configure upstream component */ @@ -225,9 +229,15 @@ static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) reg16 |= PCI_EXP_LNKCTL_CCC; else reg16 &= ~PCI_EXP_LNKCTL_CCC; - pci_write_config_word(parent, ppos + PCI_EXP_LNKCTL, reg16); + if (reg16 != parent_reg) { + retrain = true; + pci_write_config_word(parent, ppos + PCI_EXP_LNKCTL, reg16); + } /* Retrain link */ + if (!retrain) + return; + reg16 |= PCI_EXP_LNKCTL_RL; pci_write_config_word(parent, ppos + PCI_EXP_LNKCTL, reg16); @@ -436,13 +446,16 @@ static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) static void pcie_config_aspm_dev(struct pci_dev *pdev, u32 val) { - u16 reg16; + u16 reg16, orig_reg16; int pos = pci_pcie_cap(pdev); pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, ®16); + orig_reg16 = reg16; reg16 &= ~0x3; reg16 |= val; - pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16); + + if (reg16 != orig_reg16) + pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16); } static void pcie_config_aspm_link(struct pcie_link_state *link, u32 state) -- Matthew Garrett | mjg59@srcf.ucam.org