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

Commit 22ef02c2 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

sfc: SFT9001: Include non-breaking cable diagnostics in online self-tests

parent c747583d
Loading
Loading
Loading
Loading
+24 −21
Original line number Diff line number Diff line
@@ -679,11 +679,9 @@ static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags)
{
	struct ethtool_cmd ecmd;
	int phy_id = efx->mii.phy_id;
	int rc = 0, rc2, i, res_reg;

	if (!(flags & ETH_TEST_FL_OFFLINE))
		return 0;
	int rc = 0, rc2, i, ctrl_reg, res_reg;

	if (flags & ETH_TEST_FL_OFFLINE)
		efx->phy_op->get_settings(efx, &ecmd);

	/* Initialise cable diagnostic results to unknown failure */
@@ -692,18 +690,22 @@ static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags)

	/* Run cable diagnostics; wait up to 5 seconds for them to complete.
	 * A cable fault is not a self-test failure, but a timeout is. */
	mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
			    PMA_PMD_CDIAG_CTRL_REG,
			    (1 << CDIAG_CTRL_IMMED_LBN) |
			    (1 << CDIAG_CTRL_BRK_LINK_LBN) |
	ctrl_reg = ((1 << CDIAG_CTRL_IMMED_LBN) |
		    (CDIAG_CTRL_LEN_METRES << CDIAG_CTRL_LEN_UNIT_LBN));
	if (flags & ETH_TEST_FL_OFFLINE) {
		/* Break the link in order to run full diagnostics.  We
		 * must reset the PHY to resume normal service. */
		ctrl_reg |= (1 << CDIAG_CTRL_BRK_LINK_LBN);
	}
	mdio_clause45_write(efx, phy_id, MDIO_MMD_PMAPMD,
			    PMA_PMD_CDIAG_CTRL_REG, ctrl_reg);
	i = 0;
	while (mdio_clause45_read(efx, phy_id, MDIO_MMD_PMAPMD,
				  PMA_PMD_CDIAG_CTRL_REG) &
	       (1 << CDIAG_CTRL_IN_PROG_LBN)) {
		if (++i == 50) {
			rc = -ETIMEDOUT;
			goto reset;
			goto out;
		}
		msleep(100);
	}
@@ -728,9 +730,9 @@ static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags)
			results[5 + i] = len_reg;
	}

	/* We must reset to exit cable diagnostic mode.  The BIST will
	 * also run when we do this. */
reset:
out:
	if (flags & ETH_TEST_FL_OFFLINE) {
		/* Reset, running the BIST and then resuming normal service. */
		rc2 = tenxpress_special_reset(efx);
		results[0] = rc2 ? -1 : 1;
		if (!rc)
@@ -739,6 +741,7 @@ static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags)
		rc2 = efx->phy_op->set_settings(efx, &ecmd);
		if (!rc)
			rc = rc2;
	}

	return rc;
}