Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fd0527ab authored by Jeff Skirvin's avatar Jeff Skirvin Committed by Dan Williams
Browse files

isci: Hard reset failure will link reset all phys in the port



In the case where the hard reset process fails, each link in
the port is put through a link reset sequence.

Signed-off-by: default avatarJeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent fd536601
Loading
Loading
Loading
Loading
+17 −5
Original line number Diff line number Diff line
@@ -1916,7 +1916,7 @@ int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *ipor
{
	unsigned long flags;
	enum sci_status status;
	int ret = TMF_RESP_FUNC_COMPLETE;
	int idx, ret = TMF_RESP_FUNC_COMPLETE;

	dev_dbg(&ihost->pdev->dev, "%s: iport = %p\n",
		__func__, iport);
@@ -1953,14 +1953,26 @@ int isci_port_perform_hard_reset(struct isci_host *ihost, struct isci_port *ipor
	 * the same as link failures on all phys in the port.
	 */
	if (ret != TMF_RESP_FUNC_COMPLETE) {

		dev_err(&ihost->pdev->dev,
			"%s: iport = %p; hard reset failed "
			"(0x%x) - sending link down to libsas for phy %p\n",
			__func__, iport, iport->hard_reset_status, iphy);
			"(0x%x) - driving explicit link fail for all phys\n",
			__func__, iport, iport->hard_reset_status);

		isci_port_link_down(ihost, iphy, iport);
	}
		/* Down all phys in the port. */
		spin_lock_irqsave(&ihost->scic_lock, flags);
		for (idx = 0; idx < SCI_MAX_PHYS; ++idx) {

			if (iport->sci.phy_table[idx] != NULL) {

				scic_sds_phy_stop(
					iport->sci.phy_table[idx]);
				scic_sds_phy_start(
					iport->sci.phy_table[idx]);
			}
		}
		spin_unlock_irqrestore(&ihost->scic_lock, flags);
	}
	return ret;
}