pci_find_ext_capability(9)

πŸ“¦ version 7.3.1, in nixpkgs unstable

πŸ’– pci_find_ext_capability(9) πŸ’–

okay so bestie, we're digging into the Linux Kernel API Manual today and this little function is literally the "hey do u have this feature?" bestie of the PCI world. it's pci_find_ext_capability, and it's about to find an extended capability for u. slay.


✨ SYNOPSIS ✨

u16 pci_find_ext_capability (struct pci_dev *dev , int cap );

like, that's the whole vibe. two args, one u16 out. no cap.


🫢 ARGUMENTS 🫢

  • dev β€” the PCI device ur querying πŸ’… this is the main character, the one we're asking about
  • cap β€” the capability code, aka the thing we want to know if dev has

πŸ¦‹ DESCRIPTION πŸ¦‹

so here's the tea: this function returns the address of the requested extended capability structure inside the device's PCI configuration space. and if the device doesn't support it? it just returns 0. no drama, no error code rant, just a polite zero. 😭

the possible values for cap are, and i quote the vibes exactly:

  • PCI_EXT_CAP_ID_ERR β€” Advanced Error Reporting
  • PCI_EXT_CAP_ID_VC β€” Virtual Channel
  • PCI_EXT_CAP_ID_DSN β€” Device Serial Number
  • PCI_EXT_CAP_ID_PWR β€” Power Budgeting
fr fr bestie β€” 0 means "not supported", so don't go treating it as a valid address. vibe check ur return value before u dereference anything πŸ‘‘

πŸŽ€ SEE ALSO πŸŽ€

okay so this is the part where the manpage just goes feral with the cross-references, and honestly? iconic. first up, the kernel file it lives in: ./drivers/pci/pci.c.

and now, the whole entire friend group (yes, all of them, no skipping, i love a complete list):

pci_bus_max_busnr(9), pci_status_get_and_clear_errors(9), pci_dev_str_match_path(9), pci_dev_str_match(9), pci_find_capability(9), pci_bus_find_capability(9), pci_find_next_ext_capability(9), pci_get_dsn(9), pci_find_next_ht_capability(9), pci_find_ht_capability(9), pci_find_vsec_capability(9), pci_find_dvsec_capability(9), pci_find_parent_resource(9), pci_find_resource(9), pci_resource_name(9), pci_wait_for_pending(9), pci_request_acs(9), pci_std_enable_acs(9), pci_enable_acs(9), pci_restore_bars(9), pci_update_current_state(9), pci_refresh_power_state(9), pci_platform_power_transition(9), pci_resume_bus(9), pci_power_up(9), pci_set_full_power_state(9), __pci_dev_set_current_state(9), pci_bus_set_current_state(9), pci_set_low_power_state(9), pci_set_power_state(9), pci_save_state(9), pci_restore_state(9), pci_store_saved_state(9), pci_load_saved_state(9), pci_load_and_free_saved_state(9), pci_reenable_device(9), pci_enable_device_mem(9), pci_enable_device(9), pcibios_release_device(9), pcibios_disable_device(9), pci_disable_enabled_device(9), pci_disable_device(9), pcibios_set_pcie_reset_state(9), pci_set_pcie_reset_state(9), pcie_clear_root_pme_status(9), pci_check_pme_status(9), pci_pme_wakeup(9), pci_pme_wakeup_bus(9), pci_pme_capable(9), pci_pme_restore(9), pci_pme_active(9), __pci_enable_wake(9), pci_enable_wake(9), pci_wake_from_d3(9), pci_target_state(9), pci_prepare_to_sleep(9), pci_back_from_sleep(9), pci_finish_runtime_suspend(9), pci_dev_run_wake(9), pci_dev_need_resume(9), pci_dev_adjust_pme(9), pci_dev_complete_resume(9), pci_choose_state(9), pci_suspend_retains_context(9), pci_bridge_d3_possible(9), pci_d3cold_enable(9), pci_d3cold_disable(9), pci_pm_init(9), _pci_add_cap_save_buffer(9), pci_allocate_cap_save_buffers(9), pci_configure_ari(9), pci_acs_enabled(9), pci_acs_path_enabled(9), pci_acs_init(9), pci_enable_atomic_ops_to_root(9), pci_release_region(9), __pci_request_region(9), pci_request_region(9), pci_release_selected_regions(9), pci_request_selected_regions(9), pci_request_selected_regions_exclusive(9), pci_release_regions(9), pci_request_regions(9), pci_request_regions_exclusive(9), pci_remap_iospace(9), pci_unmap_iospace(9), pcibios_setup(9), pcibios_set_master(9), pci_set_master(9), pci_clear_master(9), pci_set_cacheline_size(9), pci_set_mwi(9), pci_try_set_mwi(9), pci_clear_mwi(9), pci_disable_parity(9), pci_intx(9), pci_wait_for_pending_transaction(9), pcie_flr(9), pcie_reset_flr(9), pci_pm_reset(9), pcie_wait_for_link_status(9), pcie_retrain_link(9), pcie_wait_for_link_delay(9), pcie_wait_for_link(9), pci_bridge_wait_for_secondary_bus(9), pci_bridge_secondary_bus_reset(9), __pci_reset_function_locked(9), pci_init_reset_methods(9), pci_reset_function(9), pci_reset_function_locked(9), pci_try_reset_function(9), pci_probe_reset_slot(9), pci_try_reset_slot(9), pci_try_reset_bus(9), pci_reset_bridge(9), pci_bus_error_reset(9), pci_probe_reset_bus(9), pci_reset_bus(9), pcix_get_max_mmrbc(9), pcix_get_mmrbc(9), pcix_set_mmrbc(9), pcie_get_readrq(9), pcie_set_readrq(9), pcie_get_mps(9), pcie_set_mps(9), pcie_bandwidth_available(9), pcie_get_supported_speeds(9), pcie_get_speed_cap(9), pcie_get_width_cap(9), pcie_bandwidth_capable(9), __pcie_print_link_status(9), pcie_print_link_status(9), pci_select_bars(9), pci_set_vga_state(9), pci_add_dma_alias(9), pci_real_dma_dev(9), pci_specified_resource_alignment(9), pci_bus_find_emul_domain_nr(9), pci_ext_cfg_avail(9)


and that's the whole page bestie!! go find those extended capabilities, u absolute icon πŸ’œ

🌸 this one's straight outta ./drivers/pci, stamped October 2026, and yes the section header still says pci_find_ext_capability(9) like a little name tag at the end πŸŽ€ iykyk. byeee πŸ¦‹

πŸ“¦ where this page comes from