ret = tb_port_read(port, &val, TB_CFG_PORT,
port->cap_tmu + TMU_ADP_CS_8, 1); if (ret) return ret;
val &= ~TMU_ADP_CS_8_REPL_TIMEOUT_MASK;
val &= ~TMU_ADP_CS_8_REPL_THRESHOLD_MASK;
val |= FIELD_PREP(TMU_ADP_CS_8_REPL_TIMEOUT_MASK, repl_timeout);
val |= FIELD_PREP(TMU_ADP_CS_8_REPL_THRESHOLD_MASK, repl_threshold);
ret = tb_port_write(port, &val, TB_CFG_PORT,
port->cap_tmu + TMU_ADP_CS_8, 1); if (ret) return ret;
ret = tb_port_read(port, &val, TB_CFG_PORT,
port->cap_tmu + TMU_ADP_CS_9, 1); if (ret) return ret;
val &= ~TMU_ADP_CS_9_REPL_N_MASK;
val &= ~TMU_ADP_CS_9_DIRSWITCH_N_MASK;
val |= FIELD_PREP(TMU_ADP_CS_9_REPL_N_MASK, repl_n);
val |= FIELD_PREP(TMU_ADP_CS_9_DIRSWITCH_N_MASK, dirswitch_n);
ret = tb_port_tmu_rate_write(down, 0); if (ret) return ret; return tb_port_tmu_enhanced_enable(down, false);
}
/** *tb_switch_tmu_disable()-DisableTMUofaswitch *@sw:SwitchwhoseTMUtodisable * *TurnsoffTMUof@swifitisenabled.Ifnotenableddoesnothing.
*/ int tb_switch_tmu_disable(struct tb_switch *sw)
{ /* Already disabled? */ if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) return0;
if (tb_route(sw)) { struct tb_port *down, *up; int ret;
down = tb_switch_downstream_port(sw);
up = tb_upstream_port(sw); /* *Incaseofuni-directionaltimesync,TMUhandshakeis *initiatedbyupstreamrouter.Incaseofbi-directional *timesync,TMUhandshakeisinitiatedbydownstreamrouter. *Wechangedownstreamrouter'sratetooffforbothuni/bidir *casesalthoughitisneededonlyforthebi-directionalmode. *Weavoidchangingupstreamrouter'smodesinceitmight *haveanotherdownstreamrouterplugged,thatissetto *uni-directionalmodeandwedon'twanttochangeit'sTMU *mode.
*/
ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]); if (ret) return ret;
tb_port_tmu_time_sync_disable(up);
ret = tb_port_tmu_time_sync_disable(down); if (ret) return ret;
switch (sw->tmu.mode) { case TB_SWITCH_TMU_MODE_LOWRES: case TB_SWITCH_TMU_MODE_HIFI_UNI: /* The switch may be unplugged so ignore any errors */
tb_port_tmu_unidirectional_disable(up);
ret = tb_port_tmu_unidirectional_disable(down); if (ret) return ret; break;
case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
ret = disable_enhanced(up, down); if (ret) return ret; break;
/* Called only when there is failure enabling requested mode */ staticvoid tb_switch_tmu_off(struct tb_switch *sw)
{ unsignedint rate = tmu_rates[TB_SWITCH_TMU_MODE_OFF]; struct tb_port *down, *up;
down = tb_switch_downstream_port(sw);
up = tb_upstream_port(sw); /* *Incaseofanyfailureinoneofthestepswhensetting *bi-directionaloruni-directionalTMUmode,getbacktotheTMU *configurationsinoffmode.Incaseofadditionalfailuresin *thefunctionsbelow,ignorethemsincethecallershallalready *reportafailure.
*/
tb_port_tmu_time_sync_disable(down);
tb_port_tmu_time_sync_disable(up);
switch (sw->tmu.mode_request) { case TB_SWITCH_TMU_MODE_LOWRES: case TB_SWITCH_TMU_MODE_HIFI_UNI:
tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); break; case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
disable_enhanced(up, down); break; default: break;
}
/* Always set the rate to 0 */
tb_switch_tmu_rate_write(sw, rate);
up = tb_upstream_port(sw);
down = tb_switch_downstream_port(sw);
ret = tb_switch_tmu_rate_write(tb_switch_parent(sw),
tmu_rates[sw->tmu.mode_request]); if (ret) return ret;
ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); if (ret) return ret;
ret = tb_port_tmu_unidirectional_enable(up); if (ret) goto out;
ret = tb_port_tmu_time_sync_enable(up); if (ret) goto out;
ret = tb_port_tmu_unidirectional_enable(down); if (ret) goto out;
ret = tb_port_tmu_time_sync_enable(down); if (ret) goto out;
up = tb_upstream_port(sw);
down = tb_switch_downstream_port(sw);
/* Program the upstream router downstream facing lane adapter */ switch (sw->tmu.mode_request) { case TB_SWITCH_TMU_MODE_LOWRES: case TB_SWITCH_TMU_MODE_HIFI_UNI:
ret = tb_port_tmu_set_unidirectional(down, true); if (ret) goto out;
ret = tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); if (ret) goto out; break;
case TB_SWITCH_TMU_MODE_HIFI_BI:
ret = tb_port_tmu_set_unidirectional(down, false); if (ret) goto out;
ret = tb_switch_tmu_rate_write(sw, rate); if (ret) goto out; break;
default: /* Not allowed to change modes from other than above */ return -EINVAL;
}
ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); if (ret) goto out;
/* Program the new mode and the downstream router lane adapter */ switch (sw->tmu.mode_request) { case TB_SWITCH_TMU_MODE_LOWRES: case TB_SWITCH_TMU_MODE_HIFI_UNI:
ret = tb_port_tmu_set_unidirectional(up, true); if (ret) goto out; break;
case TB_SWITCH_TMU_MODE_HIFI_BI:
ret = tb_port_tmu_set_unidirectional(up, false); if (ret) goto out; break;
default: /* Not allowed to change modes from other than above */ return -EINVAL;
}
ret = tb_port_tmu_time_sync_enable(down); if (ret) goto out;
ret = tb_port_tmu_time_sync_enable(up); if (ret) goto out;
/** *tb_switch_tmu_enable()-EnableTMUonarouter *@sw:RouterwhoseTMUtoenable * *EnablesTMUofaroutertobeinuni-directionalNormal/HiFior *bi-directionalHiFimode.Callingtb_switch_tmu_configure()is *requiredbeforecallingthisfunction.
*/ int tb_switch_tmu_enable(struct tb_switch *sw)
{ int ret;
if (tb_switch_tmu_is_enabled(sw)) return0;
if (tb_switch_is_titan_ridge(sw) &&
(sw->tmu.mode_request == TB_SWITCH_TMU_MODE_LOWRES ||
sw->tmu.mode_request == TB_SWITCH_TMU_MODE_HIFI_UNI)) {
ret = tb_switch_tmu_disable_objections(sw); if (ret) return ret;
}
ret = tb_switch_tmu_set_time_disruption(sw, true); if (ret) return ret;
if (tb_route(sw)) { /* *TheusedmodechangesarefromOFFto *HiFi-Uni/HiFi-BiDir/Normal-UniorfromNormal-Unito *HiFi-Uni.
*/ if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) { switch (sw->tmu.mode_request) { case TB_SWITCH_TMU_MODE_LOWRES: case TB_SWITCH_TMU_MODE_HIFI_UNI:
ret = tb_switch_tmu_enable_unidirectional(sw); break;
case TB_SWITCH_TMU_MODE_HIFI_BI:
ret = tb_switch_tmu_enable_bidirectional(sw); break; case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI:
ret = tb_switch_tmu_enable_enhanced(sw); break; default:
ret = -EINVAL; break;
}
} elseif (sw->tmu.mode == TB_SWITCH_TMU_MODE_LOWRES ||
sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_UNI ||
sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_BI) {
ret = tb_switch_tmu_change_mode(sw);
} else {
ret = -EINVAL;
}
} else { /* *Hostrouterportconfigurationsarewrittenas *partofconfigurationsfordownstreamportoftheparent *ofthechildnode-seeabove. *Hereonlythehostrouter'rateconfigurationiswritten.
*/
ret = tb_switch_tmu_rate_write(sw, tmu_rates[sw->tmu.mode_request]);
}
if (ret) {
tb_sw_warn(sw, "TMU: failed to enable mode %s: %d\n",
tmu_mode_name(sw->tmu.mode_request), ret);
} else {
sw->tmu.mode = sw->tmu.mode_request;
tb_sw_dbg(sw, "TMU: mode set to: %s\n", tmu_mode_name(sw->tmu.mode));
}
case TB_SWITCH_TMU_MODE_LOWRES: case TB_SWITCH_TMU_MODE_HIFI_UNI: if (!sw->tmu.has_ucap) return -EOPNOTSUPP; break;
case TB_SWITCH_TMU_MODE_HIFI_BI: break;
case TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI: { conststruct tb_switch *parent_sw = tb_switch_parent(sw);
if (!parent_sw || !tb_switch_tmu_enhanced_is_supported(parent_sw)) return -EOPNOTSUPP; if (!tb_switch_tmu_enhanced_is_supported(sw)) return -EOPNOTSUPP;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.