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 Diff line number Diff line
@@ -128,16 +128,6 @@ config PDC_ADMA

	  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
	tristate "OCTEON Boot Bus Compact Flash support"
	depends on CPU_CAVIUM_OCTEON
@@ -366,7 +356,7 @@ config PATA_CS5535

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

	  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
	tristate "NETCELL Revolution RAID support"
	depends on PCI
+1 −1
Original line number Diff line number Diff line
@@ -11,7 +11,6 @@ obj-$(CONFIG_SATA_DWC) += sata_dwc_460ex.o

# SFF w/ custom DMA
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_SATA_QSTOR)	+= sata_qstor.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_MACIO)	+= pata_macio.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_NINJA32)	+= pata_ninja32.o
obj-$(CONFIG_PATA_NS87415)	+= pata_ns87415.o
+15 −9
Original line number 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;

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

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

@@ -4858,14 +4855,23 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
		if (unlikely(qc->err_mask))
			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);
			__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);
			else
				__ata_qc_complete(qc);
			return;
		}

+14 −3
Original line number 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_eh_context *ehc = &link->eh_context;
	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 err_mask;
	int rc;
@@ -3338,6 +3339,14 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
		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 */
	ata_for_each_dev(dev, link, ENABLED) {
		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;

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 (!dev || ehc->tries[dev->devno] <= 2) {
		ata_link_printk(link, KERN_WARNING,
+3 −4
Original line number 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))
			return ata_sff_idle_irq(ap);
		break;
	case HSM_ST:
	case HSM_ST_LAST:
		break;
	default:
	case HSM_ST_IDLE:
		return ata_sff_idle_irq(ap);
	default:
		break;
	}

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