Lines Matching full:sw
58 static bool tb_switch_tmu_enhanced_is_supported(const struct tb_switch *sw) in tb_switch_tmu_enhanced_is_supported() argument
60 return usb4_switch_version(sw) > 1; in tb_switch_tmu_enhanced_is_supported()
63 static int tb_switch_set_tmu_mode_params(struct tb_switch *sw, in tb_switch_set_tmu_mode_params() argument
72 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_set_tmu_mode_params()
73 sw->tmu.cap + TMU_RTR_CS_0, 1); in tb_switch_set_tmu_mode_params()
80 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, in tb_switch_set_tmu_mode_params()
81 sw->tmu.cap + TMU_RTR_CS_0, 1); in tb_switch_set_tmu_mode_params()
85 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_set_tmu_mode_params()
86 sw->tmu.cap + TMU_RTR_CS_15, 1); in tb_switch_set_tmu_mode_params()
99 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, in tb_switch_set_tmu_mode_params()
100 sw->tmu.cap + TMU_RTR_CS_15, 1); in tb_switch_set_tmu_mode_params()
104 if (tb_switch_tmu_enhanced_is_supported(sw)) { in tb_switch_set_tmu_mode_params()
107 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_set_tmu_mode_params()
108 sw->tmu.cap + TMU_RTR_CS_18, 1); in tb_switch_set_tmu_mode_params()
115 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, in tb_switch_set_tmu_mode_params()
116 sw->tmu.cap + TMU_RTR_CS_18, 1); in tb_switch_set_tmu_mode_params()
122 static bool tb_switch_tmu_ucap_is_supported(struct tb_switch *sw) in tb_switch_tmu_ucap_is_supported() argument
127 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_tmu_ucap_is_supported()
128 sw->tmu.cap + TMU_RTR_CS_0, 1); in tb_switch_tmu_ucap_is_supported()
135 static int tb_switch_tmu_rate_read(struct tb_switch *sw) in tb_switch_tmu_rate_read() argument
140 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_tmu_rate_read()
141 sw->tmu.cap + TMU_RTR_CS_3, 1); in tb_switch_tmu_rate_read()
149 static int tb_switch_tmu_rate_write(struct tb_switch *sw, int rate) in tb_switch_tmu_rate_write() argument
154 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_tmu_rate_write()
155 sw->tmu.cap + TMU_RTR_CS_3, 1); in tb_switch_tmu_rate_write()
162 return tb_sw_write(sw, &val, TB_CFG_SWITCH, in tb_switch_tmu_rate_write()
163 sw->tmu.cap + TMU_RTR_CS_3, 1); in tb_switch_tmu_rate_write()
188 if (!port->sw->tmu.has_ucap) in tb_port_tmu_set_unidirectional()
237 if (!tb_switch_tmu_enhanced_is_supported(port->sw)) in tb_port_tmu_enhanced_enable()
300 if (!tb_switch_tmu_enhanced_is_supported(port->sw)) in tb_port_tmu_rate_write()
332 static int tb_switch_tmu_set_time_disruption(struct tb_switch *sw, bool set) in tb_switch_tmu_set_time_disruption() argument
337 if (tb_switch_is_usb4(sw)) { in tb_switch_tmu_set_time_disruption()
338 offset = sw->tmu.cap + TMU_RTR_CS_0; in tb_switch_tmu_set_time_disruption()
341 offset = sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_26; in tb_switch_tmu_set_time_disruption()
345 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, offset, 1); in tb_switch_tmu_set_time_disruption()
354 return tb_sw_write(sw, &val, TB_CFG_SWITCH, offset, 1); in tb_switch_tmu_set_time_disruption()
357 static int tmu_mode_init(struct tb_switch *sw) in tmu_mode_init() argument
362 ucap = tb_switch_tmu_ucap_is_supported(sw); in tmu_mode_init()
364 tb_sw_dbg(sw, "TMU: supports uni-directional mode\n"); in tmu_mode_init()
365 enhanced = tb_switch_tmu_enhanced_is_supported(sw); in tmu_mode_init()
367 tb_sw_dbg(sw, "TMU: supports enhanced uni-directional mode\n"); in tmu_mode_init()
369 ret = tb_switch_tmu_rate_read(sw); in tmu_mode_init()
375 sw->tmu.mode = TB_SWITCH_TMU_MODE_OFF; in tmu_mode_init()
377 if (tb_route(sw)) { in tmu_mode_init()
378 struct tb_port *up = tb_upstream_port(sw); in tmu_mode_init()
381 sw->tmu.mode = TB_SWITCH_TMU_MODE_MEDRES_ENHANCED_UNI; in tmu_mode_init()
384 sw->tmu.mode = TB_SWITCH_TMU_MODE_LOWRES; in tmu_mode_init()
386 sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_UNI; in tmu_mode_init()
388 sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_BI; in tmu_mode_init()
391 sw->tmu.mode = TB_SWITCH_TMU_MODE_HIFI_BI; in tmu_mode_init()
395 sw->tmu.mode_request = sw->tmu.mode; in tmu_mode_init()
396 sw->tmu.has_ucap = ucap; in tmu_mode_init()
403 * @sw: Switch to be initialized
411 int tb_switch_tmu_init(struct tb_switch *sw) in tb_switch_tmu_init() argument
416 if (tb_switch_is_icm(sw)) in tb_switch_tmu_init()
419 ret = tb_switch_find_cap(sw, TB_SWITCH_CAP_TMU); in tb_switch_tmu_init()
421 sw->tmu.cap = ret; in tb_switch_tmu_init()
423 tb_switch_for_each_port(sw, port) { in tb_switch_tmu_init()
431 ret = tmu_mode_init(sw); in tb_switch_tmu_init()
435 tb_sw_dbg(sw, "TMU: current mode: %s\n", tmu_mode_name(sw->tmu.mode)); in tb_switch_tmu_init()
441 * @sw: Switch whose time to update
447 int tb_switch_tmu_post_time(struct tb_switch *sw) in tb_switch_tmu_post_time() argument
451 struct tb_switch *root_switch = sw->tb->root_switch; in tb_switch_tmu_post_time()
456 if (!tb_route(sw)) in tb_switch_tmu_post_time()
459 if (!tb_switch_is_usb4(sw)) in tb_switch_tmu_post_time()
484 ret = tb_switch_tmu_set_time_disruption(sw, true); in tb_switch_tmu_post_time()
488 post_local_time_offset = sw->tmu.cap + TMU_RTR_CS_22; in tb_switch_tmu_post_time()
489 post_time_offset = sw->tmu.cap + TMU_RTR_CS_24; in tb_switch_tmu_post_time()
490 post_time_high_offset = sw->tmu.cap + TMU_RTR_CS_25; in tb_switch_tmu_post_time()
496 ret = tb_sw_write(sw, &local_time, TB_CFG_SWITCH, in tb_switch_tmu_post_time()
511 ret = tb_sw_write(sw, &post_time, TB_CFG_SWITCH, post_time_offset, 2); in tb_switch_tmu_post_time()
515 ret = tb_sw_write(sw, &post_time_high, TB_CFG_SWITCH, in tb_switch_tmu_post_time()
522 ret = tb_sw_read(sw, &post_time, TB_CFG_SWITCH, in tb_switch_tmu_post_time()
533 tb_sw_dbg(sw, "TMU: updated local time to %#llx\n", local_time); in tb_switch_tmu_post_time()
536 tb_switch_tmu_set_time_disruption(sw, false); in tb_switch_tmu_post_time()
559 * @sw: Switch whose TMU to disable
561 * Turns off TMU of @sw if it is enabled. If not enabled does nothing.
565 int tb_switch_tmu_disable(struct tb_switch *sw) in tb_switch_tmu_disable() argument
568 if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) in tb_switch_tmu_disable()
571 if (tb_route(sw)) { in tb_switch_tmu_disable()
575 down = tb_switch_downstream_port(sw); in tb_switch_tmu_disable()
576 up = tb_upstream_port(sw); in tb_switch_tmu_disable()
588 ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]); in tb_switch_tmu_disable()
597 switch (sw->tmu.mode) { in tb_switch_tmu_disable()
617 tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_OFF]); in tb_switch_tmu_disable()
620 sw->tmu.mode = TB_SWITCH_TMU_MODE_OFF; in tb_switch_tmu_disable()
622 tb_sw_dbg(sw, "TMU: disabled\n"); in tb_switch_tmu_disable()
627 static void tb_switch_tmu_off(struct tb_switch *sw) in tb_switch_tmu_off() argument
632 down = tb_switch_downstream_port(sw); in tb_switch_tmu_off()
633 up = tb_upstream_port(sw); in tb_switch_tmu_off()
644 switch (sw->tmu.mode_request) { in tb_switch_tmu_off()
647 tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); in tb_switch_tmu_off()
657 tb_switch_tmu_rate_write(sw, rate); in tb_switch_tmu_off()
659 tb_switch_set_tmu_mode_params(sw, sw->tmu.mode); in tb_switch_tmu_off()
668 static int tb_switch_tmu_enable_bidirectional(struct tb_switch *sw) in tb_switch_tmu_enable_bidirectional() argument
673 up = tb_upstream_port(sw); in tb_switch_tmu_enable_bidirectional()
674 down = tb_switch_downstream_port(sw); in tb_switch_tmu_enable_bidirectional()
684 ret = tb_switch_tmu_rate_write(sw, tmu_rates[TB_SWITCH_TMU_MODE_HIFI_BI]); in tb_switch_tmu_enable_bidirectional()
699 tb_switch_tmu_off(sw); in tb_switch_tmu_enable_bidirectional()
704 static int tb_switch_tmu_disable_objections(struct tb_switch *sw) in tb_switch_tmu_disable_objections() argument
706 struct tb_port *up = tb_upstream_port(sw); in tb_switch_tmu_disable_objections()
710 ret = tb_sw_read(sw, &val, TB_CFG_SWITCH, in tb_switch_tmu_disable_objections()
711 sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1); in tb_switch_tmu_disable_objections()
717 ret = tb_sw_write(sw, &val, TB_CFG_SWITCH, in tb_switch_tmu_disable_objections()
718 sw->cap_vsec_tmu + TB_TIME_VSEC_3_CS_9, 1); in tb_switch_tmu_disable_objections()
732 static int tb_switch_tmu_enable_unidirectional(struct tb_switch *sw) in tb_switch_tmu_enable_unidirectional() argument
737 up = tb_upstream_port(sw); in tb_switch_tmu_enable_unidirectional()
738 down = tb_switch_downstream_port(sw); in tb_switch_tmu_enable_unidirectional()
739 ret = tb_switch_tmu_rate_write(tb_switch_parent(sw), in tb_switch_tmu_enable_unidirectional()
740 tmu_rates[sw->tmu.mode_request]); in tb_switch_tmu_enable_unidirectional()
744 ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); in tb_switch_tmu_enable_unidirectional()
767 tb_switch_tmu_off(sw); in tb_switch_tmu_enable_unidirectional()
775 static int tb_switch_tmu_enable_enhanced(struct tb_switch *sw) in tb_switch_tmu_enable_enhanced() argument
777 unsigned int rate = tmu_rates[sw->tmu.mode_request]; in tb_switch_tmu_enable_enhanced()
782 ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); in tb_switch_tmu_enable_enhanced()
786 up = tb_upstream_port(sw); in tb_switch_tmu_enable_enhanced()
787 down = tb_switch_downstream_port(sw); in tb_switch_tmu_enable_enhanced()
789 ret = tb_port_set_tmu_mode_params(up, sw->tmu.mode_request); in tb_switch_tmu_enable_enhanced()
801 ret = tb_port_set_tmu_mode_params(down, sw->tmu.mode_request); in tb_switch_tmu_enable_enhanced()
816 tb_switch_tmu_off(sw); in tb_switch_tmu_enable_enhanced()
820 static void tb_switch_tmu_change_mode_prev(struct tb_switch *sw) in tb_switch_tmu_change_mode_prev() argument
822 unsigned int rate = tmu_rates[sw->tmu.mode]; in tb_switch_tmu_change_mode_prev()
825 down = tb_switch_downstream_port(sw); in tb_switch_tmu_change_mode_prev()
826 up = tb_upstream_port(sw); in tb_switch_tmu_change_mode_prev()
833 switch (sw->tmu.mode) { in tb_switch_tmu_change_mode_prev()
837 tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); in tb_switch_tmu_change_mode_prev()
842 tb_switch_tmu_rate_write(sw, rate); in tb_switch_tmu_change_mode_prev()
849 tb_switch_set_tmu_mode_params(sw, sw->tmu.mode); in tb_switch_tmu_change_mode_prev()
851 switch (sw->tmu.mode) { in tb_switch_tmu_change_mode_prev()
866 static int tb_switch_tmu_change_mode(struct tb_switch *sw) in tb_switch_tmu_change_mode() argument
868 unsigned int rate = tmu_rates[sw->tmu.mode_request]; in tb_switch_tmu_change_mode()
872 up = tb_upstream_port(sw); in tb_switch_tmu_change_mode()
873 down = tb_switch_downstream_port(sw); in tb_switch_tmu_change_mode()
876 switch (sw->tmu.mode_request) { in tb_switch_tmu_change_mode()
882 ret = tb_switch_tmu_rate_write(tb_switch_parent(sw), rate); in tb_switch_tmu_change_mode()
891 ret = tb_switch_tmu_rate_write(sw, rate); in tb_switch_tmu_change_mode()
901 ret = tb_switch_set_tmu_mode_params(sw, sw->tmu.mode_request); in tb_switch_tmu_change_mode()
906 switch (sw->tmu.mode_request) { in tb_switch_tmu_change_mode()
936 tb_switch_tmu_change_mode_prev(sw); in tb_switch_tmu_change_mode()
942 * @sw: Router whose TMU to enable
950 int tb_switch_tmu_enable(struct tb_switch *sw) in tb_switch_tmu_enable() argument
954 if (tb_switch_tmu_is_enabled(sw)) in tb_switch_tmu_enable()
957 if (tb_switch_is_titan_ridge(sw) && in tb_switch_tmu_enable()
958 (sw->tmu.mode_request == TB_SWITCH_TMU_MODE_LOWRES || in tb_switch_tmu_enable()
959 sw->tmu.mode_request == TB_SWITCH_TMU_MODE_HIFI_UNI)) { in tb_switch_tmu_enable()
960 ret = tb_switch_tmu_disable_objections(sw); in tb_switch_tmu_enable()
965 ret = tb_switch_tmu_set_time_disruption(sw, true); in tb_switch_tmu_enable()
969 if (tb_route(sw)) { in tb_switch_tmu_enable()
975 if (sw->tmu.mode == TB_SWITCH_TMU_MODE_OFF) { in tb_switch_tmu_enable()
976 switch (sw->tmu.mode_request) { in tb_switch_tmu_enable()
979 ret = tb_switch_tmu_enable_unidirectional(sw); in tb_switch_tmu_enable()
983 ret = tb_switch_tmu_enable_bidirectional(sw); in tb_switch_tmu_enable()
986 ret = tb_switch_tmu_enable_enhanced(sw); in tb_switch_tmu_enable()
992 } else if (sw->tmu.mode == TB_SWITCH_TMU_MODE_LOWRES || in tb_switch_tmu_enable()
993 sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_UNI || in tb_switch_tmu_enable()
994 sw->tmu.mode == TB_SWITCH_TMU_MODE_HIFI_BI) { in tb_switch_tmu_enable()
995 ret = tb_switch_tmu_change_mode(sw); in tb_switch_tmu_enable()
1006 ret = tb_switch_tmu_rate_write(sw, tmu_rates[sw->tmu.mode_request]); in tb_switch_tmu_enable()
1010 tb_sw_warn(sw, "TMU: failed to enable mode %s: %d\n", in tb_switch_tmu_enable()
1011 tmu_mode_name(sw->tmu.mode_request), ret); in tb_switch_tmu_enable()
1013 sw->tmu.mode = sw->tmu.mode_request; in tb_switch_tmu_enable()
1014 tb_sw_dbg(sw, "TMU: mode set to: %s\n", tmu_mode_name(sw->tmu.mode)); in tb_switch_tmu_enable()
1017 return tb_switch_tmu_set_time_disruption(sw, false); in tb_switch_tmu_enable()
1022 * @sw: Router whose mode to change
1034 int tb_switch_tmu_configure(struct tb_switch *sw, enum tb_switch_tmu_mode mode) in tb_switch_tmu_configure() argument
1042 if (!sw->tmu.has_ucap) in tb_switch_tmu_configure()
1050 const struct tb_switch *parent_sw = tb_switch_parent(sw); in tb_switch_tmu_configure()
1054 if (!tb_switch_tmu_enhanced_is_supported(sw)) in tb_switch_tmu_configure()
1061 tb_sw_warn(sw, "TMU: unsupported mode %u\n", mode); in tb_switch_tmu_configure()
1065 if (sw->tmu.mode_request != mode) { in tb_switch_tmu_configure()
1066 tb_sw_dbg(sw, "TMU: mode change %s -> %s requested\n", in tb_switch_tmu_configure()
1067 tmu_mode_name(sw->tmu.mode), tmu_mode_name(mode)); in tb_switch_tmu_configure()
1068 sw->tmu.mode_request = mode; in tb_switch_tmu_configure()