| From b6b67df3f24c45af0012ee3c8af2f62ca083ae18 Mon Sep 17 00:00:00 2001 |
| From: Larry Finger <Larry.Finger@lwfinger.net> |
| Date: Fri, 29 Jul 2011 10:53:12 -0500 |
| Subject: rtlwifi: Fix kernel oops on ARM SOC |
| |
| From: Larry Finger <Larry.Finger@lwfinger.net> |
| |
| commit b6b67df3f24c45af0012ee3c8af2f62ca083ae18 upstream. |
| |
| This driver uses information from the self member of the pci_bus struct to |
| get information regarding the bridge to which the PCIe device is attached. |
| Unfortunately, this member is not established on all architectures, which |
| leads to a kernel oops. |
| |
| Skipping the entire block that uses the self member to determine the bridge |
| vendor will only affect RTL8192DE devices as that driver sets the ASPM support |
| flag differently when the bridge vendor is Intel. If the self member is |
| available, there is no functional change. |
| |
| This patch fixes Bugzilla No. 40212. |
| |
| Reported-by: Hubert Liao <liao.hubertt@gmail.com> |
| Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> |
| Signed-off-by: John W. Linville <linville@tuxdriver.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/wireless/rtlwifi/pci.c | 20 +++++++++++--------- |
| 1 file changed, 11 insertions(+), 9 deletions(-) |
| |
| --- a/drivers/net/wireless/rtlwifi/pci.c |
| +++ b/drivers/net/wireless/rtlwifi/pci.c |
| @@ -1709,15 +1709,17 @@ static bool _rtl_pci_find_adapter(struct |
| pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn); |
| pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn); |
| |
| - /*find bridge info */ |
| - pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor; |
| - for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) { |
| - if (bridge_pdev->vendor == pcibridge_vendors[tmp]) { |
| - pcipriv->ndis_adapter.pcibridge_vendor = tmp; |
| - RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, |
| - ("Pci Bridge Vendor is found index: %d\n", |
| - tmp)); |
| - break; |
| + if (bridge_pdev) { |
| + /*find bridge info if available */ |
| + pcipriv->ndis_adapter.pcibridge_vendorid = bridge_pdev->vendor; |
| + for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) { |
| + if (bridge_pdev->vendor == pcibridge_vendors[tmp]) { |
| + pcipriv->ndis_adapter.pcibridge_vendor = tmp; |
| + RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, |
| + ("Pci Bridge Vendor is found index:" |
| + " %d\n", tmp)); |
| + break; |
| + } |
| } |
| } |
| |