Lines Matching full:link
29 * @link: ATA link to test SCR accessibility for
31 * Test whether SCRs are accessible for @link.
39 int sata_scr_valid(struct ata_link *link) in sata_scr_valid() argument
41 struct ata_port *ap = link->ap; in sata_scr_valid()
49 * @link: ATA link to read SCR for
53 * Read SCR register @reg of @link into *@val. This function is
54 * guaranteed to succeed if @link is ap->link, the cable type of
58 * None if @link is ap->link. Kernel thread context otherwise.
63 int sata_scr_read(struct ata_link *link, int reg, u32 *val) in sata_scr_read() argument
65 if (ata_is_host_link(link)) { in sata_scr_read()
66 if (sata_scr_valid(link)) in sata_scr_read()
67 return link->ap->ops->scr_read(link, reg, val); in sata_scr_read()
71 return sata_pmp_scr_read(link, reg, val); in sata_scr_read()
77 * @link: ATA link to write SCR for
81 * Write @val to SCR register @reg of @link. This function is
82 * guaranteed to succeed if @link is ap->link, the cable type of
86 * None if @link is ap->link. Kernel thread context otherwise.
91 int sata_scr_write(struct ata_link *link, int reg, u32 val) in sata_scr_write() argument
93 if (ata_is_host_link(link)) { in sata_scr_write()
94 if (sata_scr_valid(link)) in sata_scr_write()
95 return link->ap->ops->scr_write(link, reg, val); in sata_scr_write()
99 return sata_pmp_scr_write(link, reg, val); in sata_scr_write()
105 * @link: ATA link to write SCR for
113 * None if @link is ap->link. Kernel thread context otherwise.
118 int sata_scr_write_flush(struct ata_link *link, int reg, u32 val) in sata_scr_write_flush() argument
120 if (ata_is_host_link(link)) { in sata_scr_write_flush()
123 if (sata_scr_valid(link)) { in sata_scr_write_flush()
124 rc = link->ap->ops->scr_write(link, reg, val); in sata_scr_write_flush()
126 rc = link->ap->ops->scr_read(link, reg, &val); in sata_scr_write_flush()
132 return sata_pmp_scr_write(link, reg, val); in sata_scr_write_flush()
213 * @link: ATA link to debounce SATA phy status for
217 * Make sure SStatus of @link reaches stable state, determined by
233 int sata_link_debounce(struct ata_link *link, const unsigned long *params, in sata_link_debounce() argument
246 if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) in sata_link_debounce()
254 ata_msleep(link->ap, interval); in sata_link_debounce()
255 if ((rc = sata_scr_read(link, SCR_STATUS, &cur))) in sata_link_debounce()
274 * -EPIPE to tell upper layer to lower link speed. in sata_link_debounce()
283 * sata_link_resume - resume SATA link
284 * @link: ATA link to resume SATA
288 * Resume SATA phy @link and debounce it.
296 int sata_link_resume(struct ata_link *link, const unsigned long *params, in sata_link_resume() argument
303 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_resume()
313 if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) in sata_link_resume()
320 if (!(link->flags & ATA_LFLAG_NO_DB_DELAY)) in sata_link_resume()
321 ata_msleep(link->ap, 200); in sata_link_resume()
324 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_resume()
329 ata_link_warn(link, "failed to resume link (SControl %X)\n", in sata_link_resume()
335 ata_link_warn(link, "link resume succeeded after %d retries\n", in sata_link_resume()
338 if ((rc = sata_link_debounce(link, params, deadline))) in sata_link_resume()
342 if (!(rc = sata_scr_read(link, SCR_ERROR, &serror))) in sata_link_resume()
343 rc = sata_scr_write(link, SCR_ERROR, serror); in sata_link_resume()
351 * @link: ATA link to manipulate SControl for
355 * Manipulate the IPM field of the SControl register of @link
358 * the link. This function also clears PHYRDY_CHG before
367 int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy, in sata_link_scr_lpm() argument
370 struct ata_eh_context *ehc = &link->eh_context; in sata_link_scr_lpm()
375 rc = sata_scr_read(link, SCR_CONTROL, &scontrol); in sata_link_scr_lpm()
397 if (ata_link_nr_enabled(link) > 0) in sata_link_scr_lpm()
410 rc = sata_scr_write(link, SCR_CONTROL, scontrol); in sata_link_scr_lpm()
414 /* give the link time to transit out of LPM state */ in sata_link_scr_lpm()
420 return sata_scr_write(link, SCR_ERROR, SERR_PHYRDY_CHG); in sata_link_scr_lpm()
424 static int __sata_set_spd_needed(struct ata_link *link, u32 *scontrol) in __sata_set_spd_needed() argument
426 struct ata_link *host_link = &link->ap->link; in __sata_set_spd_needed()
429 limit = link->sata_spd_limit; in __sata_set_spd_needed()
431 /* Don't configure downstream link faster than upstream link. in __sata_set_spd_needed()
435 if (!ata_is_host_link(link) && host_link->sata_spd) in __sata_set_spd_needed()
451 * @link: Link in question
454 * @link->sata_spd_limit. This function is used to determine
464 static int sata_set_spd_needed(struct ata_link *link) in sata_set_spd_needed() argument
468 if (sata_scr_read(link, SCR_CONTROL, &scontrol)) in sata_set_spd_needed()
471 return __sata_set_spd_needed(link, &scontrol); in sata_set_spd_needed()
476 * @link: Link to set SATA spd for
478 * Set SATA spd of @link according to sata_spd_limit.
487 int sata_set_spd(struct ata_link *link) in sata_set_spd() argument
492 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_set_spd()
495 if (!__sata_set_spd_needed(link, &scontrol)) in sata_set_spd()
498 if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) in sata_set_spd()
506 * sata_link_hardreset - reset link via SATA phy reset
507 * @link: link to reset
510 * @online: optional out parameter indicating link onlineness
511 * @check_ready: optional callback to check link readiness
513 * SATA phy-reset @link using DET bits of SControl register.
514 * After hardreset, link readiness is waited upon using
520 * *@online is set to one iff reset succeeded and @link is online
529 int sata_link_hardreset(struct ata_link *link, const unsigned long *timing, in sata_link_hardreset() argument
541 if (sata_set_spd_needed(link)) { in sata_link_hardreset()
547 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_hardreset()
552 if ((rc = sata_scr_write(link, SCR_CONTROL, scontrol))) in sata_link_hardreset()
555 sata_set_spd(link); in sata_link_hardreset()
559 if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol))) in sata_link_hardreset()
564 if ((rc = sata_scr_write_flush(link, SCR_CONTROL, scontrol))) in sata_link_hardreset()
570 ata_msleep(link->ap, 1); in sata_link_hardreset()
572 /* bring link back */ in sata_link_hardreset()
573 rc = sata_link_resume(link, timing, deadline); in sata_link_hardreset()
576 /* if link is offline nothing more to do */ in sata_link_hardreset()
577 if (ata_phys_link_offline(link)) in sata_link_hardreset()
580 /* Link is online. From this point, -ENODEV too is an error. */ in sata_link_hardreset()
584 if (sata_pmp_supported(link->ap) && ata_is_host_link(link)) { in sata_link_hardreset()
597 ata_wait_ready(link, pmp_deadline, check_ready); in sata_link_hardreset()
605 rc = ata_wait_ready(link, deadline, check_ready); in sata_link_hardreset()
608 /* online is set iff link is online && reset succeeded */ in sata_link_hardreset()
611 ata_link_err(link, "COMRESET failed (errno=%d)\n", rc); in sata_link_hardreset()
678 * ata_slave_link_init - initialize slave link
679 * @ap: port to initialize slave link for
681 * Create and initialize slave link for @ap. This enables slave
682 * link handling on the port.
684 * In libata, a port contains links and a link contains devices.
685 * There is single host link but if a PMP is attached to it,
687 * a single device connected to a link but PATA and SATA
695 * need separate links for physical link handling
696 * (e.g. onlineness, link speed) but should be treated like a
702 * anything other than physical link handling, the default host
703 * link is used for both master and slave. For physical link
707 * called once more for the slave link, so the reset sequence
725 struct ata_link *link; in ata_slave_link_init() local
730 link = kzalloc(sizeof(*link), GFP_KERNEL); in ata_slave_link_init()
731 if (!link) in ata_slave_link_init()
734 ata_link_init(ap, link, 1); in ata_slave_link_init()
735 ap->slave_link = link; in ata_slave_link_init()
742 * @link: Link receiving the event
752 bool sata_lpm_ignore_phy_events(struct ata_link *link) in sata_lpm_ignore_phy_events() argument
754 unsigned long lpm_timeout = link->last_lpm_change + in sata_lpm_ignore_phy_events()
758 if (link->lpm_policy > ATA_LPM_MAX_POWER) in sata_lpm_ignore_phy_events()
764 if ((link->flags & ATA_LFLAG_CHANGED) && in sata_lpm_ignore_phy_events()
787 struct ata_link *link; in ata_scsi_lpm_store() local
805 ata_for_each_link(link, ap, EDGE) { in ata_scsi_lpm_store()
806 ata_for_each_dev(dev, &ap->link, ENABLED) { in ata_scsi_lpm_store()
891 dev->link->eh_info.action |= ATA_EH_REVALIDATE; in ata_ncq_prio_enable_store()
892 dev->link->eh_info.flags |= ATA_EHI_QUIET; in ata_ncq_prio_enable_store()
1224 ata_scsi_dev_config(sdev, ap->link.device); in ata_sas_slave_configure()
1245 if (likely(ata_dev_enabled(ap->link.device))) in ata_sas_queuecmd()
1246 rc = __ata_scsi_queuecmd(cmd, ap->link.device); in ata_sas_queuecmd()
1301 rc = sata_scr_read(&ap->link, SCR_NOTIFICATION, &sntf); in sata_async_notification()
1303 sata_scr_write(&ap->link, SCR_NOTIFICATION, sntf); in sata_async_notification()
1312 struct ata_device *dev = ap->link.device; in sata_async_notification()
1329 struct ata_link *link; in sata_async_notification() local
1332 ata_for_each_link(link, ap, EDGE) { in sata_async_notification()
1333 if (!(sntf & (1 << link->pmp))) in sata_async_notification()
1336 if ((link->device->class == ATA_DEV_ATAPI) && in sata_async_notification()
1337 (link->device->flags & ATA_DFLAG_AN)) in sata_async_notification()
1338 ata_scsi_media_change_notify(link->device); in sata_async_notification()
1372 u8 *buf = dev->link->ap->sector_buf; in ata_eh_read_log_10h()
1412 * @link: ATA link to analyze NCQ error for
1422 void ata_eh_analyze_ncq_error(struct ata_link *link) in ata_eh_analyze_ncq_error() argument
1424 struct ata_port *ap = link->ap; in ata_eh_analyze_ncq_error()
1425 struct ata_eh_context *ehc = &link->eh_context; in ata_eh_analyze_ncq_error()
1426 struct ata_device *dev = link->device; in ata_eh_analyze_ncq_error()
1436 if (!link->sactive || !(ehc->i.err_mask & AC_ERR_DEV)) in ata_eh_analyze_ncq_error()
1452 ata_link_err(link, "failed to read log page 10h (errno=%d)\n", in ata_eh_analyze_ncq_error()
1457 if (!(link->sactive & (1 << tag))) { in ata_eh_analyze_ncq_error()
1458 ata_link_err(link, "log page 10h reported inactive tag %d\n", in ata_eh_analyze_ncq_error()