Commit 831d83a5 authored by Niklas Cassel's avatar Niklas Cassel
Browse files

Merge remote-tracking branch 'libata/for-6.10-fixes' into for-6.11

Pull in bug fixes.
parents 816be86c eeb25a09
Loading
Loading
Loading
Loading
+20 −6
Original line number Diff line number Diff line
@@ -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 */
	/* 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, 0x7ae2), board_ahci_pcs_quirk }, /* Alder Lake-P AHCI */

	/* 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,
@@ -1736,6 +1735,14 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap)
	if (ap->pflags & ATA_PFLAG_EXTERNAL)
		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 */
	if (mobile_lpm_policy != -1) {
		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));

	host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
	if (!host)
		return -ENOMEM;
	if (!host) {
		rc = -ENOMEM;
		goto err_rm_sysfs_file;
	}
	host->private_data = hpriv;

	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 */
	rc = ahci_configure_dma_masks(pdev, hpriv);
	if (rc)
		return rc;
		goto err_rm_sysfs_file;

	rc = ahci_pci_reset_controller(host);
	if (rc)
		return rc;
		goto err_rm_sysfs_file;

	ahci_pci_init_controller(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);
	if (rc)
		return rc;
		goto err_rm_sysfs_file;

	pm_runtime_put_noidle(&pdev->dev);
	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)
+26 −13
Original line number Diff line number Diff line
@@ -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-205",	NULL,	ATA_HORKAGE_NOLPM },

	/* Crucial BX100 SSD 500GB has broken LPM support */
	{ "CT500BX100SSD1",		NULL,	ATA_HORKAGE_NOLPM },
	/* Crucial devices with broken LPM support */
	{ "CT*0BX*00SSD1",		NULL,	ATA_HORKAGE_NOLPM },

	/* 512GB MX100 with MU01 firmware has both queued TRIM and LPM issues */
	{ "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_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 */
	{ "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", 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;
}

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)
{
	struct ata_host *host = dev_get_drvdata(gendev);
@@ -5517,12 +5535,7 @@ static void ata_host_release(struct kref *kref)
	int i;

	for (i = 0; i < host->n_ports; i++) {
		struct ata_port *ap = host->ports[i];

		kfree(ap->pmp_link);
		kfree(ap->slave_link);
		kfree(ap->ncq_sense_buf);
		kfree(ap);
		ata_port_free(host->ports[i]);
		host->ports[i] = NULL;
	}
	kfree(host);
@@ -5572,8 +5585,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
	if (!host)
		return NULL;

	if (!devres_open_group(dev, NULL, GFP_KERNEL))
		goto err_free;
	if (!devres_open_group(dev, NULL, GFP_KERNEL)) {
		kfree(host);
		return NULL;
	}

	dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
	if (!dr)
@@ -5605,8 +5620,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)

 err_out:
	devres_release_group(dev, NULL);
 err_free:
	kfree(host);
	return NULL;
}
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.
	 */
	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 */
	for (i = 0; i < host->n_ports; i++) {
+4 −4
Original line number Diff line number Diff line
@@ -1864,11 +1864,11 @@ static unsigned int ata_scsiop_inq_std(struct ata_scsi_args *args, u8 *rbuf)
		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) ||
	    (args->dev->link->ap->pflags & ATA_PFLAG_EXTERNAL))
	if (ata_id_removable(args->id))
		hdr[1] |= (1 << 7);

	if (args->dev->class == ATA_DEV_ZAC) {
+6 −3
Original line number Diff line number Diff line
@@ -915,10 +915,13 @@ static const struct scsi_host_template pata_macio_sht = {
	.sg_tablesize		= MAX_DCMDS,
	/* We may not need that strict one */
	.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,
	.sdev_groups		= ata_common_sdev_groups,
	.can_queue		= ATA_DEF_QUEUE,
+3 −3
Original line number Diff line number Diff line
@@ -610,15 +610,15 @@ int sas_ata_init(struct domain_device *found_dev)

	rc = ata_sas_tport_add(ata_host->dev, ap);
	if (rc)
		goto destroy_port;
		goto free_port;

	found_dev->sata_dev.ata_host = ata_host;
	found_dev->sata_dev.ap = ap;

	return 0;

destroy_port:
	kfree(ap);
free_port:
	ata_port_free(ap);
free_host:
	ata_host_put(ata_host);
	return rc;
Loading