[packages/kernel] - up to 4.11.1 - drop libata-ahci-pm patch, it's causing hangs after PM changes in 4.11

baggins baggins at pld-linux.org
Thu May 18 01:44:09 CEST 2017


commit 473ceb84e2e3c688ebd55ea92521a4fe126601e0
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Thu May 18 01:43:05 2017 +0200

    - up to 4.11.1
    - drop libata-ahci-pm patch, it's causing hangs after PM changes in 4.11

 kernel-libata-ahci-pm.patch | 629 --------------------------------------------
 kernel-small_fixes.patch    | 121 ---------
 kernel.spec                 |   6 +-
 3 files changed, 2 insertions(+), 754 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 5a12fdbe..46079bbd 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -73,7 +73,7 @@
 
 %define		rel		1
 %define		basever		4.11
-%define		postver		.0
+%define		postver		.1
 
 # define this to '-%{basever}' for longterm branch
 %define		versuffix	%{nil}
@@ -125,7 +125,7 @@ Source0:	https://www.kernel.org/pub/linux/kernel/v4.x/linux-%{basever}.tar.xz
 # Source0-md5:	251a5deee0fa6daf3f356b1bbda9eab8
 %if "%{postver}" != ".0"
 Patch0:		https://www.kernel.org/pub/linux/kernel/v4.x/patch-%{version}.xz
-# Patch0-md5:	f7f6515047207f3e4f0f32238e3ec80e
+# Patch0-md5:	947496600f57dfb4431e023816048870
 %endif
 Source1:	kernel.sysconfig
 
@@ -219,7 +219,6 @@ Patch500:	kernel-rt.patch
 Patch2000:	kernel-small_fixes.patch
 Patch2001:	kernel-pwc-uncompress.patch
 Patch2003:	kernel-regressions.patch
-Patch2004:	kernel-libata-ahci-pm.patch
 
 # git://git.kernel.org/pub/scm/linux/kernel/git/jj/linux-apparmor
 # branch v4.7-aa2.8-out-of-tree
@@ -722,7 +721,6 @@ rm -f localversion-rt
 %patch2000 -p1
 %patch2001 -p1
 #%patch2003 -p1
-%patch2004 -p1
 
 # Do not remove this, please!
 #%%patch50000 -p1
diff --git a/kernel-libata-ahci-pm.patch b/kernel-libata-ahci-pm.patch
deleted file mode 100644
index d22bb005..00000000
--- a/kernel-libata-ahci-pm.patch
+++ /dev/null
@@ -1,629 +0,0 @@
-From:	Matthew Garrett <mjg59 at coreos.com>
-Date:	Sat, 18 Apr 2015 08:26:34 -0700
-Subject: [PATCH 1/3] libata: Stash initial power management configuration
-
-The initial configuration for power management settings may be a result of
-the firmware using its knowledge of the installed hardware to program
-reasonable defaults. Stash as much of it as possible for later use.
-
-Signed-off-by: Matthew Garrett <mjg59 at srcf.ucam.org>
----
- drivers/ata/acard-ahci.c       |  3 +++
- drivers/ata/ahci.c             |  3 +++
- drivers/ata/ahci.h             |  7 +++++++
- drivers/ata/libahci.c          | 46 +++++++++++++++++++++++++++++++++++-------
- drivers/ata/libahci_platform.c |  4 ++++
- drivers/ata/libata-core.c      | 19 ++++++++++-------
- drivers/ata/libata-pmp.c       |  2 +-
- drivers/ata/libata.h           |  2 +-
- drivers/ata/sata_highbank.c    |  4 ++++
- include/linux/libata.h         |  3 +++
- 10 files changed, 77 insertions(+), 16 deletions(-)
-
-diff --git a/drivers/ata/acard-ahci.c b/drivers/ata/acard-ahci.c
-index 12489ce..0029229 100644
---- a/drivers/ata/acard-ahci.c
-+++ b/drivers/ata/acard-ahci.c
-@@ -476,6 +476,9 @@ static int acard_ahci_init_one(struct pci_dev *pdev, const struct pci_device_id
- 		ata_port_pbar_desc(ap, AHCI_PCI_BAR,
- 				   0x100 + ap->port_no * 0x80, "port");
- 
-+		rc = ahci_setup_port_privdata(ap);
-+		if (rc)
-+			return rc;
- 		/* set initial link pm policy */
- 		/*
- 		ap->pm_policy = NOT_AVAILABLE;
-diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
-index c7a92a7..0f875e2 100644
---- a/drivers/ata/ahci.c
-+++ b/drivers/ata/ahci.c
-@@ -1436,6 +1436,9 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
- 		if (ap->flags & ATA_FLAG_EM)
- 			ap->em_message_type = hpriv->em_msg_type;
- 
-+		rc = ahci_setup_port_privdata(ap);
-+		if (rc)
-+			return rc;
- 
- 		/* disabled/not-implemented port */
- 		if (!(hpriv->port_map & (1 << i)))
-diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
-index 71262e0..c1a4b6a 100644
---- a/drivers/ata/ahci.h
-+++ b/drivers/ata/ahci.h
-@@ -313,6 +313,12 @@ struct ahci_port_priv {
- 	/* enclosure management info per PM slot */
- 	struct ahci_em_priv	em_priv[EM_MAX_SLOTS];
- 	char			*irq_desc;	/* desc in /proc/interrupts */
-+	bool			init_alpe;	/* alpe enabled by default */
-+	bool			init_asp;	/* asp enabled by default */
-+	bool			init_devslp;	/* devslp enabled by default */
-+	u32			init_dito;	/* initial dito configuration */
-+	u32			init_deto;	/* initial deto configuration */
-+	u32			init_mdat;	/* initial mdat configuration */
- };
- 
- struct ahci_host_priv {
-@@ -371,6 +377,7 @@ extern struct ata_port_operations ahci_platform_ops;
- extern struct ata_port_operations ahci_pmp_retry_srst_ops;
- 
- unsigned int ahci_dev_classify(struct ata_port *ap);
-+int ahci_setup_port_privdata(struct ata_port *ap);
- void ahci_fill_cmd_slot(struct ahci_port_priv *pp, unsigned int tag,
- 			u32 opts);
- void ahci_save_initial_config(struct device *dev,
-diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
-index 61a9c07..f0c7120 100644
---- a/drivers/ata/libahci.c
-+++ b/drivers/ata/libahci.c
-@@ -2212,19 +2212,53 @@ static int ahci_port_suspend(struct ata_port *ap, pm_message_t mesg)
- }
- #endif
- 
-+/*
-+ * Allocate port privdata and read back initial power management configuration
-+ */
-+int ahci_setup_port_privdata(struct ata_port *ap)
-+{
-+	struct ahci_port_priv *pp;
-+	u32 cmd, devslp;
-+	void __iomem *port_mmio = ahci_port_base(ap);
-+
-+	pp = kzalloc(sizeof(*pp), GFP_KERNEL);
-+	if (!pp)
-+		return -ENOMEM;
-+
-+	ap->private_data = pp;
-+
-+	cmd = readl(port_mmio + PORT_CMD);
-+
-+	if (cmd & PORT_CMD_ALPE)
-+		pp->init_alpe = true;
-+
-+	if (cmd & PORT_CMD_ASP)
-+		pp->init_asp = true;
-+
-+	devslp = readl(port_mmio + PORT_DEVSLP);
-+
-+	/* devslp unsupported or disabled */
-+	if (!(devslp & PORT_DEVSLP_DSP) || !(devslp & PORT_DEVSLP_ADSE))
-+		return 0;
-+
-+	pp->init_devslp = true;
-+	pp->init_dito = (devslp >> PORT_DEVSLP_DITO_OFFSET) & 0x3ff;
-+	pp->init_deto = (devslp >> PORT_DEVSLP_DETO_OFFSET) & 0xff;
-+	pp->init_mdat = (devslp >> PORT_DEVSLP_MDAT_OFFSET) & 0x1f;
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL_GPL(ahci_setup_port_privdata);
-+
- static int ahci_port_start(struct ata_port *ap)
- {
- 	struct ahci_host_priv *hpriv = ap->host->private_data;
-+	struct ahci_port_priv *pp = ap->private_data;
- 	struct device *dev = ap->host->dev;
--	struct ahci_port_priv *pp;
- 	void *mem;
- 	dma_addr_t mem_dma;
- 	size_t dma_sz, rx_fis_sz;
- 
--	pp = devm_kzalloc(dev, sizeof(*pp), GFP_KERNEL);
--	if (!pp)
--		return -ENOMEM;
--
- 	if (ap->host->n_ports > 1) {
- 		pp->irq_desc = devm_kzalloc(dev, 8, GFP_KERNEL);
- 		if (!pp->irq_desc) {
-@@ -2303,8 +2337,6 @@ static int ahci_port_start(struct ata_port *ap)
- 		ap->lock = &pp->lock;
- 	}
- 
--	ap->private_data = pp;
--
- 	/* engage engines, captain */
- 	return ahci_port_resume(ap);
- }
-diff --git a/drivers/ata/libahci_platform.c b/drivers/ata/libahci_platform.c
-index d89305d..39946d4 100644
---- a/drivers/ata/libahci_platform.c
-+++ b/drivers/ata/libahci_platform.c
-@@ -563,6 +563,10 @@ int ahci_platform_init_host(struct platform_device *pdev,
- 		if (ap->flags & ATA_FLAG_EM)
- 			ap->em_message_type = hpriv->em_msg_type;
- 
-+		rc = ahci_setup_port_privdata(ap);
-+		if (rc)
-+			return rc;
-+
- 		/* disabled/not-implemented port */
- 		if (!(hpriv->port_map & (1 << i)))
- 			ap->ops = &ata_dummy_port_ops;
-diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
-index f6cb1f1..c037f33 100644
---- a/drivers/ata/libata-core.c
-+++ b/drivers/ata/libata-core.c
-@@ -2024,6 +2024,9 @@ retry:
- 		}
- 	}
- 
-+	if (id[79] & SATA_DIPM)
-+		dev->init_dipm = true;
-+
- 	*p_class = class;
- 
- 	return 0;
-@@ -5583,11 +5586,11 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp)
- }
- 
- /**
-- *	sata_link_init_spd - Initialize link->sata_spd_limit
-- *	@link: Link to configure sata_spd_limit for
-+ *	sata_link_init_config - Initialize link->sata_spd_limit and init_lpm
-+ *	@link: Link to configure sata_spd_limit and init_lpm for
-  *
-- *	Initialize @link->[hw_]sata_spd_limit to the currently
-- *	configured value.
-+ *	Initialize @link->[hw_]sata_spd_limit and @link->init_lpm to the
-+ *	currently configured value.
-  *
-  *	LOCKING:
-  *	Kernel thread context (may sleep).
-@@ -5595,7 +5598,7 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp)
-  *	RETURNS:
-  *	0 on success, -errno on failure.
-  */
--int sata_link_init_spd(struct ata_link *link)
-+int sata_link_init_config(struct ata_link *link)
- {
- 	u8 spd;
- 	int rc;
-@@ -5612,6 +5615,8 @@ int sata_link_init_spd(struct ata_link *link)
- 
- 	link->sata_spd_limit = link->hw_sata_spd_limit;
- 
-+	link->init_lpm = (link->saved_scontrol >> 8) & 0x7;
-+
- 	return 0;
- }
- 
-@@ -6161,9 +6166,9 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
- 			ap->cbl = ATA_CBL_SATA;
- 
- 		/* init sata_spd_limit to the current value */
--		sata_link_init_spd(&ap->link);
-+		sata_link_init_config(&ap->link);
- 		if (ap->slave_link)
--			sata_link_init_spd(ap->slave_link);
-+			sata_link_init_config(ap->slave_link);
- 
- 		/* print per-port info to dmesg */
- 		xfer_mask = ata_pack_xfermask(ap->pio_mask, ap->mwdma_mask,
-diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
-index 7ccc084..b9f7ce8 100644
---- a/drivers/ata/libata-pmp.c
-+++ b/drivers/ata/libata-pmp.c
-@@ -531,7 +531,7 @@ int sata_pmp_attach(struct ata_device *dev)
- 		ap->ops->pmp_attach(ap);
- 
- 	ata_for_each_link(tlink, ap, EDGE)
--		sata_link_init_spd(tlink);
-+		sata_link_init_config(tlink);
- 
- 	return 0;
- 
-diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h
-index a998a17..35016d6 100644
---- a/drivers/ata/libata.h
-+++ b/drivers/ata/libata.h
-@@ -99,7 +99,7 @@ extern bool ata_phys_link_online(struct ata_link *link);
- extern bool ata_phys_link_offline(struct ata_link *link);
- extern void ata_dev_init(struct ata_device *dev);
- extern void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp);
--extern int sata_link_init_spd(struct ata_link *link);
-+extern int sata_link_init_config(struct ata_link *link);
- extern int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg);
- extern int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg);
- extern struct ata_port *ata_port_alloc(struct ata_host *host);
-diff --git a/drivers/ata/sata_highbank.c b/drivers/ata/sata_highbank.c
-index 24e311f..a2adf3f 100644
---- a/drivers/ata/sata_highbank.c
-+++ b/drivers/ata/sata_highbank.c
-@@ -556,6 +556,10 @@ static int ahci_highbank_probe(struct platform_device *pdev)
- 		if (ap->flags & ATA_FLAG_EM)
- 			ap->em_message_type = hpriv->em_msg_type;
- 
-+		rc = ahci_setup_port_privdata(ap);
-+		if (rc)
-+			goto err0;
-+
- 		/* disabled/not-implemented port */
- 		if (!(hpriv->port_map & (1 << i)))
- 			ap->ops = &ata_dummy_port_ops;
-diff --git a/include/linux/libata.h b/include/linux/libata.h
-index 8dad4a3..31c149b 100644
---- a/include/linux/libata.h
-+++ b/include/linux/libata.h
-@@ -719,6 +719,8 @@ struct ata_device {
- 	int			spdn_cnt;
- 	/* ering is CLEAR_END, read comment above CLEAR_END */
- 	struct ata_ering	ering;
-+	/* Initial DIPM configuration */
-+	bool			init_dipm;
- };
- 
- /* Fields between ATA_DEVICE_CLEAR_BEGIN and ATA_DEVICE_CLEAR_END are
-@@ -800,6 +800,7 @@ struct ata_link {
- 	struct ata_device	device[ATA_MAX_DEVICES];
- 
- 	unsigned long		last_lpm_change; /* when last LPM change happened */
-+	u8			init_lpm; /* initial lpm configuration */
- };
- #define ATA_LINK_CLEAR_BEGIN		offsetof(struct ata_link, active_tag)
- #define ATA_LINK_CLEAR_END		offsetof(struct ata_link, device[0])
--- 
-2.3.5
-
---
-To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
-the body of a message to majordomo at vger.kernel.org
-More majordomo info at  http://vger.kernel.org/majordomo-info.html
-Please read the FAQ at  http://www.tux.org/lkml/
-From:	Matthew Garrett <mjg59 at coreos.com>
-Date:	Sat, 18 Apr 2015 08:26:35 -0700
-Subject: [PATCH 2/3] libata: Add firmware_default LPM policy
-
-System vendors may configure SATA link power management appropriately for
-their systems in firmware, based on their knowledge of the hardware
-installed. Add an additional LPM policy designed to inherit the
-configuration provided by the firmware.
-
-Signed-off-by: Matthew Garrett <mjg59 at coreos.com>
----
- .../scsi/link_power_management_policy.txt          |  5 +-
- drivers/ata/libahci.c                              | 62 +++++++++++++++-------
- drivers/ata/libata-core.c                          |  7 ++-
- drivers/ata/libata-eh.c                            | 15 +++---
- drivers/ata/libata-scsi.c                          |  1 +
- include/linux/libata.h                             |  1 +
- 6 files changed, 63 insertions(+), 28 deletions(-)
-
-diff --git a/Documentation/scsi/link_power_management_policy.txt b/Documentation/scsi/link_power_management_policy.txt
-index d18993d..0285601 100644
---- a/Documentation/scsi/link_power_management_policy.txt
-+++ b/Documentation/scsi/link_power_management_policy.txt
-@@ -1,8 +1,11 @@
- This parameter allows the user to set the link (interface) power management.
--There are 3 possible options:
-+There are 4 possible options:
- 
- Value			Effect
- ----------------------------------------------------------------------------
-+firmware_defaults	Inherit configuration from the state programmed by
-+			the firmware during system init.
-+
- min_power		Tell the controller to try to make the link use the
- 			least possible power when possible.  This may
- 			sacrifice some performance due to increased latency
-diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
-index f0c7120..fabcff4 100644
---- a/drivers/ata/libahci.c
-+++ b/drivers/ata/libahci.c
-@@ -684,6 +684,7 @@ static int ahci_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- {
- 	struct ata_port *ap = link->ap;
- 	struct ahci_host_priv *hpriv = ap->host->private_data;
-+	struct ahci_port_priv *ppriv = ap->private_data;
- 	struct ahci_port_priv *pp = ap->private_data;
- 	void __iomem *port_mmio = ahci_port_base(ap);
- 
-@@ -701,10 +702,10 @@ static int ahci_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 
- 	if (hpriv->cap & HOST_CAP_ALPM) {
- 		u32 cmd = readl(port_mmio + PORT_CMD);
-+		if (!(hints & ATA_LPM_WAKE_ONLY))
-+			cmd &= ~(PORT_CMD_ASP | PORT_CMD_ALPE);
- 
- 		if (policy == ATA_LPM_MAX_POWER || !(hints & ATA_LPM_HIPM)) {
--			if (!(hints & ATA_LPM_WAKE_ONLY))
--				cmd &= ~(PORT_CMD_ASP | PORT_CMD_ALPE);
- 			cmd |= PORT_CMD_ICC_ACTIVE;
- 
- 			writel(cmd, port_mmio + PORT_CMD);
-@@ -711,6 +712,13 @@ static int ahci_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 
- 			if (hints & ATA_LPM_WAKE_ONLY)
- 				return 0;
-+		} else if (policy == ATA_LPM_FIRMWARE_DEFAULTS) {
-+			if (ppriv->init_alpe)
-+				cmd |= PORT_CMD_ALPE;
-+			if (ppriv->init_asp)
-+				cmd |= PORT_CMD_ASP;
-+
-+			writel(cmd, port_mmio + PORT_CMD);
- 		} else {
- 			cmd |= PORT_CMD_ALPE;
- 			if (policy == ATA_LPM_MIN_POWER)
-@@ -725,10 +733,17 @@ static int ahci_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 	if ((hpriv->cap2 & HOST_CAP2_SDS) &&
- 	    (hpriv->cap2 & HOST_CAP2_SADM) &&
- 	    (link->device->flags & ATA_DFLAG_DEVSLP)) {
--		if (policy == ATA_LPM_MIN_POWER)
-+		switch (policy) {
-+		case ATA_LPM_MIN_POWER:
- 			ahci_set_aggressive_devslp(ap, true);
--		else
-+			break;
-+		case ATA_LPM_FIRMWARE_DEFAULTS:
-+			ahci_set_aggressive_devslp(ap, ppriv->init_devslp);
-+			break;
-+		default:
- 			ahci_set_aggressive_devslp(ap, false);
-+			break;
-+		}
- 	}
- 
- 	if (policy == ATA_LPM_MAX_POWER) {
-@@ -1995,6 +2010,7 @@ static void ahci_post_internal_cmd(struct ata_queued_cmd *qc)
- static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
- {
- 	struct ahci_host_priv *hpriv = ap->host->private_data;
-+	struct ahci_port_priv *ppriv = ap->private_data;
- 	void __iomem *port_mmio = ahci_port_base(ap);
- 	struct ata_device *dev = ap->link.device;
- 	u32 devslp, dm, dito, mdat, deto;
-@@ -2030,26 +2046,32 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
- 	if (rc)
- 		return;
- 
--	dm = (devslp & PORT_DEVSLP_DM_MASK) >> PORT_DEVSLP_DM_OFFSET;
--	dito = devslp_idle_timeout / (dm + 1);
--	if (dito > 0x3ff)
--		dito = 0x3ff;
-+	if (ppriv->init_devslp) {
-+		dito = ppriv->init_dito;
-+		deto = ppriv->init_deto;
-+		mdat = ppriv->init_mdat;
-+	} else {
-+		dm = (devslp & PORT_DEVSLP_DM_MASK) >> PORT_DEVSLP_DM_OFFSET;
-+		dito = devslp_idle_timeout / (dm + 1);
-+		if (dito > 0x3ff)
-+			dito = 0x3ff;
- 
--	/* Use the nominal value 10 ms if the read MDAT is zero,
--	 * the nominal value of DETO is 20 ms.
--	 */
--	if (dev->devslp_timing[ATA_LOG_DEVSLP_VALID] &
--	    ATA_LOG_DEVSLP_VALID_MASK) {
--		mdat = dev->devslp_timing[ATA_LOG_DEVSLP_MDAT] &
--		       ATA_LOG_DEVSLP_MDAT_MASK;
--		if (!mdat)
-+		/* Use the nominal value 10 ms if the read MDAT is zero,
-+		 * the nominal value of DETO is 20 ms.
-+		 */
-+		if (dev->devslp_timing[ATA_LOG_DEVSLP_VALID] &
-+		    ATA_LOG_DEVSLP_VALID_MASK) {
-+			mdat = dev->devslp_timing[ATA_LOG_DEVSLP_MDAT] &
-+				ATA_LOG_DEVSLP_MDAT_MASK;
-+			if (!mdat)
-+				mdat = 10;
-+			deto = dev->devslp_timing[ATA_LOG_DEVSLP_DETO];
-+			if (!deto)
-+				deto = 20;
-+		} else {
- 			mdat = 10;
--		deto = dev->devslp_timing[ATA_LOG_DEVSLP_DETO];
--		if (!deto)
- 			deto = 20;
--	} else {
--		mdat = 10;
--		deto = 20;
-+		}
- 	}
- 
- 	devslp |= ((dito << PORT_DEVSLP_DITO_OFFSET) |
-diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
-index c037f33..0a78f01 100644
---- a/drivers/ata/libata-core.c
-+++ b/drivers/ata/libata-core.c
-@@ -2024,7 +2024,7 @@ retry:
- 		}
- 	}
- 
--	if (id[79] & SATA_DIPM)
-+	if (id[79] & (1 << SATA_DIPM))
- 		dev->init_dipm = true;
- 
- 	*p_class = class;
-@@ -3672,6 +3672,11 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 		return rc;
- 
- 	switch (policy) {
-+	case ATA_LPM_FIRMWARE_DEFAULTS:
-+		/* use the values we read at probe */
-+		scontrol &= ~(0x7 << 8);
-+		scontrol |= (link->init_lpm << 8);
-+		break;
- 	case ATA_LPM_MAX_POWER:
- 		/* disable all LPM transitions */
- 		scontrol |= (0x7 << 8);
-diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
-index 07f41be..c36fa56 100644
---- a/drivers/ata/libata-eh.c
-+++ b/drivers/ata/libata-eh.c
-@@ -3519,9 +3519,9 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 		return 0;
- 
- 	/*
--	 * DIPM is enabled only for MIN_POWER as some devices
--	 * misbehave when the host NACKs transition to SLUMBER.  Order
--	 * device and link configurations such that the host always
-+	 * DIPM is enabled only for MIN_POWER and FIRMWARE_DEFAULT as some
-+	 * devices misbehave when the host NACKs transition to SLUMBER.
-+	 * Order device and link configurations such that the host always
- 	 * allows DIPM requests.
- 	 */
- 	ata_for_each_dev(dev, link, ENABLED) {
-@@ -3581,10 +3581,13 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_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 or
-+	 * FIRMWARE_DEFAULT when enabled by firmware
-+	 */
- 	ata_for_each_dev(dev, link, ENABLED) {
--		if (policy == ATA_LPM_MIN_POWER && !no_dipm &&
--		    ata_id_has_dipm(dev->id)) {
-+		if ((policy == ATA_LPM_MIN_POWER && !no_dipm &&
-+		     ata_id_has_dipm(dev->id)) ||
-+		    (policy == ATA_LPM_FIRMWARE_DEFAULTS && dev->init_dipm)) {
- 			err_mask = ata_dev_set_feature(dev,
- 					SETFEATURES_SATA_ENABLE, SATA_DIPM);
- 			if (err_mask && err_mask != AC_ERR_DEV) {
-diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
-index 3131adc..f1ea052 100644
---- a/drivers/ata/libata-scsi.c
-+++ b/drivers/ata/libata-scsi.c
-@@ -107,6 +107,7 @@ static const u8 def_control_mpage[CONTROL_MPAGE_LEN] = {
- static const char *ata_lpm_policy_names[] = {
- 	[ATA_LPM_UNKNOWN]	= "max_performance",
- 	[ATA_LPM_MAX_POWER]	= "max_performance",
-+	[ATA_LPM_FIRMWARE_DEFAULTS] = "firmware_defaults",
- 	[ATA_LPM_MED_POWER]	= "medium_power",
- 	[ATA_LPM_MIN_POWER]	= "min_power",
- };
-diff --git a/include/linux/libata.h b/include/linux/libata.h
-index 31c149b..57b465d 100644
---- a/include/linux/libata.h
-+++ b/include/linux/libata.h
-@@ -507,6 +507,7 @@ enum ata_completion_errors {
- enum ata_lpm_policy {
- 	ATA_LPM_UNKNOWN,
- 	ATA_LPM_MAX_POWER,
-+	ATA_LPM_FIRMWARE_DEFAULTS,
- 	ATA_LPM_MED_POWER,
- 	ATA_LPM_MIN_POWER,
- };
--- 
-2.3.5
-
---
-To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
-the body of a message to majordomo at vger.kernel.org
-More majordomo info at  http://vger.kernel.org/majordomo-info.html
-Please read the FAQ at  http://www.tux.org/lkml/
-From:	Matthew Garrett <mjg59 at coreos.com>
-Date:	Sat, 18 Apr 2015 08:26:36 -0700
-Subject: [PATCH 3/3] libata: Change medium_power LPM policy to match Intel recommendations
-
-Intel publish a document on designing energy efficient SATA devices at
-http://www.intel.com/content/dam/doc/reference-guide/sata-devices-implementation-recommendations.pdf
-which recommends that ALPE be set, ASPE be cleared and that DIPM be enabled
-on the device. Right now we have no policy that matches that - medium_power
-does not enable DIPM and min_power sets ASPE. Change medium_power to
-implement these recommendations, with the addition of devslp state being
-inherited from the initial configuration. With luck this will provide
-reasonable power savings without causing the device breakages we
-occasionally see with the min_power policy.
-
-Signed-off-by: Matthew Garrett <mjg59 at coreos.com>
----
- drivers/ata/libahci.c     |  1 +
- drivers/ata/libata-core.c |  4 ----
- drivers/ata/libata-eh.c   | 10 ++++------
- 3 files changed, 5 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
-index fabcff4..8efacb9 100644
---- a/drivers/ata/libahci.c
-+++ b/drivers/ata/libahci.c
-@@ -738,6 +738,7 @@ static int ahci_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 			ahci_set_aggressive_devslp(ap, true);
- 			break;
- 		case ATA_LPM_FIRMWARE_DEFAULTS:
-+		case ATA_LPM_MED_POWER:
- 			ahci_set_aggressive_devslp(ap, ppriv->init_devslp);
- 			break;
- 		default:
-diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
-index 0a78f01..99a7b8f 100644
---- a/drivers/ata/libata-core.c
-+++ b/drivers/ata/libata-core.c
-@@ -3687,10 +3687,6 @@ int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 		}
- 		break;
- 	case ATA_LPM_MED_POWER:
--		/* allow LPM to PARTIAL */
--		scontrol &= ~(0x1 << 8);
--		scontrol |= (0x6 << 8);
--		break;
- 	case ATA_LPM_MIN_POWER:
- 		if (ata_link_nr_enabled(link) > 0)
- 			/* no restrictions on LPM transitions */
-diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
-index c36fa56..25d5f37 100644
---- a/drivers/ata/libata-eh.c
-+++ b/drivers/ata/libata-eh.c
-@@ -3519,8 +3519,6 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 		return 0;
- 
- 	/*
--	 * DIPM is enabled only for MIN_POWER and FIRMWARE_DEFAULT as some
--	 * devices misbehave when the host NACKs transition to SLUMBER.
- 	 * Order device and link configurations such that the host always
- 	 * allows DIPM requests.
- 	 */
-@@ -3540,7 +3538,7 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 			hints &= ~ATA_LPM_HIPM;
- 
- 		/* disable DIPM before changing link config */
--		if (policy != ATA_LPM_MIN_POWER && dipm) {
-+		if (policy < ATA_LPM_MED_POWER && dipm) {
- 			err_mask = ata_dev_set_feature(dev,
- 					SETFEATURES_SATA_DISABLE, SATA_DIPM);
- 			if (err_mask && err_mask != AC_ERR_DEV) {
-@@ -3581,11 +3579,11 @@ static int ata_eh_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,
- 	if (ap && ap->slave_link)
- 		ap->slave_link->lpm_policy = policy;
- 
--	/* host config updated, enable DIPM if transitioning to MIN_POWER or
--	 * FIRMWARE_DEFAULT when enabled by firmware
-+	/* host config updated, enable DIPM if transitioning to MED_POWER,
-+	 * MIN_POWER or FIRMWARE_DEFAULT when enabled by firmware
- 	 */
- 	ata_for_each_dev(dev, link, ENABLED) {
--		if ((policy == ATA_LPM_MIN_POWER && !no_dipm &&
-+		if ((policy >= ATA_LPM_MED_POWER && !no_dipm &&
- 		     ata_id_has_dipm(dev->id)) ||
- 		    (policy == ATA_LPM_FIRMWARE_DEFAULTS && dev->init_dipm)) {
- 			err_mask = ata_dev_set_feature(dev,
--- 
-2.3.5
-
---
-To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
-the body of a message to majordomo at vger.kernel.org
-More majordomo info at  http://vger.kernel.org/majordomo-info.html
-Please read the FAQ at  http://www.tux.org/lkml/
diff --git a/kernel-small_fixes.patch b/kernel-small_fixes.patch
index 079d2f43..319191ce 100644
--- a/kernel-small_fixes.patch
+++ b/kernel-small_fixes.patch
@@ -61,124 +61,3 @@ index 098ce9b179ee..fcf8d0aa66ec 100644
 -- 
 2.11.0
 
-From d557d1b58b3546bab2c5bc2d624c5709840e6b10 Mon Sep 17 00:00:00 2001
-From: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
-Date: Thu, 4 May 2017 15:51:03 -0700
-Subject: refcount: change EXPORT_SYMBOL markings
-
-Now that kref is using the refcount apis, the _GPL markings are getting
-exported to places that it previously wasn't.  Now kref.h is GPLv2
-licensed, so any non-GPL code using it better be talking to some
-lawyers, but changing api markings isn't considered "nice", so let's fix
-this up.
-
-Signed-off-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
-Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
----
- lib/refcount.c | 22 +++++++++++-----------
- 1 file changed, 11 insertions(+), 11 deletions(-)
-
-diff --git a/lib/refcount.c b/lib/refcount.c
-index f42124c..9f90678 100644
---- a/lib/refcount.c
-+++ b/lib/refcount.c
-@@ -76,7 +76,7 @@ bool refcount_add_not_zero(unsigned int i, refcount_t *r)
- 
- 	return true;
- }
--EXPORT_SYMBOL_GPL(refcount_add_not_zero);
-+EXPORT_SYMBOL(refcount_add_not_zero);
- 
- /**
-  * refcount_add - add a value to a refcount
-@@ -98,7 +98,7 @@ void refcount_add(unsigned int i, refcount_t *r)
- {
- 	WARN_ONCE(!refcount_add_not_zero(i, r), "refcount_t: addition on 0; use-after-free.\n");
- }
--EXPORT_SYMBOL_GPL(refcount_add);
-+EXPORT_SYMBOL(refcount_add);
- 
- /**
-  * refcount_inc_not_zero - increment a refcount unless it is 0
-@@ -131,7 +131,7 @@ bool refcount_inc_not_zero(refcount_t *r)
- 
- 	return true;
- }
--EXPORT_SYMBOL_GPL(refcount_inc_not_zero);
-+EXPORT_SYMBOL(refcount_inc_not_zero);
- 
- /**
-  * refcount_inc - increment a refcount
-@@ -149,7 +149,7 @@ void refcount_inc(refcount_t *r)
- {
- 	WARN_ONCE(!refcount_inc_not_zero(r), "refcount_t: increment on 0; use-after-free.\n");
- }
--EXPORT_SYMBOL_GPL(refcount_inc);
-+EXPORT_SYMBOL(refcount_inc);
- 
- /**
-  * refcount_sub_and_test - subtract from a refcount and test if it is 0
-@@ -189,7 +189,7 @@ bool refcount_sub_and_test(unsigned int i, refcount_t *r)
- 
- 	return !new;
- }
--EXPORT_SYMBOL_GPL(refcount_sub_and_test);
-+EXPORT_SYMBOL(refcount_sub_and_test);
- 
- /**
-  * refcount_dec_and_test - decrement a refcount and test if it is 0
-@@ -208,7 +208,7 @@ bool refcount_dec_and_test(refcount_t *r)
- {
- 	return refcount_sub_and_test(1, r);
- }
--EXPORT_SYMBOL_GPL(refcount_dec_and_test);
-+EXPORT_SYMBOL(refcount_dec_and_test);
- 
- /**
-  * refcount_dec - decrement a refcount
-@@ -224,7 +224,7 @@ void refcount_dec(refcount_t *r)
- {
- 	WARN_ONCE(refcount_dec_and_test(r), "refcount_t: decrement hit 0; leaking memory.\n");
- }
--EXPORT_SYMBOL_GPL(refcount_dec);
-+EXPORT_SYMBOL(refcount_dec);
- 
- /**
-  * refcount_dec_if_one - decrement a refcount if it is 1
-@@ -248,7 +248,7 @@ bool refcount_dec_if_one(refcount_t *r)
- 
- 	return atomic_try_cmpxchg_release(&r->refs, &val, 0);
- }
--EXPORT_SYMBOL_GPL(refcount_dec_if_one);
-+EXPORT_SYMBOL(refcount_dec_if_one);
- 
- /**
-  * refcount_dec_not_one - decrement a refcount if it is not 1
-@@ -282,7 +282,7 @@ bool refcount_dec_not_one(refcount_t *r)
- 
- 	return true;
- }
--EXPORT_SYMBOL_GPL(refcount_dec_not_one);
-+EXPORT_SYMBOL(refcount_dec_not_one);
- 
- /**
-  * refcount_dec_and_mutex_lock - return holding mutex if able to decrement
-@@ -313,7 +313,7 @@ bool refcount_dec_and_mutex_lock(refcount_t *r, struct mutex *lock)
- 
- 	return true;
- }
--EXPORT_SYMBOL_GPL(refcount_dec_and_mutex_lock);
-+EXPORT_SYMBOL(refcount_dec_and_mutex_lock);
- 
- /**
-  * refcount_dec_and_lock - return holding spinlock if able to decrement
-@@ -344,5 +344,5 @@ bool refcount_dec_and_lock(refcount_t *r, spinlock_t *lock)
- 
- 	return true;
- }
--EXPORT_SYMBOL_GPL(refcount_dec_and_lock);
-+EXPORT_SYMBOL(refcount_dec_and_lock);
- 
--- 
-cgit v1.1
-
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/kernel.git/commitdiff/473ceb84e2e3c688ebd55ea92521a4fe126601e0



More information about the pld-cvs-commit mailing list