Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dfe80f63 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev:
  libata: issue DIPM enable commands with LPM state updated
  libata: no special completion processing for EH commands
  pata_mpc52xx: driver needs BMDMA
  pata_cs5536: Add support for non-X86_32 platforms
  libata-sff: fix HSM_ST_ERR handling in __ata_sff_port_intr()
parents a4790c94 e5005b15
Loading
Loading
Loading
Loading
+11 −11
Original line number Original line Diff line number Diff line
@@ -128,16 +128,6 @@ config PDC_ADMA


	  If unsure, say N.
	  If unsure, say N.


config PATA_MPC52xx
	tristate "Freescale MPC52xx SoC internal IDE"
	depends on PPC_MPC52xx && PPC_BESTCOMM
	select PPC_BESTCOMM_ATA
	help
	  This option enables support for integrated IDE controller
	  of the Freescale MPC52xx SoC.

	  If unsure, say N.

config PATA_OCTEON_CF
config PATA_OCTEON_CF
	tristate "OCTEON Boot Bus Compact Flash support"
	tristate "OCTEON Boot Bus Compact Flash support"
	depends on CPU_CAVIUM_OCTEON
	depends on CPU_CAVIUM_OCTEON
@@ -366,7 +356,7 @@ config PATA_CS5535


config PATA_CS5536
config PATA_CS5536
	tristate "CS5536 PATA support"
	tristate "CS5536 PATA support"
	depends on PCI && X86 && !X86_64
	depends on PCI
	help
	help
	  This option enables support for the AMD CS5536
	  This option enables support for the AMD CS5536
	  companion chip used with the Geode LX processor family.
	  companion chip used with the Geode LX processor family.
@@ -491,6 +481,16 @@ config PATA_MARVELL


	  If unsure, say N.
	  If unsure, say N.


config PATA_MPC52xx
	tristate "Freescale MPC52xx SoC internal IDE"
	depends on PPC_MPC52xx && PPC_BESTCOMM
	select PPC_BESTCOMM_ATA
	help
	  This option enables support for integrated IDE controller
	  of the Freescale MPC52xx SoC.

	  If unsure, say N.

config PATA_NETCELL
config PATA_NETCELL
	tristate "NETCELL Revolution RAID support"
	tristate "NETCELL Revolution RAID support"
	depends on PCI
	depends on PCI
+1 −1
Original line number Original line Diff line number Diff line
@@ -11,7 +11,6 @@ obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o


# SFF w/ custom DMA
# SFF w/ custom DMA
obj-$(CONFIG_PDC_ADMA)		+= pdc_adma.o
obj-$(CONFIG_PDC_ADMA)		+= pdc_adma.o
obj-$(CONFIG_PATA_MPC52xx)	+= pata_mpc52xx.o
obj-$(CONFIG_PATA_OCTEON_CF)	+= pata_octeon_cf.o
obj-$(CONFIG_PATA_OCTEON_CF)	+= pata_octeon_cf.o
obj-$(CONFIG_SATA_QSTOR)	+= sata_qstor.o
obj-$(CONFIG_SATA_QSTOR)	+= sata_qstor.o
obj-$(CONFIG_SATA_SX4)		+= sata_sx4.o
obj-$(CONFIG_SATA_SX4)		+= sata_sx4.o
@@ -52,6 +51,7 @@ obj-$(CONFIG_PATA_IT821X) += pata_it821x.o
obj-$(CONFIG_PATA_JMICRON)	+= pata_jmicron.o
obj-$(CONFIG_PATA_JMICRON)	+= pata_jmicron.o
obj-$(CONFIG_PATA_MACIO)	+= pata_macio.o
obj-$(CONFIG_PATA_MACIO)	+= pata_macio.o
obj-$(CONFIG_PATA_MARVELL)	+= pata_marvell.o
obj-$(CONFIG_PATA_MARVELL)	+= pata_marvell.o
obj-$(CONFIG_PATA_MPC52xx)	+= pata_mpc52xx.o
obj-$(CONFIG_PATA_NETCELL)	+= pata_netcell.o
obj-$(CONFIG_PATA_NETCELL)	+= pata_netcell.o
obj-$(CONFIG_PATA_NINJA32)	+= pata_ninja32.o
obj-$(CONFIG_PATA_NINJA32)	+= pata_ninja32.o
obj-$(CONFIG_PATA_NS87415)	+= pata_ns87415.o
obj-$(CONFIG_PATA_NS87415)	+= pata_ns87415.o
+15 −9
Original line number Original line Diff line number Diff line
@@ -4807,9 +4807,6 @@ static void ata_verify_xfer(struct ata_queued_cmd *qc)
{
{
	struct ata_device *dev = qc->dev;
	struct ata_device *dev = qc->dev;


	if (ata_tag_internal(qc->tag))
		return;

	if (ata_is_nodata(qc->tf.protocol))
	if (ata_is_nodata(qc->tf.protocol))
		return;
		return;


@@ -4858,14 +4855,23 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
		if (unlikely(qc->err_mask))
		if (unlikely(qc->err_mask))
			qc->flags |= ATA_QCFLAG_FAILED;
			qc->flags |= ATA_QCFLAG_FAILED;


		if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
		/*
			/* always fill result TF for failed qc */
		 * Finish internal commands without any further processing
		 * and always with the result TF filled.
		 */
		if (unlikely(ata_tag_internal(qc->tag))) {
			fill_result_tf(qc);
			fill_result_tf(qc);
			__ata_qc_complete(qc);
			return;
		}


			if (!ata_tag_internal(qc->tag))
		/*
		 * Non-internal qc has failed.  Fill the result TF and
		 * summon EH.
		 */
		if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
			fill_result_tf(qc);
			ata_qc_schedule_eh(qc);
			ata_qc_schedule_eh(qc);
			else
				__ata_qc_complete(qc);
			return;
			return;
		}
		}


