usb4_switch_setup(9)
π usb4_switch_setup β the kernel API manual, bestie edition β¨
okay so real talk, this is a page out of the Kernel API Manual (usb4_switch_setup(9)), and honestly? it's a little guy with a big job. let's get into it π«Ά
πΈ NAME πΈ
usb4_switch_setup β the extra setup pass for a USB4 device, because apparently routers can't just show up and be ready, they need a whole glow-up first π
β¨ SYNOPSIS β¨
int usb4_switch_setup (struct tb_switch *sw );
π ARGUMENTS π
swβ the USB4 router we're setting up. that's the main character of this function, no cap π
π¦ DESCRIPTION π¦
so here's the tea: USB4 routers need additional settings before all the tunneling can actually happen. like, they're not gonna just tunnel on vibes alone. this function turns on USB tunneling and PCIe tunneling β but only if it can be enabled, iykyk. the "if it can" part matters: for example, the parent switch also has to support them.
and if USB tunneling just isn't available for some reason β say there's a Thunderbolt 3 switch upstream being a whole obstacle π β then the internal xHCI controller gets enabled instead. we pivot, we adapt, we slay differently πββοΈ
β οΈ important bestie: this does not set the configuration valid bit of the router. to do that, you gotta call usb4_switch_configuration_valid. don't skip that step, fr fr π
π RETURN π
0on success π- a negative errno otherwise π
π SEE ALSO π
the kernel file lives at ./drivers/thunderbolt/usb4.c, and here's the whole extended friend group β every single one, don't @ me, they all matter:
usb4_switch_check_wakes(9)usb4_switch_configuration_valid(9)usb4_switch_read_uid(9)usb4_switch_drom_read(9)usb4_switch_lane_bonding_possible(9)usb4_switch_set_wake(9)usb4_switch_set_sleep(9)usb4_switch_nvm_sector_size(9)usb4_switch_nvm_read(9)usb4_switch_nvm_set_offset(9)usb4_switch_nvm_write(9)usb4_switch_nvm_authenticate(9)usb4_switch_nvm_authenticate_status(9)usb4_switch_credits_init(9)usb4_switch_query_dp_resource(9)usb4_switch_alloc_dp_resource(9)usb4_switch_dealloc_dp_resource(9)usb4_port_index(9)usb4_switch_map_pcie_down(9)usb4_switch_map_usb3_down(9)usb4_switch_add_ports(9)usb4_switch_remove_ports(9)usb4_port_unlock(9)usb4_port_hotplug_enable(9)usb4_port_reset(9)usb4_port_configure(9)usb4_port_unconfigure(9)usb4_port_configure_xdomain(9)usb4_port_unconfigure_xdomain(9)usb4_port_sb_read(9)usb4_port_sb_write(9)usb4_port_router_offline(9)usb4_port_router_online(9)usb4_port_enumerate_retimers(9)usb4_port_clx_supported(9)usb4_port_asym_supported(9)usb4_port_asym_set_link_width(9)usb4_port_asym_start(9)usb4_port_margining_caps(9)usb4_port_hw_margin(9)usb4_port_sw_margin(9)usb4_port_sw_margin_errors(9)usb4_port_retimer_set_inbound_sbtx(9)usb4_port_retimer_unset_inbound_sbtx(9)usb4_port_retimer_is_last(9)usb4_port_retimer_is_cable(9)usb4_port_retimer_nvm_sector_size(9)usb4_port_retimer_nvm_set_offset(9)usb4_port_retimer_nvm_write(9)usb4_port_retimer_nvm_authenticate(9)usb4_port_retimer_nvm_authenticate_status(9)usb4_port_retimer_nvm_read(9)usb4_usb3_port_max_link_rate(9)usb4_usb3_port_allocated_bandwidth(9)usb4_usb3_port_allocate_bandwidth(9)usb4_usb3_port_release_bandwidth(9)usb4_dp_port_set_cm_id(9)usb4_dp_port_bandwidth_mode_supported(9)usb4_dp_port_bandwidth_mode_enabled(9)usb4_dp_port_set_cm_bandwidth_mode_supported(9)usb4_dp_port_group_id(9)usb4_dp_port_set_group_id(9)usb4_dp_port_nrd(9)usb4_dp_port_set_nrd(9)usb4_dp_port_granularity(9)usb4_dp_port_set_granularity(9)usb4_dp_port_set_estimated_bandwidth(9)usb4_dp_port_allocated_bandwidth(9)usb4_dp_port_allocate_bandwidth(9)usb4_dp_port_requested_bandwidth(9)usb4_pci_port_set_ext_encapsulation(9)usb4_pci_port_ltssm_state(9)
okay that's the whole page!! π this one comes from the source directory ./drivers/thunderbolt, dated October 2026, and it's filed under usb4_switch_setup(9) β go read the neighbors too, they're all icons in their own right π§ββοΈβ
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms