brintos

brintos / linux-shallow public Read only

0
0
Text · 25.8 KiB · d5d1893 Raw
1105 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * libata-pmp.c - libata port multiplier support4 *5 * Copyright (c) 2007  SUSE Linux Products GmbH6 * Copyright (c) 2007  Tejun Heo <teheo@suse.de>7 */8 9#include <linux/kernel.h>10#include <linux/export.h>11#include <linux/libata.h>12#include <linux/slab.h>13#include "libata.h"14#include "libata-transport.h"15 16const struct ata_port_operations sata_pmp_port_ops = {17	.inherits		= &sata_port_ops,18	.pmp_prereset		= ata_std_prereset,19	.pmp_hardreset		= sata_std_hardreset,20	.pmp_postreset		= ata_std_postreset,21	.error_handler		= sata_pmp_error_handler,22};23 24/**25 *	sata_pmp_read - read PMP register26 *	@link: link to read PMP register for27 *	@reg: register to read28 *	@r_val: resulting value29 *30 *	Read PMP register.31 *32 *	LOCKING:33 *	Kernel thread context (may sleep).34 *35 *	RETURNS:36 *	0 on success, AC_ERR_* mask on failure.37 */38static unsigned int sata_pmp_read(struct ata_link *link, int reg, u32 *r_val)39{40	struct ata_port *ap = link->ap;41	struct ata_device *pmp_dev = ap->link.device;42	struct ata_taskfile tf;43	unsigned int err_mask;44 45	ata_tf_init(pmp_dev, &tf);46	tf.command = ATA_CMD_PMP_READ;47	tf.protocol = ATA_PROT_NODATA;48	tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48;49	tf.feature = reg;50	tf.device = link->pmp;51 52	err_mask = ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,53				     SATA_PMP_RW_TIMEOUT);54	if (err_mask)55		return err_mask;56 57	*r_val = tf.nsect | tf.lbal << 8 | tf.lbam << 16 | tf.lbah << 24;58	return 0;59}60 61/**62 *	sata_pmp_write - write PMP register63 *	@link: link to write PMP register for64 *	@reg: register to write65 *	@val: value to write66 *67 *	Write PMP register.68 *69 *	LOCKING:70 *	Kernel thread context (may sleep).71 *72 *	RETURNS:73 *	0 on success, AC_ERR_* mask on failure.74 */75static unsigned int sata_pmp_write(struct ata_link *link, int reg, u32 val)76{77	struct ata_port *ap = link->ap;78	struct ata_device *pmp_dev = ap->link.device;79	struct ata_taskfile tf;80 81	ata_tf_init(pmp_dev, &tf);82	tf.command = ATA_CMD_PMP_WRITE;83	tf.protocol = ATA_PROT_NODATA;84	tf.flags |= ATA_TFLAG_ISADDR | ATA_TFLAG_DEVICE | ATA_TFLAG_LBA48;85	tf.feature = reg;86	tf.device = link->pmp;87	tf.nsect = val & 0xff;88	tf.lbal = (val >> 8) & 0xff;89	tf.lbam = (val >> 16) & 0xff;90	tf.lbah = (val >> 24) & 0xff;91 92	return ata_exec_internal(pmp_dev, &tf, NULL, DMA_NONE, NULL, 0,93				 SATA_PMP_RW_TIMEOUT);94}95 96/**97 *	sata_pmp_qc_defer_cmd_switch - qc_defer for command switching PMP98 *	@qc: ATA command in question99 *100 *	A host which has command switching PMP support cannot issue101 *	commands to multiple links simultaneously.102 *103 *	LOCKING:104 *	spin_lock_irqsave(host lock)105 *106 *	RETURNS:107 *	ATA_DEFER_* if deferring is needed, 0 otherwise.108 */109int sata_pmp_qc_defer_cmd_switch(struct ata_queued_cmd *qc)110{111	struct ata_link *link = qc->dev->link;112	struct ata_port *ap = link->ap;113 114	if (ap->excl_link == NULL || ap->excl_link == link) {115		if (ap->nr_active_links == 0 || ata_link_active(link)) {116			qc->flags |= ATA_QCFLAG_CLEAR_EXCL;117			return ata_std_qc_defer(qc);118		}119 120		ap->excl_link = link;121	}122 123	return ATA_DEFER_PORT;124}125 126/**127 *	sata_pmp_scr_read - read PSCR128 *	@link: ATA link to read PSCR for129 *	@reg: PSCR to read130 *	@r_val: resulting value131 *132 *	Read PSCR @reg into @r_val for @link, to be called from133 *	ata_scr_read().134 *135 *	LOCKING:136 *	Kernel thread context (may sleep).137 *138 *	RETURNS:139 *	0 on success, -errno on failure.140 */141int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *r_val)142{143	unsigned int err_mask;144 145	if (reg > SATA_PMP_PSCR_CONTROL)146		return -EINVAL;147 148	err_mask = sata_pmp_read(link, reg, r_val);149	if (err_mask) {150		ata_link_warn(link, "failed to read SCR %d (Emask=0x%x)\n",151			      reg, err_mask);152		return -EIO;153	}154	return 0;155}156 157/**158 *	sata_pmp_scr_write - write PSCR159 *	@link: ATA link to write PSCR for160 *	@reg: PSCR to write161 *	@val: value to be written162 *163 *	Write @val to PSCR @reg for @link, to be called from164 *	ata_scr_write() and ata_scr_write_flush().165 *166 *	LOCKING:167 *	Kernel thread context (may sleep).168 *169 *	RETURNS:170 *	0 on success, -errno on failure.171 */172int sata_pmp_scr_write(struct ata_link *link, int reg, u32 val)173{174	unsigned int err_mask;175 176	if (reg > SATA_PMP_PSCR_CONTROL)177		return -EINVAL;178 179	err_mask = sata_pmp_write(link, reg, val);180	if (err_mask) {181		ata_link_warn(link, "failed to write SCR %d (Emask=0x%x)\n",182			      reg, err_mask);183		return -EIO;184	}185	return 0;186}187 188/**189 *	sata_pmp_set_lpm - configure LPM for a PMP link190 *	@link: PMP link to configure LPM for191 *	@policy: target LPM policy192 *	@hints: LPM hints193 *194 *	Configure LPM for @link.  This function will contain any PMP195 *	specific workarounds if necessary.196 *197 *	LOCKING:198 *	EH context.199 *200 *	RETURNS:201 *	0 on success, -errno on failure.202 */203int sata_pmp_set_lpm(struct ata_link *link, enum ata_lpm_policy policy,204		     unsigned hints)205{206	return sata_link_scr_lpm(link, policy, true);207}208 209/**210 *	sata_pmp_read_gscr - read GSCR block of SATA PMP211 *	@dev: PMP device212 *	@gscr: buffer to read GSCR block into213 *214 *	Read selected PMP GSCRs from the PMP at @dev.  This will serve215 *	as configuration and identification info for the PMP.216 *217 *	LOCKING:218 *	Kernel thread context (may sleep).219 *220 *	RETURNS:221 *	0 on success, -errno on failure.222 */223static int sata_pmp_read_gscr(struct ata_device *dev, u32 *gscr)224{225	static const int gscr_to_read[] = { 0, 1, 2, 32, 33, 64, 96 };226	int i;227 228	for (i = 0; i < ARRAY_SIZE(gscr_to_read); i++) {229		int reg = gscr_to_read[i];230		unsigned int err_mask;231 232		err_mask = sata_pmp_read(dev->link, reg, &gscr[reg]);233		if (err_mask) {234			ata_dev_err(dev, "failed to read PMP GSCR[%d] (Emask=0x%x)\n",235				    reg, err_mask);236			return -EIO;237		}238	}239 240	return 0;241}242 243static const char *sata_pmp_spec_rev_str(const u32 *gscr)244{245	u32 rev = gscr[SATA_PMP_GSCR_REV];246 247	if (rev & (1 << 3))248		return "1.2";249	if (rev & (1 << 2))250		return "1.1";251	if (rev & (1 << 1))252		return "1.0";253	return "<unknown>";254}255 256#define PMP_GSCR_SII_POL 129257 258static int sata_pmp_configure(struct ata_device *dev, int print_info)259{260	struct ata_port *ap = dev->link->ap;261	u32 *gscr = dev->gscr;262	u16 vendor = sata_pmp_gscr_vendor(gscr);263	u16 devid = sata_pmp_gscr_devid(gscr);264	unsigned int err_mask = 0;265	const char *reason;266	int nr_ports, rc;267 268	nr_ports = sata_pmp_gscr_ports(gscr);269 270	if (nr_ports <= 0 || nr_ports > SATA_PMP_MAX_PORTS) {271		rc = -EINVAL;272		reason = "invalid nr_ports";273		goto fail;274	}275 276	if ((ap->flags & ATA_FLAG_AN) &&277	    (gscr[SATA_PMP_GSCR_FEAT] & SATA_PMP_FEAT_NOTIFY))278		dev->flags |= ATA_DFLAG_AN;279 280	/* monitor SERR_PHYRDY_CHG on fan-out ports */281	err_mask = sata_pmp_write(dev->link, SATA_PMP_GSCR_ERROR_EN,282				  SERR_PHYRDY_CHG);283	if (err_mask) {284		rc = -EIO;285		reason = "failed to write GSCR_ERROR_EN";286		goto fail;287	}288 289	/* Disable sending Early R_OK.290	 * With "cached read" HDD testing and multiple ports busy on a SATA291	 * host controller, 3x26 PMP will very rarely drop a deferred292	 * R_OK that was intended for the host. Symptom will be all293	 * 5 drives under test will timeout, get reset, and recover.294	 */295	if (vendor == 0x1095 && (devid == 0x3726 || devid == 0x3826)) {296		u32 reg;297 298		err_mask = sata_pmp_read(&ap->link, PMP_GSCR_SII_POL, &reg);299		if (err_mask) {300			rc = -EIO;301			reason = "failed to read Sil3x26 Private Register";302			goto fail;303		}304		reg &= ~0x1;305		err_mask = sata_pmp_write(&ap->link, PMP_GSCR_SII_POL, reg);306		if (err_mask) {307			rc = -EIO;308			reason = "failed to write Sil3x26 Private Register";309			goto fail;310		}311	}312 313	if (print_info) {314		ata_dev_info(dev, "Port Multiplier %s, "315			     "0x%04x:0x%04x r%d, %d ports, feat 0x%x/0x%x\n",316			     sata_pmp_spec_rev_str(gscr), vendor, devid,317			     sata_pmp_gscr_rev(gscr),318			     nr_ports, gscr[SATA_PMP_GSCR_FEAT_EN],319			     gscr[SATA_PMP_GSCR_FEAT]);320 321		if (!(dev->flags & ATA_DFLAG_AN))322			ata_dev_info(dev,323				"Asynchronous notification not supported, "324				"hotplug won't work on fan-out ports. Use warm-plug instead.\n");325	}326 327	return 0;328 329 fail:330	ata_dev_err(dev,331		    "failed to configure Port Multiplier (%s, Emask=0x%x)\n",332		    reason, err_mask);333	return rc;334}335 336static int sata_pmp_init_links (struct ata_port *ap, int nr_ports)337{338	struct ata_link *pmp_link = ap->pmp_link;339	int i, err;340 341	if (!pmp_link) {342		pmp_link = kcalloc(SATA_PMP_MAX_PORTS, sizeof(pmp_link[0]),343				   GFP_NOIO);344		if (!pmp_link)345			return -ENOMEM;346 347		for (i = 0; i < SATA_PMP_MAX_PORTS; i++)348			ata_link_init(ap, &pmp_link[i], i);349 350		ap->pmp_link = pmp_link;351 352		for (i = 0; i < SATA_PMP_MAX_PORTS; i++) {353			err = ata_tlink_add(&pmp_link[i]);354			if (err) {355				goto err_tlink;356			}357		}358	}359 360	for (i = 0; i < nr_ports; i++) {361		struct ata_link *link = &pmp_link[i];362		struct ata_eh_context *ehc = &link->eh_context;363 364		link->flags = 0;365		ehc->i.probe_mask |= ATA_ALL_DEVICES;366		ehc->i.action |= ATA_EH_RESET;367	}368 369	return 0;370  err_tlink:371	while (--i >= 0)372		ata_tlink_delete(&pmp_link[i]);373	kfree(pmp_link);374	ap->pmp_link = NULL;375	return err;376}377 378static void sata_pmp_quirks(struct ata_port *ap)379{380	u32 *gscr = ap->link.device->gscr;381	u16 vendor = sata_pmp_gscr_vendor(gscr);382	u16 devid = sata_pmp_gscr_devid(gscr);383	struct ata_link *link;384 385	if (vendor == 0x1095 && (devid == 0x3726 || devid == 0x3826)) {386		/* sil3x26 quirks */387		ata_for_each_link(link, ap, EDGE) {388			/* link reports offline after LPM */389			link->flags |= ATA_LFLAG_NO_LPM;390 391			/*392			 * Class code report is unreliable and SRST times393			 * out under certain configurations.394			 */395			if (link->pmp < 5)396				link->flags |= ATA_LFLAG_NO_SRST |397					       ATA_LFLAG_ASSUME_ATA;398 399			/* port 5 is for SEMB device and it doesn't like SRST */400			if (link->pmp == 5)401				link->flags |= ATA_LFLAG_NO_SRST |402					       ATA_LFLAG_ASSUME_SEMB;403		}404	} else if (vendor == 0x1095 && devid == 0x4723) {405		/*406		 * sil4723 quirks407		 *408		 * Link reports offline after LPM.  Class code report is409		 * unreliable.  SIMG PMPs never got SRST reliable and the410		 * config device at port 2 locks up on SRST.411		 */412		ata_for_each_link(link, ap, EDGE)413			link->flags |= ATA_LFLAG_NO_LPM |414				       ATA_LFLAG_NO_SRST |415				       ATA_LFLAG_ASSUME_ATA;416	} else if (vendor == 0x1095 && devid == 0x4726) {417		/* sil4726 quirks */418		ata_for_each_link(link, ap, EDGE) {419			/* link reports offline after LPM */420			link->flags |= ATA_LFLAG_NO_LPM;421 422			/* Class code report is unreliable and SRST423			 * times out under certain configurations.424			 * Config device can be at port 0 or 5 and425			 * locks up on SRST.426			 */427			if (link->pmp <= 5)428				link->flags |= ATA_LFLAG_NO_SRST |429					       ATA_LFLAG_ASSUME_ATA;430 431			/* Port 6 is for SEMB device which doesn't432			 * like SRST either.433			 */434			if (link->pmp == 6)435				link->flags |= ATA_LFLAG_NO_SRST |436					       ATA_LFLAG_ASSUME_SEMB;437		}438	} else if (vendor == 0x1095 && (devid == 0x5723 || devid == 0x5733 ||439					devid == 0x5734 || devid == 0x5744)) {440		/* sil5723/5744 quirks */441 442		/* sil5723/5744 has either two or three downstream443		 * ports depending on operation mode.  The last port444		 * is empty if any actual IO device is available or445		 * occupied by a pseudo configuration device446		 * otherwise.  Don't try hard to recover it.447		 */448		ap->pmp_link[ap->nr_pmp_links - 1].flags |= ATA_LFLAG_NO_RETRY;449	} else if (vendor == 0x197b && (devid == 0x2352 || devid == 0x0325)) {450		/*451		 * 0x2352: found in Thermaltake BlackX Duet, jmicron JMB350?452		 * 0x0325: jmicron JMB394.453		 */454		ata_for_each_link(link, ap, EDGE) {455			/* SRST breaks detection and disks get misclassified456			 * LPM disabled to avoid potential problems457			 */458			link->flags |= ATA_LFLAG_NO_LPM |459				       ATA_LFLAG_NO_SRST |460				       ATA_LFLAG_ASSUME_ATA;461		}462	} else if (vendor == 0x11ab && devid == 0x4140) {463		/* Marvell 4140 quirks */464		ata_for_each_link(link, ap, EDGE) {465			/* port 4 is for SEMB device and it doesn't like SRST */466			if (link->pmp == 4)467				link->flags |= ATA_LFLAG_DISABLED;468		}469	}470}471 472/**473 *	sata_pmp_attach - attach a SATA PMP device474 *	@dev: SATA PMP device to attach475 *476 *	Configure and attach SATA PMP device @dev.  This function is477 *	also responsible for allocating and initializing PMP links.478 *479 *	LOCKING:480 *	Kernel thread context (may sleep).481 *482 *	RETURNS:483 *	0 on success, -errno on failure.484 */485int sata_pmp_attach(struct ata_device *dev)486{487	struct ata_link *link = dev->link;488	struct ata_port *ap = link->ap;489	unsigned long flags;490	struct ata_link *tlink;491	int rc;492 493	/* is it hanging off the right place? */494	if (!sata_pmp_supported(ap)) {495		ata_dev_err(dev, "host does not support Port Multiplier\n");496		return -EINVAL;497	}498 499	if (!ata_is_host_link(link)) {500		ata_dev_err(dev, "Port Multipliers cannot be nested\n");501		return -EINVAL;502	}503 504	if (dev->devno) {505		ata_dev_err(dev, "Port Multiplier must be the first device\n");506		return -EINVAL;507	}508 509	WARN_ON(link->pmp != 0);510	link->pmp = SATA_PMP_CTRL_PORT;511 512	/* read GSCR block */513	rc = sata_pmp_read_gscr(dev, dev->gscr);514	if (rc)515		goto fail;516 517	/* config PMP */518	rc = sata_pmp_configure(dev, 1);519	if (rc)520		goto fail;521 522	rc = sata_pmp_init_links(ap, sata_pmp_gscr_ports(dev->gscr));523	if (rc) {524		ata_dev_info(dev, "failed to initialize PMP links\n");525		goto fail;526	}527 528	/* attach it */529	spin_lock_irqsave(ap->lock, flags);530	WARN_ON(ap->nr_pmp_links);531	ap->nr_pmp_links = sata_pmp_gscr_ports(dev->gscr);532	spin_unlock_irqrestore(ap->lock, flags);533 534	sata_pmp_quirks(ap);535 536	if (ap->ops->pmp_attach)537		ap->ops->pmp_attach(ap);538 539	ata_for_each_link(tlink, ap, EDGE)540		sata_link_init_spd(tlink);541 542	return 0;543 544 fail:545	link->pmp = 0;546	return rc;547}548 549/**550 *	sata_pmp_detach - detach a SATA PMP device551 *	@dev: SATA PMP device to detach552 *553 *	Detach SATA PMP device @dev.  This function is also554 *	responsible for deconfiguring PMP links.555 *556 *	LOCKING:557 *	Kernel thread context (may sleep).558 */559static void sata_pmp_detach(struct ata_device *dev)560{561	struct ata_link *link = dev->link;562	struct ata_port *ap = link->ap;563	struct ata_link *tlink;564	unsigned long flags;565 566	ata_dev_info(dev, "Port Multiplier detaching\n");567 568	WARN_ON(!ata_is_host_link(link) || dev->devno ||569		link->pmp != SATA_PMP_CTRL_PORT);570 571	if (ap->ops->pmp_detach)572		ap->ops->pmp_detach(ap);573 574	ata_for_each_link(tlink, ap, EDGE)575		ata_eh_detach_dev(tlink->device);576 577	spin_lock_irqsave(ap->lock, flags);578	ap->nr_pmp_links = 0;579	link->pmp = 0;580	spin_unlock_irqrestore(ap->lock, flags);581}582 583/**584 *	sata_pmp_same_pmp - does new GSCR matches the configured PMP?585 *	@dev: PMP device to compare against586 *	@new_gscr: GSCR block of the new device587 *588 *	Compare @new_gscr against @dev and determine whether @dev is589 *	the PMP described by @new_gscr.590 *591 *	LOCKING:592 *	None.593 *594 *	RETURNS:595 *	1 if @dev matches @new_gscr, 0 otherwise.596 */597static int sata_pmp_same_pmp(struct ata_device *dev, const u32 *new_gscr)598{599	const u32 *old_gscr = dev->gscr;600	u16 old_vendor, new_vendor, old_devid, new_devid;601	int old_nr_ports, new_nr_ports;602 603	old_vendor = sata_pmp_gscr_vendor(old_gscr);604	new_vendor = sata_pmp_gscr_vendor(new_gscr);605	old_devid = sata_pmp_gscr_devid(old_gscr);606	new_devid = sata_pmp_gscr_devid(new_gscr);607	old_nr_ports = sata_pmp_gscr_ports(old_gscr);608	new_nr_ports = sata_pmp_gscr_ports(new_gscr);609 610	if (old_vendor != new_vendor) {611		ata_dev_info(dev,612			     "Port Multiplier vendor mismatch '0x%x' != '0x%x'\n",613			     old_vendor, new_vendor);614		return 0;615	}616 617	if (old_devid != new_devid) {618		ata_dev_info(dev,619			     "Port Multiplier device ID mismatch '0x%x' != '0x%x'\n",620			     old_devid, new_devid);621		return 0;622	}623 624	if (old_nr_ports != new_nr_ports) {625		ata_dev_info(dev,626			     "Port Multiplier nr_ports mismatch '0x%x' != '0x%x'\n",627			     old_nr_ports, new_nr_ports);628		return 0;629	}630 631	return 1;632}633 634/**635 *	sata_pmp_revalidate - revalidate SATA PMP636 *	@dev: PMP device to revalidate637 *	@new_class: new class code638 *639 *	Re-read GSCR block and make sure @dev is still attached to the640 *	port and properly configured.641 *642 *	LOCKING:643 *	Kernel thread context (may sleep).644 *645 *	RETURNS:646 *	0 on success, -errno otherwise.647 */648static int sata_pmp_revalidate(struct ata_device *dev, unsigned int new_class)649{650	struct ata_link *link = dev->link;651	u32 *gscr = (void *)dev->sector_buf;652	int rc;653 654	ata_eh_about_to_do(link, NULL, ATA_EH_REVALIDATE);655 656	if (!ata_dev_enabled(dev)) {657		rc = -ENODEV;658		goto fail;659	}660 661	/* wrong class? */662	if (ata_class_enabled(new_class) && new_class != ATA_DEV_PMP) {663		rc = -ENODEV;664		goto fail;665	}666 667	/* read GSCR */668	rc = sata_pmp_read_gscr(dev, gscr);669	if (rc)670		goto fail;671 672	/* is the pmp still there? */673	if (!sata_pmp_same_pmp(dev, gscr)) {674		rc = -ENODEV;675		goto fail;676	}677 678	memcpy(dev->gscr, gscr, sizeof(gscr[0]) * SATA_PMP_GSCR_DWORDS);679 680	rc = sata_pmp_configure(dev, 0);681	if (rc)682		goto fail;683 684	ata_eh_done(link, NULL, ATA_EH_REVALIDATE);685 686	return 0;687 688 fail:689	ata_dev_err(dev, "PMP revalidation failed (errno=%d)\n", rc);690	return rc;691}692 693/**694 *	sata_pmp_revalidate_quick - revalidate SATA PMP quickly695 *	@dev: PMP device to revalidate696 *697 *	Make sure the attached PMP is accessible.698 *699 *	LOCKING:700 *	Kernel thread context (may sleep).701 *702 *	RETURNS:703 *	0 on success, -errno otherwise.704 */705static int sata_pmp_revalidate_quick(struct ata_device *dev)706{707	unsigned int err_mask;708	u32 prod_id;709 710	err_mask = sata_pmp_read(dev->link, SATA_PMP_GSCR_PROD_ID, &prod_id);711	if (err_mask) {712		ata_dev_err(dev,713			    "failed to read PMP product ID (Emask=0x%x)\n",714			    err_mask);715		return -EIO;716	}717 718	if (prod_id != dev->gscr[SATA_PMP_GSCR_PROD_ID]) {719		ata_dev_err(dev, "PMP product ID mismatch\n");720		/* something weird is going on, request full PMP recovery */721		return -EIO;722	}723 724	return 0;725}726 727/**728 *	sata_pmp_eh_recover_pmp - recover PMP729 *	@ap: ATA port PMP is attached to730 *	@prereset: prereset method (can be NULL)731 *	@softreset: softreset method732 *	@hardreset: hardreset method733 *	@postreset: postreset method (can be NULL)734 *735 *	Recover PMP attached to @ap.  Recovery procedure is somewhat736 *	similar to that of ata_eh_recover() except that reset should737 *	always be performed in hard->soft sequence and recovery738 *	failure results in PMP detachment.739 *740 *	LOCKING:741 *	Kernel thread context (may sleep).742 *743 *	RETURNS:744 *	0 on success, -errno on failure.745 */746static int sata_pmp_eh_recover_pmp(struct ata_port *ap,747		ata_prereset_fn_t prereset, ata_reset_fn_t softreset,748		ata_reset_fn_t hardreset, ata_postreset_fn_t postreset)749{750	struct ata_link *link = &ap->link;751	struct ata_eh_context *ehc = &link->eh_context;752	struct ata_device *dev = link->device;753	int tries = ATA_EH_PMP_TRIES;754	int detach = 0, rc = 0;755	int reval_failed = 0;756 757	if (dev->flags & ATA_DFLAG_DETACH) {758		detach = 1;759		rc = -ENODEV;760		goto fail;761	}762 763 retry:764	ehc->classes[0] = ATA_DEV_UNKNOWN;765 766	if (ehc->i.action & ATA_EH_RESET) {767		struct ata_link *tlink;768 769		/* reset */770		rc = ata_eh_reset(link, 0, prereset, softreset, hardreset,771				  postreset);772		if (rc) {773			ata_link_err(link, "failed to reset PMP, giving up\n");774			goto fail;775		}776 777		/* PMP is reset, SErrors cannot be trusted, scan all */778		ata_for_each_link(tlink, ap, EDGE) {779			struct ata_eh_context *ehc = &tlink->eh_context;780 781			ehc->i.probe_mask |= ATA_ALL_DEVICES;782			ehc->i.action |= ATA_EH_RESET;783		}784	}785 786	/* If revalidation is requested, revalidate and reconfigure;787	 * otherwise, do quick revalidation.788	 */789	if (ehc->i.action & ATA_EH_REVALIDATE)790		rc = sata_pmp_revalidate(dev, ehc->classes[0]);791	else792		rc = sata_pmp_revalidate_quick(dev);793 794	if (rc) {795		tries--;796 797		if (rc == -ENODEV) {798			ehc->i.probe_mask |= ATA_ALL_DEVICES;799			detach = 1;800			/* give it just two more chances */801			tries = min(tries, 2);802		}803 804		if (tries) {805			/* consecutive revalidation failures? speed down */806			if (reval_failed)807				sata_down_spd_limit(link, 0);808			else809				reval_failed = 1;810 811			ehc->i.action |= ATA_EH_RESET;812			goto retry;813		} else {814			ata_dev_err(dev,815				    "failed to recover PMP after %d tries, giving up\n",816				    ATA_EH_PMP_TRIES);817			goto fail;818		}819	}820 821	/* okay, PMP resurrected */822	ehc->i.flags = 0;823 824	return 0;825 826 fail:827	sata_pmp_detach(dev);828	if (detach)829		ata_eh_detach_dev(dev);830	else831		ata_dev_disable(dev);832 833	return rc;834}835 836static int sata_pmp_eh_handle_disabled_links(struct ata_port *ap)837{838	struct ata_link *link;839	unsigned long flags;840	int rc;841 842	spin_lock_irqsave(ap->lock, flags);843 844	ata_for_each_link(link, ap, EDGE) {845		if (!(link->flags & ATA_LFLAG_DISABLED))846			continue;847 848		spin_unlock_irqrestore(ap->lock, flags);849 850		/* Some PMPs require hardreset sequence to get851		 * SError.N working.852		 */853		sata_link_hardreset(link, sata_deb_timing_normal,854				ata_deadline(jiffies, ATA_TMOUT_INTERNAL_QUICK),855				NULL, NULL);856 857		/* unconditionally clear SError.N */858		rc = sata_scr_write(link, SCR_ERROR, SERR_PHYRDY_CHG);859		if (rc) {860			ata_link_err(link,861				     "failed to clear SError.N (errno=%d)\n",862				     rc);863			return rc;864		}865 866		spin_lock_irqsave(ap->lock, flags);867	}868 869	spin_unlock_irqrestore(ap->lock, flags);870 871	return 0;872}873 874static int sata_pmp_handle_link_fail(struct ata_link *link, int *link_tries)875{876	struct ata_port *ap = link->ap;877	unsigned long flags;878 879	if (link_tries[link->pmp] && --link_tries[link->pmp])880		return 1;881 882	/* disable this link */883	if (!(link->flags & ATA_LFLAG_DISABLED)) {884		ata_link_warn(link,885			"failed to recover link after %d tries, disabling\n",886			ATA_EH_PMP_LINK_TRIES);887 888		spin_lock_irqsave(ap->lock, flags);889		link->flags |= ATA_LFLAG_DISABLED;890		spin_unlock_irqrestore(ap->lock, flags);891	}892 893	ata_dev_disable(link->device);894	link->eh_context.i.action = 0;895 896	return 0;897}898 899/**900 *	sata_pmp_eh_recover - recover PMP-enabled port901 *	@ap: ATA port to recover902 *903 *	Drive EH recovery operation for PMP enabled port @ap.  This904 *	function recovers host and PMP ports with proper retrials and905 *	fallbacks.  Actual recovery operations are performed using906 *	ata_eh_recover() and sata_pmp_eh_recover_pmp().907 *908 *	LOCKING:909 *	Kernel thread context (may sleep).910 *911 *	RETURNS:912 *	0 on success, -errno on failure.913 */914static int sata_pmp_eh_recover(struct ata_port *ap)915{916	struct ata_port_operations *ops = ap->ops;917	int pmp_tries, link_tries[SATA_PMP_MAX_PORTS];918	struct ata_link *pmp_link = &ap->link;919	struct ata_device *pmp_dev = pmp_link->device;920	struct ata_eh_context *pmp_ehc = &pmp_link->eh_context;921	u32 *gscr = pmp_dev->gscr;922	struct ata_link *link;923	struct ata_device *dev;924	unsigned int err_mask;925	u32 gscr_error, sntf;926	int cnt, rc;927 928	pmp_tries = ATA_EH_PMP_TRIES;929	ata_for_each_link(link, ap, EDGE)930		link_tries[link->pmp] = ATA_EH_PMP_LINK_TRIES;931 932 retry:933	/* PMP attached? */934	if (!sata_pmp_attached(ap)) {935		rc = ata_eh_recover(ap, ops->prereset, ops->softreset,936				    ops->hardreset, ops->postreset, NULL);937		if (rc) {938			ata_for_each_dev(dev, &ap->link, ALL)939				ata_dev_disable(dev);940			return rc;941		}942 943		if (pmp_dev->class != ATA_DEV_PMP)944			return 0;945 946		/* new PMP online */947		ata_for_each_link(link, ap, EDGE)948			link_tries[link->pmp] = ATA_EH_PMP_LINK_TRIES;949 950		/* fall through */951	}952 953	/* recover pmp */954	rc = sata_pmp_eh_recover_pmp(ap, ops->prereset, ops->softreset,955				     ops->hardreset, ops->postreset);956	if (rc)957		goto pmp_fail;958 959	/* PHY event notification can disturb reset and other recovery960	 * operations.  Turn it off.961	 */962	if (gscr[SATA_PMP_GSCR_FEAT_EN] & SATA_PMP_FEAT_NOTIFY) {963		gscr[SATA_PMP_GSCR_FEAT_EN] &= ~SATA_PMP_FEAT_NOTIFY;964 965		err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN,966					  gscr[SATA_PMP_GSCR_FEAT_EN]);967		if (err_mask) {968			ata_link_warn(pmp_link,969				"failed to disable NOTIFY (err_mask=0x%x)\n",970				err_mask);971			goto pmp_fail;972		}973	}974 975	/* handle disabled links */976	rc = sata_pmp_eh_handle_disabled_links(ap);977	if (rc)978		goto pmp_fail;979 980	/* recover links */981	rc = ata_eh_recover(ap, ops->pmp_prereset, ops->pmp_softreset,982			    ops->pmp_hardreset, ops->pmp_postreset, &link);983	if (rc)984		goto link_fail;985 986	/* clear SNotification */987	rc = sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf);988	if (rc == 0)989		sata_scr_write(&ap->link, SCR_NOTIFICATION, sntf);990 991	/*992	 * If LPM is active on any fan-out port, hotplug wouldn't993	 * work.  Return w/ PHY event notification disabled.994	 */995	ata_for_each_link(link, ap, EDGE)996		if (link->lpm_policy > ATA_LPM_MAX_POWER)997			return 0;998 999	/*1000	 * Connection status might have changed while resetting other1001	 * links, enable notification and check SATA_PMP_GSCR_ERROR1002	 * before returning.1003	 */1004 1005	/* enable notification */1006	if (pmp_dev->flags & ATA_DFLAG_AN) {1007		gscr[SATA_PMP_GSCR_FEAT_EN] |= SATA_PMP_FEAT_NOTIFY;1008 1009		err_mask = sata_pmp_write(pmp_link, SATA_PMP_GSCR_FEAT_EN,1010					  gscr[SATA_PMP_GSCR_FEAT_EN]);1011		if (err_mask) {1012			ata_dev_err(pmp_dev,1013				    "failed to write PMP_FEAT_EN (Emask=0x%x)\n",1014				    err_mask);1015			rc = -EIO;1016			goto pmp_fail;1017		}1018	}1019 1020	/* check GSCR_ERROR */1021	err_mask = sata_pmp_read(pmp_link, SATA_PMP_GSCR_ERROR, &gscr_error);1022	if (err_mask) {1023		ata_dev_err(pmp_dev,1024			    "failed to read PMP_GSCR_ERROR (Emask=0x%x)\n",1025			    err_mask);1026		rc = -EIO;1027		goto pmp_fail;1028	}1029 1030	cnt = 0;1031	ata_for_each_link(link, ap, EDGE) {1032		if (!(gscr_error & (1 << link->pmp)))1033			continue;1034 1035		if (sata_pmp_handle_link_fail(link, link_tries)) {1036			ata_ehi_hotplugged(&link->eh_context.i);1037			cnt++;1038		} else {1039			ata_link_warn(link,1040				"PHY status changed but maxed out on retries, giving up\n");1041			ata_link_warn(link,1042				"Manually issue scan to resume this link\n");1043		}1044	}1045 1046	if (cnt) {1047		ata_port_info(ap,1048			"PMP SError.N set for some ports, repeating recovery\n");1049		goto retry;1050	}1051 1052	return 0;1053 1054 link_fail:1055	if (sata_pmp_handle_link_fail(link, link_tries)) {1056		pmp_ehc->i.action |= ATA_EH_RESET;1057		goto retry;1058	}1059 1060	/* fall through */1061 pmp_fail:1062	/* Control always ends up here after detaching PMP.  Shut up1063	 * and return if we're unloading.1064	 */1065	if (ap->pflags & ATA_PFLAG_UNLOADING)1066		return rc;1067 1068	if (!sata_pmp_attached(ap))1069		goto retry;1070 1071	if (--pmp_tries) {1072		pmp_ehc->i.action |= ATA_EH_RESET;1073		goto retry;1074	}1075 1076	ata_port_err(ap, "failed to recover PMP after %d tries, giving up\n",1077		     ATA_EH_PMP_TRIES);1078	sata_pmp_detach(pmp_dev);1079	ata_dev_disable(pmp_dev);1080 1081	return rc;1082}1083 1084/**1085 *	sata_pmp_error_handler - do standard error handling for PMP-enabled host1086 *	@ap: host port to handle error for1087 *1088 *	Perform standard error handling sequence for PMP-enabled host1089 *	@ap.1090 *1091 *	LOCKING:1092 *	Kernel thread context (may sleep).1093 */1094void sata_pmp_error_handler(struct ata_port *ap)1095{1096	ata_eh_autopsy(ap);1097	ata_eh_report(ap);1098	sata_pmp_eh_recover(ap);1099	ata_eh_finish(ap);1100}1101 1102EXPORT_SYMBOL_GPL(sata_pmp_port_ops);1103EXPORT_SYMBOL_GPL(sata_pmp_qc_defer_cmd_switch);1104EXPORT_SYMBOL_GPL(sata_pmp_error_handler);1105