diff options
| author | Huang Rui <ray.huang@amd.com> | 2013-10-03 23:37:12 +0800 | 
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-10-03 15:44:50 -0700 | 
| commit | 3ad145b62a15c86150dd0cc229a39a3120d462f9 (patch) | |
| tree | 2b0a5f63b7dd1cf5269dde34406861ebd5e8526c /drivers/usb/host | |
| parent | cccd3a258eef7a8451e25b7bf55503973de4e9f5 (diff) | |
usb: ehci: use amd_chipset_type to filter for usb subsystem hang bug
Commit "usb: pci-quirks: refactor AMD quirk to abstract AMD chipset types"
introduced a new AMD chipset type to filter AMD platforms with different
chipsets.
According to a recent thread [1], this patch updates USB subsystem hang
symptom quirk which is observed on AMD all SB600 and SB700 revision
0x3a/0x3b. And make it use the new chipset type to represent.
[1] http://marc.info/?l=linux-usb&m=138012321616452&w=2
Signed-off-by: Huang Rui <ray.huang@amd.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/host')
| -rw-r--r-- | drivers/usb/host/ehci-pci.c | 24 | ||||
| -rw-r--r-- | drivers/usb/host/pci-quirks.c | 13 | ||||
| -rw-r--r-- | drivers/usb/host/pci-quirks.h | 1 | 
3 files changed, 20 insertions, 18 deletions
| diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index 854c2ec7b699..3e86bf4371b3 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c @@ -58,8 +58,6 @@ static int ehci_pci_setup(struct usb_hcd *hcd)  {  	struct ehci_hcd		*ehci = hcd_to_ehci(hcd);  	struct pci_dev		*pdev = to_pci_dev(hcd->self.controller); -	struct pci_dev		*p_smbus; -	u8			rev;  	u32			temp;  	int			retval; @@ -175,22 +173,12 @@ static int ehci_pci_setup(struct usb_hcd *hcd)  		/* SB600 and old version of SB700 have a bug in EHCI controller,  		 * which causes usb devices lose response in some cases.  		 */ -		if ((pdev->device == 0x4386) || (pdev->device == 0x4396)) { -			p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, -						 PCI_DEVICE_ID_ATI_SBX00_SMBUS, -						 NULL); -			if (!p_smbus) -				break; -			rev = p_smbus->revision; -			if ((pdev->device == 0x4386) || (rev == 0x3a) -			    || (rev == 0x3b)) { -				u8 tmp; -				ehci_info(ehci, "applying AMD SB600/SB700 USB " -					"freeze workaround\n"); -				pci_read_config_byte(pdev, 0x53, &tmp); -				pci_write_config_byte(pdev, 0x53, tmp | (1<<3)); -			} -			pci_dev_put(p_smbus); +		if ((pdev->device == 0x4386 || pdev->device == 0x4396) && +				usb_amd_hang_symptom_quirk()) { +			u8 tmp; +			ehci_info(ehci, "applying AMD SB600/SB700 USB freeze workaround\n"); +			pci_read_config_byte(pdev, 0x53, &tmp); +			pci_write_config_byte(pdev, 0x53, tmp | (1<<3));  		}  		break;  	case PCI_VENDOR_ID_NETMOS: diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 9eec463c73c5..138a55536d97 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c @@ -262,6 +262,19 @@ int usb_hcd_amd_remote_wakeup_quirk(struct pci_dev *pdev)  }  EXPORT_SYMBOL_GPL(usb_hcd_amd_remote_wakeup_quirk); +bool usb_amd_hang_symptom_quirk(void) +{ +	u8 rev; + +	usb_amd_find_chipset_info(); +	rev = amd_chipset.sb_type.rev; +	/* SB600 and old version of SB700 have hang symptom bug */ +	return amd_chipset.sb_type.gen == AMD_CHIPSET_SB600 || +			(amd_chipset.sb_type.gen == AMD_CHIPSET_SB700 && +			 rev >= 0x3a && rev <= 0x3b); +} +EXPORT_SYMBOL_GPL(usb_amd_hang_symptom_quirk); +  /*   * The hardware normally enables the A-link power management feature, which   * lets the system lower the power consumption in idle states. diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h index ed6700d00fe6..820f532f7c1c 100644 --- a/drivers/usb/host/pci-quirks.h +++ b/drivers/usb/host/pci-quirks.h @@ -5,6 +5,7 @@  void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);  int uhci_check_and_reset_hc(struct pci_dev *pdev, unsigned long base);  int usb_amd_find_chipset_info(void); +bool usb_amd_hang_symptom_quirk(void);  void usb_amd_dev_put(void);  void usb_amd_quirk_pll_disable(void);  void usb_amd_quirk_pll_enable(void); | 
