Skip to content

Commit e6b7e41

Browse files
Chuansheng-Liuhtejun
authored andcommitted
ata: Disabling the async PM for JMicron chip 363/361
After enabled the PM feature that supporting async noirq(76569fa (PM / sleep: Asynchronous threads for resume_noirq)), Jay hit the system resuming issue, that one of the JMicron controller can not be powered up. His device tree is like below: +-1c.4-[02]--+-00.0 JMicron Technology Corp. JMB363 SATA/IDE Controller | \-00.1 JMicron Technology Corp. JMB363 SATA/IDE Controller After investigation, we found the the Micron chip 363 included one SATA controller(0000:02:00.0) and one PATA controller(0000:02:00.1), these two controllers do not have parent-children relationship, but the PATA controller only can be powered on after the SATA controller has finished the powering on. If we enabled the async noirq(), then the below error is hit during noirq phase: pata_jmicron 0000:02:00.1: Refused to change power state, currently in D3 Here for JMicron chip 363/361, we need forcedly to disable the async method. Bug detail: https://bugzilla.kernel.org/show_bug.cgi?id=81551 Reported-by: Jay <[email protected]> Signed-off-by: Chuansheng Liu <[email protected]> Acked-by: Rafael J. Wysocki <[email protected]> Signed-off-by: Tejun Heo <[email protected]>
1 parent 6cad137 commit e6b7e41

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

drivers/ata/ahci.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1337,6 +1337,18 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
13371337
else if (pdev->vendor == 0x1c44 && pdev->device == 0x8000)
13381338
ahci_pci_bar = AHCI_PCI_BAR_ENMOTUS;
13391339

1340+
/*
1341+
* The JMicron chip 361/363 contains one SATA controller and one
1342+
* PATA controller,for powering on these both controllers, we must
1343+
* follow the sequence one by one, otherwise one of them can not be
1344+
* powered on successfully, so here we disable the async suspend
1345+
* method for these chips.
1346+
*/
1347+
if (pdev->vendor == PCI_VENDOR_ID_JMICRON &&
1348+
(pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 ||
1349+
pdev->device == PCI_DEVICE_ID_JMICRON_JMB361))
1350+
device_disable_async_suspend(&pdev->dev);
1351+
13401352
/* acquire resources */
13411353
rc = pcim_enable_device(pdev);
13421354
if (rc)

drivers/ata/pata_jmicron.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,18 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
143143
};
144144
const struct ata_port_info *ppi[] = { &info, NULL };
145145

146+
/*
147+
* The JMicron chip 361/363 contains one SATA controller and one
148+
* PATA controller,for powering on these both controllers, we must
149+
* follow the sequence one by one, otherwise one of them can not be
150+
* powered on successfully, so here we disable the async suspend
151+
* method for these chips.
152+
*/
153+
if (pdev->vendor == PCI_VENDOR_ID_JMICRON &&
154+
(pdev->device == PCI_DEVICE_ID_JMICRON_JMB363 ||
155+
pdev->device == PCI_DEVICE_ID_JMICRON_JMB361))
156+
device_disable_async_suspend(&pdev->dev);
157+
146158
return ata_pci_bmdma_init_one(pdev, ppi, &jmicron_sht, NULL, 0);
147159
}
148160

0 commit comments

Comments
 (0)