diff options
| author | Tejun Heo <tj@kernel.org> | 2014-01-16 09:44:34 -0500 |
|---|---|---|
| committer | Tejun Heo <tj@kernel.org> | 2014-01-16 09:44:34 -0500 |
| commit | 6e1af69780a4df749d28a129596ed576a0d7996c (patch) | |
| tree | 67f0dee7b39c006dc305d7273db8222633603abf | |
| parent | a96cc303e42ad7830dde929aad0046e448a05505 (diff) | |
| parent | 55c82a6c2a513de1d8a20c3b3a769129a1a14d50 (diff) | |
Merge branch 'for-3.13-fixes' into for-3.14
A scheduled horkage patch will conflict with HORKAGE changes in
for-3.13-fixes. Pull in to avoid unnecessary merge conflicts.
Signed-off-by: Tejun Heo <tj@kernel.org>
| -rw-r--r-- | Documentation/kernel-parameters.txt | 2 | ||||
| -rw-r--r-- | drivers/ata/ahci.c | 21 | ||||
| -rw-r--r-- | drivers/ata/libata-core.c | 16 | ||||
| -rw-r--r-- | drivers/ata/libata-scsi.c | 21 | ||||
| -rw-r--r-- | drivers/ata/sata_sis.c | 4 | ||||
| -rw-r--r-- | include/linux/libata.h | 1 | ||||
| -rw-r--r-- | kernel/freezer.c | 6 |
7 files changed, 60 insertions, 11 deletions
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt index 50680a59a2ff..b9e9bd854298 100644 --- a/Documentation/kernel-parameters.txt +++ b/Documentation/kernel-parameters.txt | |||
| @@ -1529,6 +1529,8 @@ bytes respectively. Such letter suffixes can also be entirely omitted. | |||
| 1529 | 1529 | ||
| 1530 | * atapi_dmadir: Enable ATAPI DMADIR bridge support | 1530 | * atapi_dmadir: Enable ATAPI DMADIR bridge support |
| 1531 | 1531 | ||
| 1532 | * disable: Disable this device. | ||
| 1533 | |||
| 1532 | If there are multiple matching configurations changing | 1534 | If there are multiple matching configurations changing |
| 1533 | the same attribute, the last one is used. | 1535 | the same attribute, the last one is used. |
| 1534 | 1536 | ||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index ea5b5a33a8b8..74911c2cb1dd 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -429,6 +429,9 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 429 | .driver_data = board_ahci_yes_fbs }, /* 88se9128 */ | 429 | .driver_data = board_ahci_yes_fbs }, /* 88se9128 */ |
| 430 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125), | 430 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9125), |
| 431 | .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ | 431 | .driver_data = board_ahci_yes_fbs }, /* 88se9125 */ |
| 432 | { PCI_DEVICE_SUB(PCI_VENDOR_ID_MARVELL_EXT, 0x9178, | ||
| 433 | PCI_VENDOR_ID_MARVELL_EXT, 0x9170), | ||
| 434 | .driver_data = board_ahci_yes_fbs }, /* 88se9170 */ | ||
| 432 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a), | 435 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x917a), |
| 433 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ | 436 | .driver_data = board_ahci_yes_fbs }, /* 88se9172 */ |
| 434 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172), | 437 | { PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9172), |
| @@ -1280,15 +1283,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1280 | if (rc) | 1283 | if (rc) |
| 1281 | return rc; | 1284 | return rc; |
| 1282 | 1285 | ||
| 1283 | /* AHCI controllers often implement SFF compatible interface. | ||
| 1284 | * Grab all PCI BARs just in case. | ||
| 1285 | */ | ||
| 1286 | rc = pcim_iomap_regions_request_all(pdev, 1 << ahci_pci_bar, DRV_NAME); | ||
| 1287 | if (rc == -EBUSY) | ||
| 1288 | pcim_pin_device(pdev); | ||
| 1289 | if (rc) | ||
| 1290 | return rc; | ||
| 1291 | |||
| 1292 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && | 1286 | if (pdev->vendor == PCI_VENDOR_ID_INTEL && |
| 1293 | (pdev->device == 0x2652 || pdev->device == 0x2653)) { | 1287 | (pdev->device == 0x2652 || pdev->device == 0x2653)) { |
| 1294 | u8 map; | 1288 | u8 map; |
| @@ -1305,6 +1299,15 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 1305 | } | 1299 | } |
| 1306 | } | 1300 | } |
| 1307 | 1301 | ||
| 1302 | /* AHCI controllers often implement SFF compatible interface. | ||
| 1303 | * Grab all PCI BARs just in case. | ||
| 1304 | */ | ||
| 1305 | rc = pcim_iomap_regions_request_all(pdev, 1 << ahci_pci_bar, DRV_NAME); | ||
| 1306 | if (rc == -EBUSY) | ||
| 1307 | pcim_pin_device(pdev); | ||
| 1308 | if (rc) | ||
| 1309 | return rc; | ||
| 1310 | |||
| 1308 | hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); | 1311 | hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL); |
| 1309 | if (!hpriv) | 1312 | if (!hpriv) |
| 1310 | return -ENOMEM; | 1313 | return -ENOMEM; |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index dae73efe5dbf..1393a5890ed5 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -2149,9 +2149,16 @@ static int ata_dev_config_ncq(struct ata_device *dev, | |||
| 2149 | "failed to get NCQ Send/Recv Log Emask 0x%x\n", | 2149 | "failed to get NCQ Send/Recv Log Emask 0x%x\n", |
| 2150 | err_mask); | 2150 | err_mask); |
| 2151 | } else { | 2151 | } else { |
| 2152 | u8 *cmds = dev->ncq_send_recv_cmds; | ||
| 2153 | |||
| 2152 | dev->flags |= ATA_DFLAG_NCQ_SEND_RECV; | 2154 | dev->flags |= ATA_DFLAG_NCQ_SEND_RECV; |
| 2153 | memcpy(dev->ncq_send_recv_cmds, ap->sector_buf, | 2155 | memcpy(cmds, ap->sector_buf, ATA_LOG_NCQ_SEND_RECV_SIZE); |
| 2154 | ATA_LOG_NCQ_SEND_RECV_SIZE); | 2156 | |
| 2157 | if (dev->horkage & ATA_HORKAGE_NO_NCQ_TRIM) { | ||
| 2158 | ata_dev_dbg(dev, "disabling queued TRIM support\n"); | ||
| 2159 | cmds[ATA_LOG_NCQ_SEND_RECV_DSM_OFFSET] &= | ||
| 2160 | ~ATA_LOG_NCQ_SEND_RECV_DSM_TRIM; | ||
| 2161 | } | ||
| 2155 | } | 2162 | } |
| 2156 | } | 2163 | } |
| 2157 | 2164 | ||
| @@ -4205,6 +4212,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
| 4205 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, | 4212 | { "PIONEER DVD-RW DVR-212D", NULL, ATA_HORKAGE_NOSETXFER }, |
| 4206 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, | 4213 | { "PIONEER DVD-RW DVR-216D", NULL, ATA_HORKAGE_NOSETXFER }, |
| 4207 | 4214 | ||
| 4215 | /* devices that don't properly handle queued TRIM commands */ | ||
| 4216 | { "Micron_M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
| 4217 | { "Crucial_CT???M500SSD1", NULL, ATA_HORKAGE_NO_NCQ_TRIM, }, | ||
| 4218 | |||
| 4208 | /* End Marker */ | 4219 | /* End Marker */ |
| 4209 | { } | 4220 | { } |
| 4210 | }; | 4221 | }; |
| @@ -6522,6 +6533,7 @@ static int __init ata_parse_force_one(char **cur, | |||
| 6522 | { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, | 6533 | { "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST }, |
| 6523 | { "rstonce", .lflags = ATA_LFLAG_RST_ONCE }, | 6534 | { "rstonce", .lflags = ATA_LFLAG_RST_ONCE }, |
| 6524 | { "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR }, | 6535 | { "atapi_dmadir", .horkage_on = ATA_HORKAGE_ATAPI_DMADIR }, |
| 6536 | { "disable", .horkage_on = ATA_HORKAGE_DISABLE }, | ||
| 6525 | }; | 6537 | }; |
| 6526 | char *start = *cur, *p = *cur; | 6538 | char *start = *cur, *p = *cur; |
| 6527 | char *id, *val, *endp; | 6539 | char *id, *val, *endp; |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index db6dfcfa3e2e..176f62950e3d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -3871,6 +3871,27 @@ void ata_scsi_hotplug(struct work_struct *work) | |||
| 3871 | return; | 3871 | return; |
| 3872 | } | 3872 | } |
| 3873 | 3873 | ||
| 3874 | /* | ||
| 3875 | * XXX - UGLY HACK | ||
| 3876 | * | ||
| 3877 | * The block layer suspend/resume path is fundamentally broken due | ||
| 3878 | * to freezable kthreads and workqueue and may deadlock if a block | ||
| 3879 | * device gets removed while resume is in progress. I don't know | ||
| 3880 | * what the solution is short of removing freezable kthreads and | ||
| 3881 | * workqueues altogether. | ||
| 3882 | * | ||
| 3883 | * The following is an ugly hack to avoid kicking off device | ||
| 3884 | * removal while freezer is active. This is a joke but does avoid | ||
| 3885 | * this particular deadlock scenario. | ||
| 3886 | * | ||
| 3887 | * https://bugzilla.kernel.org/show_bug.cgi?id=62801 | ||
| 3888 | * http://marc.info/?l=linux-kernel&m=138695698516487 | ||
| 3889 | */ | ||
| 3890 | #ifdef CONFIG_FREEZER | ||
| 3891 | while (pm_freezing) | ||
| 3892 | msleep(10); | ||
| 3893 | #endif | ||
| 3894 | |||
| 3874 | DPRINTK("ENTER\n"); | 3895 | DPRINTK("ENTER\n"); |
| 3875 | mutex_lock(&ap->scsi_scan_mutex); | 3896 | mutex_lock(&ap->scsi_scan_mutex); |
| 3876 | 3897 | ||
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index fe3ca0989b14..1ad2f62d34b9 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
| @@ -83,6 +83,10 @@ static struct pci_driver sis_pci_driver = { | |||
| 83 | .id_table = sis_pci_tbl, | 83 | .id_table = sis_pci_tbl, |
| 84 | .probe = sis_init_one, | 84 | .probe = sis_init_one, |
| 85 | .remove = ata_pci_remove_one, | 85 | .remove = ata_pci_remove_one, |
| 86 | #ifdef CONFIG_PM | ||
| 87 | .suspend = ata_pci_device_suspend, | ||
| 88 | .resume = ata_pci_device_resume, | ||
| 89 | #endif | ||
| 86 | }; | 90 | }; |
| 87 | 91 | ||
| 88 | static struct scsi_host_template sis_sht = { | 92 | static struct scsi_host_template sis_sht = { |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 0e23c26485f4..9b503376738f 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -418,6 +418,7 @@ enum { | |||
| 418 | ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */ | 418 | ATA_HORKAGE_DUMP_ID = (1 << 16), /* dump IDENTIFY data */ |
| 419 | ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */ | 419 | ATA_HORKAGE_MAX_SEC_LBA48 = (1 << 17), /* Set max sects to 65535 */ |
| 420 | ATA_HORKAGE_ATAPI_DMADIR = (1 << 18), /* device requires dmadir */ | 420 | ATA_HORKAGE_ATAPI_DMADIR = (1 << 18), /* device requires dmadir */ |
| 421 | ATA_HORKAGE_NO_NCQ_TRIM = (1 << 19), /* don't use queued TRIM */ | ||
| 421 | 422 | ||
| 422 | /* DMA mask for user DMA control: User visible values; DO NOT | 423 | /* DMA mask for user DMA control: User visible values; DO NOT |
| 423 | renumber */ | 424 | renumber */ |
diff --git a/kernel/freezer.c b/kernel/freezer.c index b462fa197517..aa6a8aadb911 100644 --- a/kernel/freezer.c +++ b/kernel/freezer.c | |||
| @@ -19,6 +19,12 @@ EXPORT_SYMBOL(system_freezing_cnt); | |||
| 19 | bool pm_freezing; | 19 | bool pm_freezing; |
| 20 | bool pm_nosig_freezing; | 20 | bool pm_nosig_freezing; |
| 21 | 21 | ||
| 22 | /* | ||
| 23 | * Temporary export for the deadlock workaround in ata_scsi_hotplug(). | ||
| 24 | * Remove once the hack becomes unnecessary. | ||
| 25 | */ | ||
| 26 | EXPORT_SYMBOL_GPL(pm_freezing); | ||
| 27 | |||
| 22 | /* protects freezing and frozen transitions */ | 28 | /* protects freezing and frozen transitions */ |
| 23 | static DEFINE_SPINLOCK(freezer_lock); | 29 | static DEFINE_SPINLOCK(freezer_lock); |
| 24 | 30 | ||
