Merge remote-tracking branch 'libata/for-6.10-fixes' into for-6.11
Pull in bug fixes.
This commit is contained in:
commit
831d83a537
@ -429,7 +429,6 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
|||||||
{ PCI_VDEVICE(INTEL, 0x02d7), board_ahci_pcs_quirk }, /* Comet Lake PCH RAID */
|
{ PCI_VDEVICE(INTEL, 0x02d7), board_ahci_pcs_quirk }, /* Comet Lake PCH RAID */
|
||||||
/* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
|
/* Elkhart Lake IDs 0x4b60 & 0x4b62 https://sata-io.org/product/8803 not tested yet */
|
||||||
{ PCI_VDEVICE(INTEL, 0x4b63), board_ahci_pcs_quirk }, /* Elkhart Lake AHCI */
|
{ PCI_VDEVICE(INTEL, 0x4b63), board_ahci_pcs_quirk }, /* Elkhart Lake AHCI */
|
||||||
{ PCI_VDEVICE(INTEL, 0x7ae2), board_ahci_pcs_quirk }, /* Alder Lake-P AHCI */
|
|
||||||
|
|
||||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||||
@ -1736,6 +1735,14 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap)
|
|||||||
if (ap->pflags & ATA_PFLAG_EXTERNAL)
|
if (ap->pflags & ATA_PFLAG_EXTERNAL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/* If no LPM states are supported by the HBA, do not bother with LPM */
|
||||||
|
if ((ap->host->flags & ATA_HOST_NO_PART) &&
|
||||||
|
(ap->host->flags & ATA_HOST_NO_SSC) &&
|
||||||
|
(ap->host->flags & ATA_HOST_NO_DEVSLP)) {
|
||||||
|
ata_port_dbg(ap, "no LPM states supported, not enabling LPM\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* user modified policy via module param */
|
/* user modified policy via module param */
|
||||||
if (mobile_lpm_policy != -1) {
|
if (mobile_lpm_policy != -1) {
|
||||||
policy = mobile_lpm_policy;
|
policy = mobile_lpm_policy;
|
||||||
@ -1968,8 +1975,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
|
n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
|
||||||
|
|
||||||
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
|
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
|
||||||
if (!host)
|
if (!host) {
|
||||||
return -ENOMEM;
|
rc = -ENOMEM;
|
||||||
|
goto err_rm_sysfs_file;
|
||||||
|
}
|
||||||
host->private_data = hpriv;
|
host->private_data = hpriv;
|
||||||
|
|
||||||
if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
|
if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
|
||||||
@ -2024,11 +2033,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
/* initialize adapter */
|
/* initialize adapter */
|
||||||
rc = ahci_configure_dma_masks(pdev, hpriv);
|
rc = ahci_configure_dma_masks(pdev, hpriv);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
goto err_rm_sysfs_file;
|
||||||
|
|
||||||
rc = ahci_pci_reset_controller(host);
|
rc = ahci_pci_reset_controller(host);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
goto err_rm_sysfs_file;
|
||||||
|
|
||||||
ahci_pci_init_controller(host);
|
ahci_pci_init_controller(host);
|
||||||
ahci_pci_print_info(host);
|
ahci_pci_print_info(host);
|
||||||
@ -2037,10 +2046,15 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
|
|
||||||
rc = ahci_host_activate(host, &ahci_sht);
|
rc = ahci_host_activate(host, &ahci_sht);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
goto err_rm_sysfs_file;
|
||||||
|
|
||||||
pm_runtime_put_noidle(&pdev->dev);
|
pm_runtime_put_noidle(&pdev->dev);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
err_rm_sysfs_file:
|
||||||
|
sysfs_remove_file_from_group(&pdev->dev.kobj,
|
||||||
|
&dev_attr_remapped_nvme.attr, NULL);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ahci_shutdown_one(struct pci_dev *pdev)
|
static void ahci_shutdown_one(struct pci_dev *pdev)
|
||||||
|
@ -4136,8 +4136,8 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||||||
{ "PIONEER BD-RW BDR-207M", NULL, ATA_HORKAGE_NOLPM },
|
{ "PIONEER BD-RW BDR-207M", NULL, ATA_HORKAGE_NOLPM },
|
||||||
{ "PIONEER BD-RW BDR-205", NULL, ATA_HORKAGE_NOLPM },
|
{ "PIONEER BD-RW BDR-205", NULL, ATA_HORKAGE_NOLPM },
|
||||||
|
|
||||||
/* Crucial BX100 SSD 500GB has broken LPM support */
|
/* Crucial devices with broken LPM support */
|
||||||
{ "CT500BX100SSD1", NULL, ATA_HORKAGE_NOLPM },
|
{ "CT*0BX*00SSD1", NULL, ATA_HORKAGE_NOLPM },
|
||||||
|
|
||||||
/* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */
|
/* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */
|
||||||
{ "Crucial_CT512MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
|
{ "Crucial_CT512MX100*", "MU01", ATA_HORKAGE_NO_NCQ_TRIM |
|
||||||
@ -4155,6 +4155,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||||||
ATA_HORKAGE_ZERO_AFTER_TRIM |
|
ATA_HORKAGE_ZERO_AFTER_TRIM |
|
||||||
ATA_HORKAGE_NOLPM },
|
ATA_HORKAGE_NOLPM },
|
||||||
|
|
||||||
|
/* AMD Radeon devices with broken LPM support */
|
||||||
|
{ "R3SL240G", NULL, ATA_HORKAGE_NOLPM },
|
||||||
|
|
||||||
|
/* Apacer models with LPM issues */
|
||||||
|
{ "Apacer AS340*", NULL, ATA_HORKAGE_NOLPM },
|
||||||
|
|
||||||
/* These specific Samsung models/firmware-revs do not handle LPM well */
|
/* These specific Samsung models/firmware-revs do not handle LPM well */
|
||||||
{ "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM },
|
{ "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM },
|
||||||
{ "SAMSUNG SSD PM830 mSATA *", "CXM13D1Q", ATA_HORKAGE_NOLPM },
|
{ "SAMSUNG SSD PM830 mSATA *", "CXM13D1Q", ATA_HORKAGE_NOLPM },
|
||||||
@ -5491,6 +5497,18 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
|
|||||||
return ap;
|
return ap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ata_port_free(struct ata_port *ap)
|
||||||
|
{
|
||||||
|
if (!ap)
|
||||||
|
return;
|
||||||
|
|
||||||
|
kfree(ap->pmp_link);
|
||||||
|
kfree(ap->slave_link);
|
||||||
|
kfree(ap->ncq_sense_buf);
|
||||||
|
kfree(ap);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ata_port_free);
|
||||||
|
|
||||||
static void ata_devres_release(struct device *gendev, void *res)
|
static void ata_devres_release(struct device *gendev, void *res)
|
||||||
{
|
{
|
||||||
struct ata_host *host = dev_get_drvdata(gendev);
|
struct ata_host *host = dev_get_drvdata(gendev);
|
||||||
@ -5517,12 +5535,7 @@ static void ata_host_release(struct kref *kref)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < host->n_ports; i++) {
|
for (i = 0; i < host->n_ports; i++) {
|
||||||
struct ata_port *ap = host->ports[i];
|
ata_port_free(host->ports[i]);
|
||||||
|
|
||||||
kfree(ap->pmp_link);
|
|
||||||
kfree(ap->slave_link);
|
|
||||||
kfree(ap->ncq_sense_buf);
|
|
||||||
kfree(ap);
|
|
||||||
host->ports[i] = NULL;
|
host->ports[i] = NULL;
|
||||||
}
|
}
|
||||||
kfree(host);
|
kfree(host);
|
||||||
@ -5572,8 +5585,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
|||||||
if (!host)
|
if (!host)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!devres_open_group(dev, NULL, GFP_KERNEL))
|
if (!devres_open_group(dev, NULL, GFP_KERNEL)) {
|
||||||
goto err_free;
|
kfree(host);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
|
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
|
||||||
if (!dr)
|
if (!dr)
|
||||||
@ -5605,8 +5620,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
|||||||
|
|
||||||
err_out:
|
err_out:
|
||||||
devres_release_group(dev, NULL);
|
devres_release_group(dev, NULL);
|
||||||
err_free:
|
|
||||||
kfree(host);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ata_host_alloc);
|
EXPORT_SYMBOL_GPL(ata_host_alloc);
|
||||||
@ -5905,7 +5918,7 @@ int ata_host_register(struct ata_host *host, const struct scsi_host_template *sh
|
|||||||
* allocation time.
|
* allocation time.
|
||||||
*/
|
*/
|
||||||
for (i = host->n_ports; host->ports[i]; i++)
|
for (i = host->n_ports; host->ports[i]; i++)
|
||||||
kfree(host->ports[i]);
|
ata_port_free(host->ports[i]);
|
||||||
|
|
||||||
/* give ports names and add SCSI hosts */
|
/* give ports names and add SCSI hosts */
|
||||||
for (i = 0; i < host->n_ports; i++) {
|
for (i = 0; i < host->n_ports; i++) {
|
||||||
|
@ -1864,11 +1864,11 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
|
|||||||
2
|
2
|
||||||
};
|
};
|
||||||
|
|
||||||
/* set scsi removable (RMB) bit per ata bit, or if the
|
/*
|
||||||
* AHCI port says it's external (Hotplug-capable, eSATA).
|
* Set the SCSI Removable Media Bit (RMB) if the ATA removable media
|
||||||
|
* device bit (obsolete since ATA-8 ACS) is set.
|
||||||
*/
|
*/
|
||||||
if (ata_id_removable(args->id) ||
|
if (ata_id_removable(args->id))
|
||||||
(args->dev->link->ap->pflags & ATA_PFLAG_EXTERNAL))
|
|
||||||
hdr[1] |= (1 << 7);
|
hdr[1] |= (1 << 7);
|
||||||
|
|
||||||
if (args->dev->class == ATA_DEV_ZAC) {
|
if (args->dev->class == ATA_DEV_ZAC) {
|
||||||
|
@ -915,10 +915,13 @@ static const struct scsi_host_template pata_macio_sht = {
|
|||||||
.sg_tablesize = MAX_DCMDS,
|
.sg_tablesize = MAX_DCMDS,
|
||||||
/* We may not need that strict one */
|
/* We may not need that strict one */
|
||||||
.dma_boundary = ATA_DMA_BOUNDARY,
|
.dma_boundary = ATA_DMA_BOUNDARY,
|
||||||
/* Not sure what the real max is but we know it's less than 64K, let's
|
/*
|
||||||
* use 64K minus 256
|
* The SCSI core requires the segment size to cover at least a page, so
|
||||||
|
* for 64K page size kernels this must be at least 64K. However the
|
||||||
|
* hardware can't handle 64K, so pata_macio_qc_prep() will split large
|
||||||
|
* requests.
|
||||||
*/
|
*/
|
||||||
.max_segment_size = MAX_DBDMA_SEG,
|
.max_segment_size = SZ_64K,
|
||||||
.device_configure = pata_macio_device_configure,
|
.device_configure = pata_macio_device_configure,
|
||||||
.sdev_groups = ata_common_sdev_groups,
|
.sdev_groups = ata_common_sdev_groups,
|
||||||
.can_queue = ATA_DEF_QUEUE,
|
.can_queue = ATA_DEF_QUEUE,
|
||||||
|
@ -610,15 +610,15 @@ int sas_ata_init(struct domain_device *found_dev)
|
|||||||
|
|
||||||
rc = ata_sas_tport_add(ata_host->dev, ap);
|
rc = ata_sas_tport_add(ata_host->dev, ap);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto destroy_port;
|
goto free_port;
|
||||||
|
|
||||||
found_dev->sata_dev.ata_host = ata_host;
|
found_dev->sata_dev.ata_host = ata_host;
|
||||||
found_dev->sata_dev.ap = ap;
|
found_dev->sata_dev.ap = ap;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
destroy_port:
|
free_port:
|
||||||
kfree(ap);
|
ata_port_free(ap);
|
||||||
free_host:
|
free_host:
|
||||||
ata_host_put(ata_host);
|
ata_host_put(ata_host);
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -301,7 +301,7 @@ void sas_free_device(struct kref *kref)
|
|||||||
|
|
||||||
if (dev_is_sata(dev) && dev->sata_dev.ap) {
|
if (dev_is_sata(dev) && dev->sata_dev.ap) {
|
||||||
ata_sas_tport_delete(dev->sata_dev.ap);
|
ata_sas_tport_delete(dev->sata_dev.ap);
|
||||||
kfree(dev->sata_dev.ap);
|
ata_port_free(dev->sata_dev.ap);
|
||||||
ata_host_put(dev->sata_dev.ata_host);
|
ata_host_put(dev->sata_dev.ata_host);
|
||||||
dev->sata_dev.ata_host = NULL;
|
dev->sata_dev.ata_host = NULL;
|
||||||
dev->sata_dev.ap = NULL;
|
dev->sata_dev.ap = NULL;
|
||||||
|
@ -1249,6 +1249,7 @@ extern int ata_slave_link_init(struct ata_port *ap);
|
|||||||
extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
|
extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
|
||||||
struct ata_port_info *, struct Scsi_Host *);
|
struct ata_port_info *, struct Scsi_Host *);
|
||||||
extern void ata_port_probe(struct ata_port *ap);
|
extern void ata_port_probe(struct ata_port *ap);
|
||||||
|
extern void ata_port_free(struct ata_port *ap);
|
||||||
extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
|
extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
|
||||||
extern void ata_sas_tport_delete(struct ata_port *ap);
|
extern void ata_sas_tport_delete(struct ata_port *ap);
|
||||||
int ata_sas_device_configure(struct scsi_device *sdev, struct queue_limits *lim,
|
int ata_sas_device_configure(struct scsi_device *sdev, struct queue_limits *lim,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user