stmmac_tso_xmit(9)
π stmmac_tso_xmit(9) β the Kernel API Manual, bestie edition β¨
okay so real quick housekeeping: this whole page lives in the Kernel API Manual section 9, and the star of the show is stmmac_tso_xmit. buckle up π
πΈ NAME πΈ
stmmac_tso_xmit β literally the Tx entry point of the driver for oversized frames (aka TSO). that's it, that's the vibe π
β¨ SYNOPSIS β¨
netdev_tx_t stmmac_tso_xmit (struct sk_buff *skb , struct net_device *dev );
π¦ ARGUMENTS π¦
skbβ the socket buffer πdevβ device pointer π«Ά
π DESCRIPTION π
so this is the transmit function that gets called on TSO frames (support is available on GMAC4 and newer chips, no cap π ). the diagram below shows the ring programming when we're dealing with TSO frames β it's giving very much "words of affirmation" but for descriptors:
First Descriptor --------
| DES0 |---> buffer1 = L2/L3/L4 header
| DES1 |---> can be used as buffer2 for TCP Payload if the DMA AXI address
| | width is 32-bit, but we never use it.
| | Also can be used as the most-significant 8-bits or 16-bits of
| | buffer1 address pointer if the DMA AXI address width is 40-bit
| | or 48-bit, and we always use it.
| DES2 |---> buffer1 len
| DES3 |---> must set TSE, TCP hdr len-> [22:19]. TCP payload len [17:0]
--------
--------
| DES0 |---> buffer1 = TCP Payload (can continue on next descr...)
| DES1 |---> same as the First Descriptor
| DES2 |---> buffer1 len
| DES3 |
--------
| ...
--------
| DES0 |---> buffer1 = Split TCP Payload
| DES1 |---> same as the First Descriptor
| DES2 |---> buffer1 len
| DES3 |
--------
let me walk you through it, bestie π
π the First Descriptor
DES0points atbuffer1 = L2/L3/L4 headerβ the header girlies go here first.DES1is the flexible one, and it's a whole personality trait:- it can be used as
buffer2for the TCP Payload if the DMA AXI address width is 32-bit β but we literally never use it that way. not once. π - it also can be used as the most-significant 8-bits or 16-bits of the
buffer1address pointer if the DMA AXI address width is 40-bit or 48-bit β and this one? we always use it. main character energy β
- it can be used as
DES2βbuffer1 lenDES3β you must set TSE, plusTCP hdr lenin bits[22:19]andTCP payload lenin bits[17:0]. get those bit ranges right or it's over for you π
π§ the payload descriptors
DES0βbuffer1 = TCP Payload(and yes, it can continue on the next descr...)DES1β same as the First DescriptorDES2βbuffer1 lenDES3β (nothing called out here!)
then it keeps going with | ... | and you hit the last shape:
DES0βbuffer1 = Split TCP PayloadDES1β same as the First DescriptorDES2βbuffer1 lenDES3β (again, nothing called out)
lowkey important: mss is fixed when you enable tso, so you're doing all this w/o programming the TDES3 ctx field. write that down π
π₯ SEE ALSO π₯
the kernel file this lives in, bestie: ./drivers/net/ethernet/stmicro/stmmac/stmmac_main.c π
and honestly the whole extended friend group, in the exact order the page gives them:
stmmac_set_clk_tx_rate(9), stmmac_axi_blen_to_mask(9), stmmac_verify_args(9), stmmac_disable_all_queues(9), stmmac_enable_all_queues(9), stmmac_rx_dirty(9), stmmac_try_to_start_sw_lpi(9), stmmac_stop_sw_lpi(9), stmmac_eee_ctrl_timer(9), stmmac_hwtstamp_set(9), stmmac_hwtstamp_get(9), stmmac_init_tstamp_counter(9), stmmac_init_timestamping(9), stmmac_mac_flow_ctrl(9), stmmac_check_pcs_mode(9), stmmac_init_phy(9), stmmac_clear_rx_descriptors(9), stmmac_clear_tx_descriptors(9), stmmac_clear_descriptors(9), stmmac_init_rx_buffers(9), stmmac_free_rx_buffer(9), stmmac_free_tx_buffer(9), dma_free_rx_skbufs(9), dma_free_rx_xskbufs(9), __init_dma_rx_desc_rings(9), __init_dma_tx_desc_rings(9), init_dma_desc_rings(9), dma_free_tx_skbufs(9), stmmac_free_tx_skbufs(9), __free_dma_rx_desc_resources(9), __free_dma_tx_desc_resources(9), __alloc_dma_rx_desc_resources(9), __alloc_dma_tx_desc_resources(9), alloc_dma_desc_resources(9), free_dma_desc_resources(9), stmmac_mac_enable_rx_queues(9), stmmac_start_rx_dma(9), stmmac_start_tx_dma(9), stmmac_stop_rx_dma(9), stmmac_stop_tx_dma(9), stmmac_start_all_dma(9), stmmac_stop_all_dma(9), stmmac_dma_operation_mode(9), stmmac_tx_clean(9), stmmac_tx_err(9), stmmac_set_dma_operation_mode(9), stmmac_dma_interrupt(9), stmmac_mmc_setup(9), stmmac_get_hw_features(9), stmmac_check_ether_addr(9), stmmac_init_dma_engine(9), stmmac_tx_timer(9), stmmac_init_coalesce(9), stmmac_set_tx_queue_weight(9), stmmac_configure_cbs(9), stmmac_rx_queue_dma_chan_map(9), stmmac_mac_config_rx_queues_prio(9), stmmac_mac_config_tx_queues_prio(9), stmmac_mac_config_rx_queues_routing(9), stmmac_mtl_configuration(9), stmmac_hw_setup(9), stmmac_setup_dma_desc(9), __stmmac_open(9), stmmac_release(9), stmmac_tso_allocator(9), stmmac_has_ip_ethertype(9), stmmac_xmit(9), stmmac_rx_refill(9), stmmac_rx(9), stmmac_tx_timeout(9), stmmac_set_rx_mode(9), stmmac_change_mtu(9), stmmac_interrupt(9), stmmac_ioctl(9), stmmac_hw_init(9), stmmac_dvr_probe(9), stmmac_dvr_remove(9), stmmac_suspend(9), stmmac_reset_queues_param(9), stmmac_resume(9)
okay that's the whole page, you ate that π«Ά and for the credits portion of the group chat: the source path is ./drivers/net/ethernet/stmicro..., this edition is dated October 2026, and the whole thing is filed under stmmac_tso_xmit(9). slay, go program some descriptors π
β¨πΈ
π¦ 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