forked from Minki/linux
usb: pci-quirks: Correct AMD PLL quirk detection
The AMD PLL USB quirk is incorrectly enabled on newer Ryzen chipsets. The logic in usb_amd_find_chipset_info currently checks for unaffected chipsets rather than affected ones. This broke once a new chipset was added ine788787ef
. It makes more sense to reverse the logic so it won't need to be updated as new chipsets are added. Note that the core of the workaround in usb_amd_quirk_pll does correctly check the chipset. Signed-off-by: Ryan Kennedy <ryan5544@gmail.com> Fixes:e788787ef4
("usb:xhci:Add quirk for Certain failing HP keyboard on reset after resume") Cc: stable <stable@vger.kernel.org> Acked-by: Alan Stern <stern@rowland.harvard.edu> Link: https://lore.kernel.org/r/20190704153529.9429-2-ryan5544@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
5f9e832c13
commit
f3dccdaade
@ -205,7 +205,7 @@ int usb_amd_find_chipset_info(void)
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct amd_chipset_info info;
|
struct amd_chipset_info info;
|
||||||
int ret;
|
int need_pll_quirk = 0;
|
||||||
|
|
||||||
spin_lock_irqsave(&amd_lock, flags);
|
spin_lock_irqsave(&amd_lock, flags);
|
||||||
|
|
||||||
@ -219,21 +219,28 @@ int usb_amd_find_chipset_info(void)
|
|||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
|
|
||||||
if (!amd_chipset_sb_type_init(&info)) {
|
if (!amd_chipset_sb_type_init(&info)) {
|
||||||
ret = 0;
|
|
||||||
goto commit;
|
goto commit;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Below chipset generations needn't enable AMD PLL quirk */
|
switch (info.sb_type.gen) {
|
||||||
if (info.sb_type.gen == AMD_CHIPSET_UNKNOWN ||
|
case AMD_CHIPSET_SB700:
|
||||||
info.sb_type.gen == AMD_CHIPSET_SB600 ||
|
need_pll_quirk = info.sb_type.rev <= 0x3B;
|
||||||
info.sb_type.gen == AMD_CHIPSET_YANGTZE ||
|
break;
|
||||||
(info.sb_type.gen == AMD_CHIPSET_SB700 &&
|
case AMD_CHIPSET_SB800:
|
||||||
info.sb_type.rev > 0x3b)) {
|
case AMD_CHIPSET_HUDSON2:
|
||||||
|
case AMD_CHIPSET_BOLTON:
|
||||||
|
need_pll_quirk = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
need_pll_quirk = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!need_pll_quirk) {
|
||||||
if (info.smbus_dev) {
|
if (info.smbus_dev) {
|
||||||
pci_dev_put(info.smbus_dev);
|
pci_dev_put(info.smbus_dev);
|
||||||
info.smbus_dev = NULL;
|
info.smbus_dev = NULL;
|
||||||
}
|
}
|
||||||
ret = 0;
|
|
||||||
goto commit;
|
goto commit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,7 +259,7 @@ int usb_amd_find_chipset_info(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = info.probe_result = 1;
|
need_pll_quirk = info.probe_result = 1;
|
||||||
printk(KERN_DEBUG "QUIRK: Enable AMD PLL fix\n");
|
printk(KERN_DEBUG "QUIRK: Enable AMD PLL fix\n");
|
||||||
|
|
||||||
commit:
|
commit:
|
||||||
@ -263,7 +270,7 @@ commit:
|
|||||||
|
|
||||||
/* Mark that we where here */
|
/* Mark that we where here */
|
||||||
amd_chipset.probe_count++;
|
amd_chipset.probe_count++;
|
||||||
ret = amd_chipset.probe_result;
|
need_pll_quirk = amd_chipset.probe_result;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
|
|
||||||
@ -277,7 +284,7 @@ commit:
|
|||||||
spin_unlock_irqrestore(&amd_lock, flags);
|
spin_unlock_irqrestore(&amd_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return need_pll_quirk;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(usb_amd_find_chipset_info);
|
EXPORT_SYMBOL_GPL(usb_amd_find_chipset_info);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user