+14 −3
Original line number Original line Diff line number Diff line
@@ -3275,6 +3275,7 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
	struct ata_port *ap = ata_is_host_link(link) ? link->ap : NULL;
	struct ata_port *ap = ata_is_host_link(link) ? link->ap : NULL;
	struct ata_eh_context *ehc = &link->eh_context;
	struct ata_eh_context *ehc = &link->eh_context;
	struct ata_device *dev, *link_dev = NULL, *lpm_dev = NULL;
	struct ata_device *dev, *link_dev = NULL, *lpm_dev = NULL;
	enum ata_lpm_policy old_policy = link->lpm_policy;
	unsigned int hints = ATA_LPM_EMPTY | ATA_LPM_HIPM;
	unsigned int hints = ATA_LPM_EMPTY | ATA_LPM_HIPM;
	unsigned int err_mask;
	unsigned int err_mask;
	int rc;
	int rc;
@@ -3338,6 +3339,14 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
		goto fail;
		goto fail;
	}
	}


	/*
	 * Low level driver acked the transition.  Issue DIPM command
	 * with the new policy set.
	 */
	link->lpm_policy = policy;
	if (ap && ap->slave_link)
		ap->slave_link->lpm_policy = policy;

	/* host config updated, enable DIPM if transitioning to MIN_POWER */
	/* host config updated, enable DIPM if transitioning to MIN_POWER */
	ata_for_each_dev(dev, link, ENABLED) {
	ata_for_each_dev(dev, link, ENABLED) {
		if (policy == ATA_LPM_MIN_POWER && ata_id_has_dipm(dev->id)) {
		if (policy == ATA_LPM_MIN_POWER && ata_id_has_dipm(dev->id)) {
@@ -3353,12 +3362,14 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
		}
		}
	}
	}


	link->lpm_policy = policy;
	if (ap && ap->slave_link)
		ap->slave_link->lpm_policy = policy;
	return 0;
	return 0;


fail:
fail:
	/* restore the old policy */
	link->lpm_policy = old_policy;
	if (ap && ap->slave_link)
		ap->slave_link->lpm_policy = old_policy;

	/* if no device or only one more chance is left, disable LPM */
	/* if no device or only one more chance is left, disable LPM */
	if (!dev || ehc->tries[dev->devno] <= 2) {
	if (!dev || ehc->tries[dev->devno] <= 2) {
		ata_link_printk(link, KERN_WARNING,
		ata_link_printk(link, KERN_WARNING,
+3 −4
Original line number Original line Diff line number Diff line
@@ -1532,11 +1532,10 @@ static unsigned int __ata_sff_port_intr(struct ata_port *ap,
		if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
		if (!(qc->dev->flags & ATA_DFLAG_CDB_INTR))
			return ata_sff_idle_irq(ap);
			return ata_sff_idle_irq(ap);
		break;
		break;
	case HSM_ST:
	case HSM_ST_IDLE:
	case HSM_ST_LAST:
		break;
	default:
		return ata_sff_idle_irq(ap);
		return ata_sff_idle_irq(ap);
	default:
		break;
	}
	}


	/* check main status, clearing INTRQ if needed */
	/* check main status, clearing INTRQ if needed */
Loading