Lines Matching full:link

31  *	@link: ATA link to test SCR accessibility for
33 * Test whether SCRs are accessible for @link.
41 int sata_scr_valid(struct ata_link *link) in sata_scr_valid() argument
43 struct ata_port *ap = link->ap; in sata_scr_valid()
51 * @link: ATA link to read SCR for
55 * Read SCR register @reg of @link into *@val. This function is
56 * guaranteed to succeed if @link is ap->link, the cable type of
60 * None if @link is ap->link. Kernel thread context otherwise.
65 int sata_scr_read(struct ata_link *link, int reg, u32 *val) in sata_scr_read() argument
67 if (ata_is_host_link(link)) { in sata_scr_read()
68 if (sata_scr_valid(link)) in sata_scr_read()
69 return link->ap->ops->scr_read(link, reg, val); in sata_scr_read()
73 return sata_pmp_scr_read(link, reg, val); in sata_scr_read()
79 * @link: ATA link to write SCR for
83 * Write @val to SCR register @reg of @link. This function is
84 * guaranteed to succeed if @link is ap->link, the cable type of
88 * None if @link is ap->link. Kernel thread context otherwise.
93 int sata_scr_write(struct ata_link *link, int reg, u32 val) in sata_scr_write() argument
95 if (ata_is_host_link(link)) { in sata_scr_write()
96 if (sata_scr_valid(link)) in sata_scr_write()
97 return link->ap->ops->scr_write(link, reg, val); in sata_scr_write()
101 return sata_pmp_scr_write(link, reg, val); in sata_scr_write()
107 * @link: ATA link to write SCR for
115 * None if @link is ap->link. Kernel thread context otherwise.
120 int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) in sata_scr_write_flush() argument
122 if (ata_is_host_link(link)) { in sata_scr_write_flush()
125 if (sata_scr_valid(link)) { in sata_scr_write_flush()
126 rc = link->ap->ops->scr_write(link, reg, val); in sata_scr_write_flush()
128 rc = link->ap->ops->scr_read(link, reg, &val); in sata_scr_write_flush()
134 return sata_pmp_scr_write(link, reg, val); in sata_scr_write_flush()
215 * @link: ATA link to debounce SATA phy status for
219 * Make sure SStatus of @link reaches stable state, determined by
235 int sata_link_debounce(struct ata_link *link, const unsigned int *params, in sata_link_debounce() argument
248 if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) in sata_link_debounce()
256 ata_msleep(link->ap, interval); in sata_link_debounce()
257 if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) in sata_link_debounce()
276 * -EPIPE to tell upper layer to lower link speed. in sata_link_debounce()
285 * sata_link_resume - resume SATA link
286 * @link: ATA link to resume SATA
290 * Resume SATA phy @link and debounce it.
298 int sata_link_resume(struct ata_link *link, const unsigned int *params, in sata_link_resume() argument
305 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_resume()
315 if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) in sata_link_resume()
322 if (!(link->flags & ATA_LFLAG_NO_DEBOUNCE_DELAY)) in sata_link_resume()
323 ata_msleep(link->ap, 200); in sata_link_resume()
326 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_resume()
331 ata_link_warn(link, "failed to resume link (SControl %X)\n", in sata_link_resume()
337 ata_link_warn(link, "link resume succeeded after %d retries\n", in sata_link_resume()
340 if ((rc = sata_link_debounce(link, params, deadline))) in sata_link_resume()
344 if (!(rc = sata_scr_read(link, SCR_ERROR, &serror))) in sata_link_resume()
345 rc = sata_scr_write(link, SCR_ERROR, serror); in sata_link_resume()
353 * @link: ATA link to manipulate SControl for
357 * Manipulate the IPM field of the SControl register of @link
360 * the link. This function also clears PHYRDY_CHG before
369 int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, in sata_link_scr_lpm() argument
372 struct ata_eh_context *ehc = &link->eh_context; in sata_link_scr_lpm()
377 rc = sata_scr_read(link, SCR_CONTROL, &scontrol); in sata_link_scr_lpm()
399 if (ata_link_nr_enabled(link) > 0) { in sata_link_scr_lpm()
407 if (link->ap->host->flags & ATA_HOST_NO_PART) in sata_link_scr_lpm()
410 if (link->ap->host->flags & ATA_HOST_NO_SSC) in sata_link_scr_lpm()
413 if (link->ap->host->flags & ATA_HOST_NO_DEVSLP) in sata_link_scr_lpm()
425 rc = sata_scr_write(link, SCR_CONTROL, scontrol); in sata_link_scr_lpm()
429 /* give the link time to transit out of LPM state */ in sata_link_scr_lpm()
435 return sata_scr_write(link, SCR_ERROR, SERR_PHYRDY_CHG); in sata_link_scr_lpm()
439 static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol) in __sata_set_spd_needed() argument
441 struct ata_link *host_link = &link->ap->link; in __sata_set_spd_needed()
444 limit = link->sata_spd_limit; in __sata_set_spd_needed()
446 /* Don't configure downstream link faster than upstream link. in __sata_set_spd_needed()
450 if (!ata_is_host_link(link) && host_link->sata_spd) in __sata_set_spd_needed()
466 * @link: Link in question
469 * @link->sata_spd_limit. This function is used to determine
479 static int sata_set_spd_needed(struct ata_link *link) in sata_set_spd_needed() argument
483 if (sata_scr_read(link, SCR_CONTROL, &scontrol)) in sata_set_spd_needed()
486 return __sata_set_spd_needed(link, &scontrol); in sata_set_spd_needed()
491 * @link: Link to set SATA spd for
493 * Set SATA spd of @link according to sata_spd_limit.
502 int sata_set_spd(struct ata_link *link) in sata_set_spd() argument
507 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_set_spd()
510 if (!__sata_set_spd_needed(link, &scontrol)) in sata_set_spd()
513 if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) in sata_set_spd()
522 * @link: Link to adjust SATA spd limit for
525 * Adjust SATA spd limit of @link downward. Note that this
540 int sata_down_spd_limit(struct ata_link *link, u32 spd_limit) in sata_down_spd_limit() argument
545 if (!sata_scr_valid(link)) in sata_down_spd_limit()
549 * If not, use cached value in link->sata_spd. in sata_down_spd_limit()
551 rc = sata_scr_read(link, SCR_STATUS, &sstatus); in sata_down_spd_limit()
555 spd = link->sata_spd; in sata_down_spd_limit()
557 mask = link->sata_spd_limit; in sata_down_spd_limit()
568 * recorded the link speed from SStatus, the driver has already in sata_down_spd_limit()
570 * Otherwise, we should not force 1.5Gbps on a link where we have in sata_down_spd_limit()
576 else if (link->sata_spd) in sata_down_spd_limit()
592 link->sata_spd_limit = mask; in sata_down_spd_limit()
594 ata_link_warn(link, "limiting SATA link speed to %s\n", in sata_down_spd_limit()
601 * sata_link_hardreset - reset link via SATA phy reset
602 * @link: link to reset
605 * @online: optional out parameter indicating link onlineness
606 * @check_ready: optional callback to check link readiness
608 * SATA phy-reset @link using DET bits of SControl register.
609 * After hardreset, link readiness is waited upon using
615 * *@online is set to one iff reset succeeded and @link is online
624 int sata_link_hardreset(struct ata_link *link, const unsigned int *timing, in sata_link_hardreset() argument
634 if (sata_set_spd_needed(link)) { in sata_link_hardreset()
640 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_hardreset()
645 if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) in sata_link_hardreset()
648 sata_set_spd(link); in sata_link_hardreset()
652 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_hardreset()
657 if ((rc = sata_scr_write_flush(link, SCR_CONTROL, scontrol))) in sata_link_hardreset()
663 ata_msleep(link->ap, 1); in sata_link_hardreset()
665 /* bring link back */ in sata_link_hardreset()
666 rc = sata_link_resume(link, timing, deadline); in sata_link_hardreset()
669 /* if link is offline nothing more to do */ in sata_link_hardreset()
670 if (ata_phys_link_offline(link)) in sata_link_hardreset()
673 /* Link is online. From this point, -ENODEV too is an error. */ in sata_link_hardreset()
677 if (sata_pmp_supported(link->ap) && ata_is_host_link(link)) { in sata_link_hardreset()
690 ata_wait_ready(link, pmp_deadline, check_ready); in sata_link_hardreset()
698 rc = ata_wait_ready(link, deadline, check_ready); in sata_link_hardreset()
701 /* online is set iff link is online && reset succeeded */ in sata_link_hardreset()
711 * @link: link to reset
721 * 0 if link offline, -EAGAIN if link online, -errno on errors.
723 int sata_std_hardreset(struct ata_link *link, unsigned int *class, in sata_std_hardreset() argument
726 const unsigned int *timing = sata_ehc_deb_timing(&link->eh_context); in sata_std_hardreset()
730 rc = sata_link_hardreset(link, timing, deadline, &online, NULL); in sata_std_hardreset()
800 * ata_slave_link_init - initialize slave link
801 * @ap: port to initialize slave link for
803 * Create and initialize slave link for @ap. This enables slave
804 * link handling on the port.
806 * In libata, a port contains links and a link contains devices.
807 * There is single host link but if a PMP is attached to it,
809 * a single device connected to a link but PATA and SATA
817 * need separate links for physical link handling
818 * (e.g. onlineness, link speed) but should be treated like a
824 * anything other than physical link handling, the default host
825 * link is used for both master and slave. For physical link
829 * called once more for the slave link, so the reset sequence
847 struct ata_link *link; in ata_slave_link_init() local
852 link = kzalloc(sizeof(*link), GFP_KERNEL); in ata_slave_link_init()
853 if (!link) in ata_slave_link_init()
856 ata_link_init(ap, link, 1); in ata_slave_link_init()
857 ap->slave_link = link; in ata_slave_link_init()
864 * @link: Link receiving the event
874 bool sata_lpm_ignore_phy_events(struct ata_link *link) in sata_lpm_ignore_phy_events() argument
876 unsigned long lpm_timeout = link->last_lpm_change + in sata_lpm_ignore_phy_events()
880 if (link->lpm_policy > ATA_LPM_MAX_POWER) in sata_lpm_ignore_phy_events()
886 if ((link->flags & ATA_LFLAG_CHANGED) && in sata_lpm_ignore_phy_events()
904 * Check if a port supports link power management.
909 struct ata_link *link; in ata_scsi_lpm_supported() local
915 ata_for_each_link(link, ap, EDGE) { in ata_scsi_lpm_supported()
916 ata_for_each_dev(dev, &ap->link, ENABLED) { in ata_scsi_lpm_supported()
1365 return ata_scsi_dev_config(sdev, lim, ap->link.device); in ata_sas_sdev_configure()
1383 if (likely(ata_dev_enabled(ap->link.device))) in ata_sas_queuecmd()
1384 rc = __ata_scsi_queuecmd(cmd, ap->link.device); in ata_sas_queuecmd()
1414 rc = sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf); in sata_async_notification()
1416 sata_scr_write(&ap->link, SCR_NOTIFICATION, sntf); in sata_async_notification()
1425 struct ata_device *dev = ap->link.device; in sata_async_notification()
1442 struct ata_link *link; in sata_async_notification() local
1445 ata_for_each_link(link, ap, EDGE) { in sata_async_notification()
1446 if (!(sntf & (1 << link->pmp))) in sata_async_notification()
1449 if ((link->device->class == ATA_DEV_ATAPI) && in sata_async_notification()
1450 (link->device->flags & ATA_DFLAG_AN)) in sata_async_notification()
1451 ata_scsi_media_change_notify(link->device); in sata_async_notification()
1526 * @link: ATA link to get sense data for
1538 int ata_eh_get_ncq_success_sense(struct ata_link *link) in ata_eh_get_ncq_success_sense() argument
1540 struct ata_device *dev = link->device; in ata_eh_get_ncq_success_sense()
1541 struct ata_port *ap = dev->link->ap; in ata_eh_get_ncq_success_sense()
1575 ata_dev_phys_link(qc->dev) != link) in ata_eh_get_ncq_success_sense()
1626 * @link: ATA link to analyze NCQ error for
1636 void ata_eh_analyze_ncq_error(struct ata_link *link) in ata_eh_analyze_ncq_error() argument
1638 struct ata_port *ap = link->ap; in ata_eh_analyze_ncq_error()
1639 struct ata_eh_context *ehc = &link->eh_context; in ata_eh_analyze_ncq_error()
1640 struct ata_device *dev = link->device; in ata_eh_analyze_ncq_error()
1650 if (!link->sactive || !(ehc->i.err_mask & AC_ERR_DEV)) in ata_eh_analyze_ncq_error()
1666 ata_link_err(link, "failed to read log page 10h (errno=%d)\n", in ata_eh_analyze_ncq_error()
1671 if (!(link->sactive & BIT(tag))) { in ata_eh_analyze_ncq_error()
1672 ata_link_err(link, "log page 10h reported inactive tag %d\n", in ata_eh_analyze_ncq_error()
1703 ata_dev_phys_link(qc->dev) != link) in ata_eh_analyze_ncq_error()
1721 * aborted. All other failed commands for our link should be in ata_eh_analyze_ncq_error()