€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”ŒA/translations/zh_CN/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒA/translations/zh_TW/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒA/translations/it_IT/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒA/translations/ja_JP/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒA/translations/ko_KR/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒA/translations/pt_BR/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”ŒA/translations/sp_SP/networking/device_drivers/ethernet/amazon/ena”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³Œ[/var/lib/git/docbuild/linux/Documentation/networking/device_drivers/ethernet/amazon/ena.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ”h]”hŒ,ena-mgmnt@pci:”…”�”}”hj¢ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j  h³hÇh´Kµhje h²hubhï)�”}”(hŒ0and for each queue pair, an interrupt is named::”h]”hŒ/and for each queue pair, an interrupt is named:”…”�”}”(hj° h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K·hje h²hubj¡ )�”}”(hŒ$-Tx-Rx-”h]”hŒ$-Tx-Rx-”…”�”}”hj¾ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j  h³hÇh´K¹hje h²hubhï)�”}”(hXThe ENA device operates in auto-mask and auto-clear interrupt modes. That is, once MSI-X is delivered to the host, its Cause bit is automatically cleared and the interrupt is masked. The interrupt is unmasked by the driver after NAPI processing is complete.”h]”hXThe ENA device operates in auto-mask and auto-clear interrupt modes. That is, once MSI-X is delivered to the host, its Cause bit is automatically cleared and the interrupt is masked. The interrupt is unmasked by the driver after NAPI processing is complete.”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´K»hje h²hubeh}”(h]”Œinterrupt-modes”ah ]”h"]”Œinterrupt modes”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K§ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒInterrupt Moderation”h]”hŒInterrupt Moderation”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjâ h²hh³hÇh´KÁubhï)�”}”(hŒXENA driver and device can operate in conventional or adaptive interrupt moderation mode.”h]”hŒXENA driver and device can operate in conventional or adaptive interrupt moderation mode.”…”�”}”(hjó h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÃhjâ h²hubhï)�”}”(hX**In conventional mode** the driver instructs device to postpone interrupt posting according to static interrupt delay value. The interrupt delay value can be configured through `ethtool(8)`. The following `ethtool` parameters are supported by the driver: ``tx-usecs``, ``rx-usecs``”h]”(jÑ)�”}”(hŒ**In conventional mode**”h]”hŒIn conventional mode”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhj ubhŒš the driver instructs device to postpone interrupt posting according to static interrupt delay value. The interrupt delay value can be configured through ”…”�”}”(hj h²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `ethtool(8)`”h]”hŒ ethtool(8)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj ubhŒ. The following ”…”�”}”(hj h²hh³Nh´Nubj )�”}”(hŒ `ethtool`”h]”hŒethtool”…”�”}”(hj+ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj ubhŒ) parameters are supported by the driver: ”…”�”}”(hj h²hh³Nh´NubhŒliteral”“”)�”}”(hŒ ``tx-usecs``”h]”hŒtx-usecs”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj ubhŒ, ”…”�”}”(hj h²hh³Nh´Nubj> )�”}”(hŒ ``rx-usecs``”h]”hŒrx-usecs”…”�”}”(hjQ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÆhjâ h²hubhï)�”}”(hŒ§**In adaptive interrupt** moderation mode the interrupt delay value is updated by the driver dynamically and adjusted every NAPI cycle according to the traffic nature.”h]”(jÑ)�”}”(hŒ**In adaptive interrupt**”h]”hŒIn adaptive interrupt”…”�”}”(hji h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhje ubhŒŽ moderation mode the interrupt delay value is updated by the driver dynamically and adjusted every NAPI cycle according to the traffic nature.”…”�”}”(hje h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KËhjâ h²hubhï)�”}”(hŒgAdaptive coalescing can be switched on/off through `ethtool(8)`'s :code:`adaptive_rx on|off` parameter.”h]”(hŒ3Adaptive coalescing can be switched on/off through ”…”�”}”(hj� h²hh³Nh´Nubj )�”}”(hŒ `ethtool(8)`”h]”hŒ ethtool(8)”…”�”}”(hj‰ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj� ubhŒ’s ”…”�”}”(hj� h²hh³Nh´Nubj> )�”}”(hŒ:code:`adaptive_rx on|off`”h]”hŒadaptive_rx on|off”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”Œcode”ah"]”h$]”h&]”Œlanguage”huh1j= hj� ubhŒ parameter.”…”�”}”(hj� h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÏhjâ h²hubhï)�”}”(hŒoMore information about Adaptive Interrupt Moderation (DIM) can be found in Documentation/networking/net_dim.rst”h]”hŒoMore information about Adaptive Interrupt Moderation (DIM) can be found in Documentation/networking/net_dim.rst”…”�”}”(hjµ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÒhjâ h²hubhŒtarget”“”)�”}”(hŒ.. _`RX copybreak`:”h]”h}”(h]”h ]”h"]”h$]”h&]”jÿŒ rx-copybreak”uh1jà h´KÕhjâ h²hh³hÇŒ referenced”Kubeh}”(h]”Œinterrupt-moderation”ah ]”h"]”Œinterrupt moderation”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KÁubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ RX copybreak”h]”hŒ RX copybreak”…”�”}”(hjÜ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÙ h²hh³hÇh´KØubhï)�”}”(hŒ–The rx_copybreak is initialized by default to ENA_DEFAULT_RX_COPYBREAK and can be configured by the ETHTOOL_STUNABLE command of the SIOCETHTOOL ioctl.”h]”hŒ–The rx_copybreak is initialized by default to ENA_DEFAULT_RX_COPYBREAK and can be configured by the ETHTOOL_STUNABLE command of the SIOCETHTOOL ioctl.”…”�”}”(hjê h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÚhjÙ h²hubhï)�”}”(hŒúThis option controls the maximum packet length for which the RX descriptor it was received on would be recycled. When a packet smaller than RX copybreak bytes is received, it is copied into a new memory buffer and the RX descriptor is returned to HW.”h]”hŒúThis option controls the maximum packet length for which the RX descriptor it was received on would be recycled. When a packet smaller than RX copybreak bytes is received, it is copied into a new memory buffer and the RX descriptor is returned to HW.”…”�”}”(hjø h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´KÞhjÙ h²hubjÄ )�”}”(hŒ .. _`PHC`:”h]”h}”(h]”h ]”h"]”h$]”h&]”jÿjuh1jà h´KãhjÙ h²hh³hÇjÐ Kubeh}”(h]”(jÏ Œid1”eh ]”h"]”Œ rx copybreak”ah$]”Œ rx copybreak”ah&]”uh1hÈhhÊh²hh³hÇh´KØjÐ KŒexpect_referenced_by_name”}”j jÅ sŒexpect_referenced_by_id”}”jÏ jÅ subhÉ)�”}”(hhh]”(hÎ)�”}”(hŒPTP Hardware Clock (PHC)”h]”hŒPTP Hardware Clock (PHC)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj h²hh³hÇh´KæubjÄ )�”}”(hŒf.. _`ptp-userspace-api`: https://docs.kernel.org/driver-api/ptp.html#ptp-hardware-clock-user-space-api”h]”h}”(h]”Œptp-userspace-api”ah ]”h"]”Œptp-userspace-api”ah$]”h&]”Œrefuri”ŒMhttps://docs.kernel.org/driver-api/ptp.html#ptp-hardware-clock-user-space-api”uh1jà h´Kçhj h²hh³hÇjÐ KubjÄ )�”}”(hŒc.. _`testptp`: https://elixir.bootlin.com/linux/latest/source/tools/testing/selftests/ptp/testptp.c”h]”h}”(h]”Œtestptp”ah ]”h"]”Œtestptp”ah$]”h&]”j: ŒThttps://elixir.bootlin.com/linux/latest/source/tools/testing/selftests/ptp/testptp.c”uh1jà h´Kèhj h²hh³hÇjÐ Kubhï)�”}”(hŒlENA Linux driver supports PTP hardware clock providing timestamp reference to achieve nanosecond resolution.”h]”hŒlENA Linux driver supports PTP hardware clock providing timestamp reference to achieve nanosecond resolution.”…”�”}”(hjI h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kêhj h²hubhï)�”}”(hŒ**PHC support**”h]”jÑ)�”}”(hjY h]”hŒ PHC support”…”�”}”(hj[ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjW ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kìhj h²hubhï)�”}”(hŒgPHC depends on the PTP module, which needs to be either loaded as a module or compiled into the kernel.”h]”hŒgPHC depends on the PTP module, which needs to be either loaded as a module or compiled into the kernel.”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kîhj h²hubhï)�”}”(hŒ$Verify if the PTP module is present:”h]”hŒ$Verify if the PTP module is present:”…”�”}”(hj| h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kðhj h²hubj¡ )�”}”(hŒ=grep -w '^CONFIG_PTP_1588_CLOCK=[ym]' /boot/config-`uname -r`”h]”hŒ=grep -w '^CONFIG_PTP_1588_CLOCK=[ym]' /boot/config-`uname -r`”…”�”}”hjŠ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆŒforce”‰Œlanguage”Œshell”Œhighlight_args”}”uh1j  h³hÇh´Kòhj h²hubjÁ)�”}”(hhh]”jÆ)�”}”(hŒLIf no output is provided, the ENA driver cannot be loaded with PHC support. ”h]”hï)�”}”(hŒKIf no output is provided, the ENA driver cannot be loaded with PHC support.”h]”hŒKIf no output is provided, the ENA driver cannot be loaded with PHC support.”…”�”}”(hj¤ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Köhj  ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj� h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´Köhj h²hubhï)�”}”(hŒ**PHC activation**”h]”jÑ)�”}”(hjÀ h]”hŒPHC activation”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhj¾ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Køhj h²hubhï)�”}”(hŒyThe feature is turned off by default, in order to turn the feature on, the ENA driver can be loaded in the following way:”h]”hŒyThe feature is turned off by default, in order to turn the feature on, the ENA driver can be loaded in the following way:”…”�”}”(hjÕ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kúhj h²hubjÁ)�”}”(hhh]”jÆ)�”}”(hŒ devlink: ”h]”hï)�”}”(hŒdevlink:”h]”hŒdevlink:”…”�”}”(hjê h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Kýhjæ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjã h²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´Kýhj h²hubj¡ )�”}”(hX,sudo devlink dev param set pci/ name enable_phc value true cmode driverinit sudo devlink dev reload pci/ # for example: sudo devlink dev param set pci/0000:00:06.0 name enable_phc value true cmode driverinit sudo devlink dev reload pci/0000:00:06.0”h]”hX,sudo devlink dev param set pci/ name enable_phc value true cmode driverinit sudo devlink dev reload pci/ # for example: sudo devlink dev param set pci/0000:00:06.0 name enable_phc value true cmode driverinit sudo devlink dev reload pci/0000:00:06.0”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj˜ ‰j™ Œshell”j› }”uh1j  h³hÇh´Kÿhj h²hubhï)�”}”(hŒ4All available PTP clock sources can be tracked here:”h]”hŒ4All available PTP clock sources can be tracked here:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj h²hubj¡ )�”}”(hŒls /sys/class/ptp”h]”hŒls /sys/class/ptp”…”�”}”hj" sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj˜ ‰j™ Œshell”j› }”uh1j  h³hÇh´M hj h²hubhï)�”}”(hŒ;PHC support and capabilities can be verified using ethtool:”h]”hŒ;PHC support and capabilities can be verified using ethtool:”…”�”}”(hj2 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M hj h²hubj¡ )�”}”(hŒethtool -T ”h]”hŒethtool -T ”…”�”}”hj@ sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj˜ ‰j™ Œshell”j› }”uh1j  h³hÇh´Mhj h²hubhï)�”}”(hŒ**PHC timestamp**”h]”jÑ)�”}”(hjR h]”hŒ PHC timestamp”…”�”}”(hjT h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjP ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj h²hubhï)�”}”(hŒTTo retrieve PHC timestamp, use `ptp-userspace-api`_, usage example using `testptp`_:”h]”(hŒTo retrieve PHC timestamp, use ”…”�”}”(hjg h²hh³Nh´Nubjî)�”}”(hŒ`ptp-userspace-api`_”h]”hŒptp-userspace-api”…”�”}”(hjo h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œptp-userspace-api”j: j; uh1jíhjg jKubhŒ, usage example using ”…”�”}”(hjg h²hh³Nh´Nubjî)�”}”(hŒ `testptp`_”h]”hŒtestptp”…”�”}”(hjƒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œtestptp”j: jH uh1jíhjg jKubhŒ:”…”�”}”(hjg h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj h²hubj¡ )�”}”(hŒ[testptp -d /dev/ptp$(ethtool -T | awk '/PTP Hardware Clock:/ {print $NF}') -k 1”h]”hŒ[testptp -d /dev/ptp$(ethtool -T | awk '/PTP Hardware Clock:/ {print $NF}') -k 1”…”�”}”hj� sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj˜ ‰j™ Œshell”j› }”uh1j  h³hÇh´Mhj h²hubhï)�”}”(hX]PHC get time requests should be within reasonable bounds, avoid excessive utilization to ensure optimal performance and efficiency. The ENA device restricts the frequency of PHC get time requests to a maximum of 125 requests per second. If this limit is surpassed, the get time request will fail, leading to an increment in the phc_err_ts statistic.”h]”hX]PHC get time requests should be within reasonable bounds, avoid excessive utilization to ensure optimal performance and efficiency. The ENA device restricts the frequency of PHC get time requests to a maximum of 125 requests per second. If this limit is surpassed, the get time request will fail, leading to an increment in the phc_err_ts statistic.”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mhj h²hubhï)�”}”(hŒ**PHC statistics**”h]”jÑ)�”}”(hj½ h]”hŒPHC statistics”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhj» ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M!hj h²hubhï)�”}”(hŒ0PHC can be monitored using debugfs (if mounted):”h]”hŒ0PHC can be monitored using debugfs (if mounted):”…”�”}”(hjÒ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M#hj h²hubj¡ )�”}”(hŒ�sudo cat /sys/kernel/debug//phc_stats # for example: sudo cat /sys/kernel/debug/0000:00:06.0/phc_stats”h]”hŒ�sudo cat /sys/kernel/debug//phc_stats # for example: sudo cat /sys/kernel/debug/0000:00:06.0/phc_stats”…”�”}”hjà sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj˜ ‰j™ Œshell”j› }”uh1j  h³hÇh´M%hj h²hubhï)�”}”(hŒmPHC errors must remain below 1% of all PHC requests to maintain the desired level of accuracy and reliability”h]”hŒmPHC errors must remain below 1% of all PHC requests to maintain the desired level of accuracy and reliability”…”�”}”(hjð h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M,hj h²hubjz)�”}”(hhh]”j)�”}”(hhh]”(j„)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jƒhj ubj„)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”K[uh1jƒhj ubjš)�”}”(hhh]”(jŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ **phc_cnt**”h]”jÑ)�”}”(hj# h]”hŒphc_cnt”…”�”}”(hj% h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhj! ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M/hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj ubj¤)�”}”(hhh]”hŒ line_block”“”)�”}”(hhh]”hh´“”)�”}”(hŒANumber of successful retrieved timestamps (below expire timeout).”h]”hŒANumber of successful retrieved timestamps (below expire timeout).”…”�”}”(hjG h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´Œindent”KhjC h³hÇh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1jA hj> ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhj ubjŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ **phc_exp**”h]”jÑ)�”}”(hjp h]”hŒphc_exp”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjn ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M0hjk ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjh ubj¤)�”}”(hhh]”jB )�”}”(hhh]”jF )�”}”(hŒ>Number of expired retrieved timestamps (above expire timeout).”h]”hŒ>Number of expired retrieved timestamps (above expire timeout).”…”�”}”(hj‘ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU KhjŽ h³hÇh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1jA hj‹ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjh ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhj ubjŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ **phc_skp**”h]”jÑ)�”}”(hj¹ h]”hŒphc_skp”…”�”}”(hj» h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhj· ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M1hj´ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj± ubj¤)�”}”(hhh]”jB )�”}”(hhh]”jF )�”}”(hŒ:Number of skipped get time attempts (during block period).”h]”hŒ:Number of skipped get time attempts (during block period).”…”�”}”(hjÚ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU Khj× h³hÇh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1jA hjÔ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj± ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhj ubjŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ**phc_err_dv**”h]”jÑ)�”}”(hjh]”hŒ phc_err_dv”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M2hjý ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjú ubj¤)�”}”(hhh]”jB )�”}”(hhh]”jF )�”}”(hŒTNumber of failed get time attempts due to device errors (entering into block state).”h]”hŒTNumber of failed get time attempts due to device errors (entering into block state).”…”�”}”(hj#h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU Khj h³hÇh´Kubah}”(h]”h ]”h"]”h$]”h&]”uh1jA hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjú ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhj ubjŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ**phc_err_ts**”h]”jÑ)�”}”(hjKh]”hŒ phc_err_ts”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjIubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M3hjFubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjCubj¤)�”}”(hhh]”jB )�”}”(hhh]”(jF )�”}”(hŒWNumber of failed get time attempts due to timestamp errors (entering into block state),”h]”hŒWNumber of failed get time attempts due to timestamp errors (entering into block state),”…”�”}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU Khjih³hÇh´KubjF )�”}”(hŒYThis occurs if driver exceeded the request limit or device received an invalid timestamp.”h]”hŒYThis occurs if driver exceeded the request limit or device received an invalid timestamp.”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU Khjih³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jA hjfubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjCubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j™hj ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j~hjþ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyhj h²hh³Nh´Nubhï)�”}”(hŒ PHC timeouts:”h]”hŒ PHC timeouts:”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M7hj h²hubjz)�”}”(hhh]”j)�”}”(hhh]”(j„)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jƒhj¾ubj„)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”KLuh1jƒhj¾ubjš)�”}”(hhh]”(jŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ **expire**”h]”jÑ)�”}”(hjàh]”hŒexpire”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M:hjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjØubj¤)�”}”(hhh]”jB )�”}”(hhh]”(jF )�”}”(hŒJMax time for a valid timestamp retrieval, passing this threshold will fail”h]”hŒJMax time for a valid timestamp retrieval, passing this threshold will fail”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU Khjþh³hÇh´KubjF )�”}”(hŒ@the get time request and block new requests until block timeout.”h]”hŒ@the get time request and block new requests until block timeout.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU Khjþh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jA hjûubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hjØubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhjÕubjŸ)�”}”(hhh]”(j¤)�”}”(hhh]”hï)�”}”(hŒ **block**”h]”jÑ)�”}”(hj7h]”hŒblock”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÐhj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M<hj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj/ubj¤)�”}”(hhh]”jB )�”}”(hhh]”(jF )�”}”(hŒ>Blocking period starts once get time request expires or fails,”h]”hŒ>Blocking period starts once get time request expires or fails,”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU KhjUh³hÇh´KubjF )�”}”(hŒ:all get time requests during block period will be skipped.”h]”hŒ:all get time requests during block period will be skipped.”…”�”}”(hjfh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1h´jU KhjUh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”uh1jA hjRubah}”(h]”h ]”h"]”h$]”h&]”uh1j£hj/ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jžhjÕubeh}”(h]”h ]”h"]”h$]”h&]”uh1j™hj¾ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j~hj»ubah}”(h]”h ]”h"]”h$]”h&]”uh1jyhj h²hh³Nh´Nubeh}”(h]”(Œptp-hardware-clock-phc”jeh ]”h"]”(Œptp hardware clock (phc)”Œphc”eh$]”h&]”uh1hÈhhÊh²hh³hÇh´Kæj }”jŸj sj }”jj sjÐ KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Statistics”h]”hŒ Statistics”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj¤h²hh³hÇh´MAubhï)�”}”(hŒ¨The user can obtain ENA device and driver statistics using `ethtool`. The driver can collect regular or extended statistics (including per-queue stats) from the device.”h]”(hŒ;The user can obtain ENA device and driver statistics using ”…”�”}”(hjµh²hh³Nh´Nubj )�”}”(hŒ `ethtool`”h]”hŒethtool”…”�”}”(hj½h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjµubhŒd. The driver can collect regular or extended statistics (including per-queue stats) from the device.”…”�”}”(hjµh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MChj¤h²hubhï)�”}”(hŒBIn addition the driver logs the stats to syslog upon device reset.”h]”hŒBIn addition the driver logs the stats to syslog upon device reset.”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MGhj¤h²hubhï)�”}”(hXOn supported instance types, the statistics will also include the ENA Express data (fields prefixed with `ena_srd`). For a complete documentation of ENA Express data refer to https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ena-express.html#ena-express-monitor”h]”(hŒiOn supported instance types, the statistics will also include the ENA Express data (fields prefixed with ”…”�”}”(hjãh²hh³Nh´Nubj )�”}”(hŒ `ena_srd`”h]”hŒena_srd”…”�”}”(hjëh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjãubhŒ=). For a complete documentation of ENA Express data refer to ”…”�”}”(hjãh²hh³Nh´Nubjî)�”}”(hŒXhttps://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ena-express.html#ena-express-monitor”h]”hŒXhttps://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ena-express.html#ena-express-monitor”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÿuh1jíhjãubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MIhj¤h²hubeh}”(h]”Œ statistics”ah ]”h"]”Œ statistics”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MAubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMTU”h]”hŒMTU”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjh²hh³hÇh´MOubhï)�”}”(hŒîThe driver supports an arbitrarily large MTU with a maximum that is negotiated with the device. The driver configures MTU using the SetFeature command (ENA_ADMIN_MTU property). The user can change MTU via `ip(8)` and similar legacy tools.”h]”(hŒÍThe driver supports an arbitrarily large MTU with a maximum that is negotiated with the device. The driver configures MTU using the SetFeature command (ENA_ADMIN_MTU property). The user can change MTU via ”…”�”}”(hj+h²hh³Nh´Nubj )�”}”(hŒ`ip(8)`”h]”hŒip(8)”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj+ubhŒ and similar legacy tools.”…”�”}”(hj+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MQhjh²hubeh}”(h]”Œmtu”ah ]”h"]”Œmtu”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MOubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒStateless Offloads”h]”hŒStateless Offloads”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjSh²hh³hÇh´MWubhï)�”}”(hŒThe ENA driver supports:”h]”hŒThe ENA driver supports:”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MYhjSh²hubjÁ)�”}”(hhh]”(jÆ)�”}”(hŒIPv4 header checksum offload”h]”hï)�”}”(hjwh]”hŒIPv4 header checksum offload”…”�”}”(hjyh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M[hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjrh²hh³hÇh´NubjÆ)�”}”(hŒ)TCP/UDP over IPv4/IPv6 checksum offloads ”h]”hï)�”}”(hŒ(TCP/UDP over IPv4/IPv6 checksum offloads”h]”hŒ(TCP/UDP over IPv4/IPv6 checksum offloads”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M\hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjrh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´M[hjSh²hubeh}”(h]”Œstateless-offloads”ah ]”h"]”Œstateless offloads”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MWubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒRSS”h]”hŒRSS”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj²h²hh³hÇh´M_ubjÁ)�”}”(hhh]”(jÆ)�”}”(hŒEThe ENA device supports RSS that allows flexible Rx traffic steering.”h]”hï)�”}”(hŒEThe ENA device supports RSS that allows flexible Rx traffic steering.”h]”hŒEThe ENA device supports RSS that allows flexible Rx traffic steering.”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MahjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÃh²hh³hÇh´NubjÆ)�”}”(hŒ0Toeplitz and CRC32 hash functions are supported.”h]”hï)�”}”(hjàh]”hŒ0Toeplitz and CRC32 hash functions are supported.”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MchjÞubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÃh²hh³hÇh´NubjÆ)�”}”(hŒYDifferent combinations of L2/L3/L4 fields can be configured as inputs for hash functions.”h]”hï)�”}”(hŒYDifferent combinations of L2/L3/L4 fields can be configured as inputs for hash functions.”h]”hŒYDifferent combinations of L2/L3/L4 fields can be configured as inputs for hash functions.”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mdhjõubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÃh²hh³hÇh´NubjÆ)�”}”(hŒ±The driver configures RSS settings using the AQ SetFeature command (ENA_ADMIN_RSS_HASH_FUNCTION, ENA_ADMIN_RSS_HASH_INPUT and ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG properties).”h]”hï)�”}”(hŒ±The driver configures RSS settings using the AQ SetFeature command (ENA_ADMIN_RSS_HASH_FUNCTION, ENA_ADMIN_RSS_HASH_INPUT and ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG properties).”h]”hŒ±The driver configures RSS settings using the AQ SetFeature command (ENA_ADMIN_RSS_HASH_FUNCTION, ENA_ADMIN_RSS_HASH_INPUT and ENA_ADMIN_RSS_INDIRECTION_TABLE_CONFIG properties).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mfhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÃh²hh³hÇh´NubjÆ)�”}”(hŒ‡If the NETIF_F_RXHASH flag is set, the 32-bit result of the hash function delivered in the Rx CQ descriptor is set in the received SKB.”h]”hï)�”}”(hŒ‡If the NETIF_F_RXHASH flag is set, the 32-bit result of the hash function delivered in the Rx CQ descriptor is set in the received SKB.”h]”hŒ‡If the NETIF_F_RXHASH flag is set, the 32-bit result of the hash function delivered in the Rx CQ descriptor is set in the received SKB.”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mihj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÃh²hh³hÇh´NubjÆ)�”}”(hŒjThe user can provide a hash key, hash function, and configure the indirection table through `ethtool(8)`. ”h]”hï)�”}”(hŒiThe user can provide a hash key, hash function, and configure the indirection table through `ethtool(8)`.”h]”(hŒ\The user can provide a hash key, hash function, and configure the indirection table through ”…”�”}”(hjAh²hh³Nh´Nubj )�”}”(hŒ `ethtool(8)`”h]”hŒ ethtool(8)”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjAubhŒ.”…”�”}”(hjAh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mlhj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÃh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´Mahj²h²hubeh}”(h]”Œrss”ah ]”h"]”Œrss”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´M_ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒDEVLINK SUPPORT”h]”hŒDEVLINK SUPPORT”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjuh²hh³hÇh´MpubjÄ )�”}”(hŒS.. _`devlink`: https://www.kernel.org/doc/html/latest/networking/devlink/index.html”h]”h}”(h]”Œdevlink”ah ]”h"]”Œdevlink”ah$]”h&]”j: ŒDhttps://www.kernel.org/doc/html/latest/networking/devlink/index.html”uh1jà h´Mqhjuh²hh³hÇjÐ Kubhï)�”}”(hŒZ`devlink`_ supports reloading the driver and initiating re-negotiation with the ENA device”h]”(jî)�”}”(hŒ `devlink`_”h]”hŒdevlink”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œdevlink”j: j’uh1jíhj“jKubhŒP supports reloading the driver and initiating re-negotiation with the ENA device”…”�”}”(hj“h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mshjuh²hubj¡ )�”}”(hŒnsudo devlink dev reload pci/ # for example: sudo devlink dev reload pci/0000:00:06.0”h]”hŒnsudo devlink dev reload pci/ # for example: sudo devlink dev reload pci/0000:00:06.0”…”�”}”hj±sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆj˜ ‰j™ Œshell”j› }”uh1j  h³hÇh´Muhjuh²hubeh}”(h]”Œdevlink-support”ah ]”h"]”Œdevlink support”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MpubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ DATA PATH”h]”hŒ DATA PATH”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÉh²hh³hÇh´M|ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒTx”h]”hŒTx”…”�”}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjÚh²hh³hÇh´Mubhï)�”}”(hŒR:code:`ena_start_xmit()` is called by the stack. This function does the following:”h]”(j> )�”}”(hŒ:code:`ena_start_xmit()`”h]”hŒena_start_xmit()”…”�”}”(hjïh²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hjëubhŒ: is called by the stack. This function does the following:”…”�”}”(hjëh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M�hjÚh²hubjÁ)�”}”(hhh]”(jÆ)�”}”(hŒ,Maps data buffers (``skb->data`` and frags).”h]”hï)�”}”(hj h]”(hŒMaps data buffers (”…”�”}”(hjh²hh³Nh´Nubj> )�”}”(hŒ ``skb->data``”h]”hŒ skb->data”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hjubhŒ and frags).”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mƒhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hŒVPopulates ``ena_buf`` for the push buffer (if the driver and device are in push mode).”h]”hï)�”}”(hŒVPopulates ``ena_buf`` for the push buffer (if the driver and device are in push mode).”h]”(hŒ Populates ”…”�”}”(hj8h²hh³Nh´Nubj> )�”}”(hŒ ``ena_buf``”h]”hŒena_buf”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj8ubhŒA for the push buffer (if the driver and device are in push mode).”…”�”}”(hj8h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M„hj4ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hŒ*Prepares ENA bufs for the remaining frags.”h]”hï)�”}”(hj`h]”hŒ*Prepares ENA bufs for the remaining frags.”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M†hj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hŒ¢Allocates a new request ID from the empty ``req_id`` ring. The request ID is the index of the packet in the Tx info. This is used for out-of-order Tx completions.”h]”hï)�”}”(hŒ¢Allocates a new request ID from the empty ``req_id`` ring. The request ID is the index of the packet in the Tx info. This is used for out-of-order Tx completions.”h]”(hŒ*Allocates a new request ID from the empty ”…”�”}”(hjyh²hh³Nh´Nubj> )�”}”(hŒ ``req_id``”h]”hŒreq_id”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hjyubhŒn ring. The request ID is the index of the packet in the Tx info. This is used for out-of-order Tx completions.”…”�”}”(hjyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M‡hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hŒ3Adds the packet to the proper place in the Tx ring.”h]”hï)�”}”(hj¡h]”hŒ3Adds the packet to the proper place in the Tx ring.”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MŠhjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hXCalls :code:`ena_com_prepare_tx()`, an ENA communication layer that converts the ``ena_bufs`` to ENA descriptors (and adds meta ENA descriptors as needed). * This function also copies the ENA descriptors and the push buffer to the Device memory space (if in push mode). ”h]”(hï)�”}”(hŒ›Calls :code:`ena_com_prepare_tx()`, an ENA communication layer that converts the ``ena_bufs`` to ENA descriptors (and adds meta ENA descriptors as needed).”h]”(hŒCalls ”…”�”}”(hjºh²hh³Nh´Nubj> )�”}”(hŒ:code:`ena_com_prepare_tx()`”h]”hŒena_com_prepare_tx()”…”�”}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hjºubhŒ/, an ENA communication layer that converts the ”…”�”}”(hjºh²hh³Nh´Nubj> )�”}”(hŒ ``ena_bufs``”h]”hŒena_bufs”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hjºubhŒ> to ENA descriptors (and adds meta ENA descriptors as needed).”…”�”}”(hjºh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M‹hj¶ubjÁ)�”}”(hhh]”jÆ)�”}”(hŒpThis function also copies the ENA descriptors and the push buffer to the Device memory space (if in push mode). ”h]”hï)�”}”(hŒoThis function also copies the ENA descriptors and the push buffer to the Device memory space (if in push mode).”h]”hŒoThis function also copies the ENA descriptors and the push buffer to the Device memory space (if in push mode).”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M�hjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjíubah}”(h]”h ]”h"]”h$]”h&]”j*Œ*”uh1jÀh³hÇh´M�hj¶ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³Nh´NubjÆ)�”}”(hŒ$Writes a doorbell to the ENA device.”h]”hï)�”}”(hjh]”hŒ$Writes a doorbell to the ENA device.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M’hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hŒRWhen the ENA device finishes sending the packet, a completion interrupt is raised.”h]”hï)�”}”(hŒRWhen the ENA device finishes sending the packet, a completion interrupt is raised.”h]”hŒRWhen the ENA device finishes sending the packet, a completion interrupt is raised.”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M“hj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hŒ%The interrupt handler schedules NAPI.”h]”hï)�”}”(hjFh]”hŒ%The interrupt handler schedules NAPI.”…”�”}”(hjHh²hh³Nh´Nubah}”(h•=]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M•hjDubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³hÇh´NubjÆ)�”}”(hXèThe :code:`ena_clean_tx_irq()` function is called. This function handles the completion descriptors generated by the ENA, with a single completion descriptor per completed packet. * ``req_id`` is retrieved from the completion descriptor. The ``tx_info`` of the packet is retrieved via the ``req_id``. The data buffers are unmapped and ``req_id`` is returned to the empty ``req_id`` ring. * The function stops when the completion descriptors are completed or the budget is reached. ”h]”(hï)�”}”(hŒ³The :code:`ena_clean_tx_irq()` function is called. This function handles the completion descriptors generated by the ENA, with a single completion descriptor per completed packet.”h]”(hŒThe ”…”�”}”(hj_h²hh³Nh´Nubj> )�”}”(hŒ:code:`ena_clean_tx_irq()`”h]”hŒena_clean_tx_irq()”…”�”}”(hjgh²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hj_ubhŒ• function is called. This function handles the completion descriptors generated by the ENA, with a single completion descriptor per completed packet.”…”�”}”(hj_h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M–hj[ubjÁ)�”}”(hhh]”(jÆ)�”}”(hŒÍ``req_id`` is retrieved from the completion descriptor. The ``tx_info`` of the packet is retrieved via the ``req_id``. The data buffers are unmapped and ``req_id`` is returned to the empty ``req_id`` ring.”h]”hï)�”}”(hŒÍ``req_id`` is retrieved from the completion descriptor. The ``tx_info`` of the packet is retrieved via the ``req_id``. The data buffers are unmapped and ``req_id`` is returned to the empty ``req_id`` ring.”h]”(j> )�”}”(hŒ ``req_id``”h]”hŒreq_id”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj‡ubhŒ2 is retrieved from the completion descriptor. The ”…”�”}”(hj‡h²hh³Nh´Nubj> )�”}”(hŒ ``tx_info``”h]”hŒtx_info”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj‡ubhŒ$ of the packet is retrieved via the ”…”�”}”(hj‡h²hh³Nh´Nubj> )�”}”(hŒ ``req_id``”h]”hŒreq_id”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj‡ubhŒ$. The data buffers are unmapped and ”…”�”}”(hj‡h²hh³Nh´Nubj> )�”}”(hŒ ``req_id``”h]”hŒreq_id”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj‡ubhŒ is returned to the empty ”…”�”}”(hj‡h²hh³Nh´Nubj> )�”}”(hŒ ``req_id``”h]”hŒreq_id”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j= hj‡ubhŒ ring.”…”�”}”(hj‡h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´Mšhjƒubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj€ubjÆ)�”}”(hŒ[The function stops when the completion descriptors are completed or the budget is reached. ”h]”hï)�”}”(hŒZThe function stops when the completion descriptors are completed or the budget is reached.”h]”hŒZThe function stops when the completion descriptors are completed or the budget is reached.”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M�hjñubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj€ubeh}”(h]”h ]”h"]”h$]”h&]”j*juh1jÀh³hÇh´Mšhj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´MƒhjÚh²hubeh}”(h]”Œtx”ah ]”h"]”Œtx”ah$]”h&]”uh1hÈhjÉh²hh³hÇh´MubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒRx”h]”hŒRx”…”�”}”(hj&h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj#h²hh³hÇh´M¡ubjÁ)�”}”(hhh]”(jÆ)�”}”(hŒ.When a packet is received from the ENA device.”h]”hï)�”}”(hj9h]”hŒ.When a packet is received from the ENA device.”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M£hj7ubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj4h²hh³hÇh´NubjÆ)�”}”(hŒ%The interrupt handler schedules NAPI.”h]”hï)�”}”(hjPh]”hŒ%The interrupt handler schedules NAPI.”…”�”}”(hjRh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M¤hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj4h²hh³hÇh´NubjÆ)�”}”(hŒèThe :code:`ena_clean_rx_irq()` function is called. This function calls :code:`ena_com_rx_pkt()`, an ENA communication layer function, which returns the number of descriptors used for a new packet, and zero if no new packet is found.”h]”hï)�”}”(hŒèThe :code:`ena_clean_rx_irq()` function is called. This function calls :code:`ena_com_rx_pkt()`, an ENA communication layer function, which returns the number of descriptors used for a new packet, and zero if no new packet is found.”h]”(hŒThe ”…”�”}”(hjih²hh³Nh´Nubj> )�”}”(hŒ:code:`ena_clean_rx_irq()`”h]”hŒena_clean_rx_irq()”…”�”}”(hjqh²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hjiubhŒ) function is called. This function calls ”…”�”}”(hjih²hh³Nh´Nubj> )�”}”(hŒ:code:`ena_com_rx_pkt()`”h]”hŒena_com_rx_pkt()”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hjiubhŒ‰, an ENA communication layer function, which returns the number of descriptors used for a new packet, and zero if no new packet is found.”…”�”}”(hjih²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M¥hjeubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj4h²hh³hÇh´NubjÆ)�”}”(hXÉ:code:`ena_rx_skb()` checks packet length: * If the packet is small (len < rx_copybreak), the driver allocates a SKB for the new packet, and copies the packet payload into the SKB data buffer. - In this way the original data buffer is not passed to the stack and is reused for future Rx packets. * Otherwise the function unmaps the Rx buffer, sets the first descriptor as `skb`'s linear part and the other descriptors as the `skb`'s frags. ”h]”(hï)�”}”(hŒ*:code:`ena_rx_skb()` checks packet length:”h]”(j> )�”}”(hŒ:code:`ena_rx_skb()`”h]”hŒ ena_rx_skb()”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hj§ubhŒ checks packet length:”…”�”}”(hj§h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M©hj£ubjÁ)�”}”(hhh]”(jÆ)�”}”(hŒþIf the packet is small (len < rx_copybreak), the driver allocates a SKB for the new packet, and copies the packet payload into the SKB data buffer. - In this way the original data buffer is not passed to the stack and is reused for future Rx packets. ”h]”(hï)�”}”(hŒ“If the packet is small (len < rx_copybreak), the driver allocates a SKB for the new packet, and copies the packet payload into the SKB data buffer.”h]”hŒ“If the packet is small (len < rx_copybreak), the driver allocates a SKB for the new packet, and copies the packet payload into the SKB data buffer.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M«hjÇubjÁ)�”}”(hhh]”jÆ)�”}”(hŒeIn this way the original data buffer is not passed to the stack and is reused for future Rx packets. ”h]”hï)�”}”(hŒdIn this way the original data buffer is not passed to the stack and is reused for future Rx packets.”h]”hŒdIn this way the original data buffer is not passed to the stack and is reused for future Rx packets.”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M¯hjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÙubah}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´M¯hjÇubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÄubjÆ)�”}”(hŒŽOtherwise the function unmaps the Rx buffer, sets the first descriptor as `skb`'s linear part and the other descriptors as the `skb`'s frags. ”h]”hï)�”}”(hŒ�Otherwise the function unmaps the Rx buffer, sets the first descriptor as `skb`'s linear part and the other descriptors as the `skb`'s frags.”h]”(hŒJOtherwise the function unmaps the Rx buffer, sets the first descriptor as ”…”�”}”(hjh²hh³Nh´Nubj )�”}”(hŒ`skb`”h]”hŒskb”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubhŒ2’s linear part and the other descriptors as the ”…”�”}”(hjh²hh³Nh´Nubj )�”}”(hŒ`skb`”h]”hŒskb”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubhŒ ’s frags.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M²hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhjÄubeh}”(h]”h ]”h"]”h$]”h&]”j*juh1jÀh³hÇh´M«hj£ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj4h²hh³Nh´NubjÆ)�”}”(hŒÆThe new SKB is updated with the necessary information (protocol, checksum hw verify result, etc), and then passed to the network stack, using the NAPI interface function :code:`napi_gro_receive()`. ”h]”hï)�”}”(hŒÅThe new SKB is updated with the necessary information (protocol, checksum hw verify result, etc), and then passed to the network stack, using the NAPI interface function :code:`napi_gro_receive()`.”h]”(hŒªThe new SKB is updated with the necessary information (protocol, checksum hw verify result, etc), and then passed to the network stack, using the NAPI interface function ”…”�”}”(hjLh²hh³Nh´Nubj> )�”}”(hŒ:code:`napi_gro_receive()`”h]”hŒnapi_gro_receive()”…”�”}”(hjTh²hh³Nh´Nubah}”(h]”h ]”j¦ ah"]”h$]”h&]”Œlanguage”huh1j= hjLubhŒ.”…”�”}”(hjLh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M¶hjHubah}”(h]”h ]”h"]”h$]”h&]”uh1jÅhj4h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j*j+uh1jÀh³hÇh´M£hj#h²hubeh}”(h]”Œrx”ah ]”h"]”Œrx”ah$]”h&]”uh1hÈhjÉh²hh³hÇh´M¡ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒDynamic RX Buffers (DRB)”h]”hŒDynamic RX Buffers (DRB)”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj�h²hh³hÇh´M»ubhï)�”}”(hXGEach RX descriptor in the RX ring is a single memory page (which is either 4KB or 16KB long depending on system's configurations). To reduce the memory allocations required when dealing with a high rate of small packets, the driver tries to reuse the remaining RX descriptor's space if more than 2KB of this page remain unused.”h]”hXKEach RX descriptor in the RX ring is a single memory page (which is either 4KB or 16KB long depending on system’s configurations). To reduce the memory allocations required when dealing with a high rate of small packets, the driver tries to reuse the remaining RX descriptor’s space if more than 2KB of this page remain unused.”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´M½hj�h²hubhï)�”}”(hŒGA simple example of this mechanism is the following sequence of events:”h]”hŒGA simple example of this mechanism is the following sequence of events:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÃhj�h²hubj¡ )�”}”(hXÄ1. Driver allocates page-sized RX buffer and passes it to hardware +----------------------+ |4KB RX Buffer | +----------------------+ 2. A 300Bytes packet is received on this buffer 3. The driver increases the ref count on this page and returns it back to HW as an RX buffer of size 4KB - 300Bytes = 3796 Bytes +----+--------------------+ |****|3796 Bytes RX Buffer| +----+--------------------+”h]”hXÄ1. Driver allocates page-sized RX buffer and passes it to hardware +----------------------+ |4KB RX Buffer | +----------------------+ 2. A 300Bytes packet is received on this buffer 3. The driver increases the ref count on this page and returns it back to HW as an RX buffer of size 4KB - 300Bytes = 3796 Bytes +----+--------------------+ |****|3796 Bytes RX Buffer| +----+--------------------+”…”�”}”hj®sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j  h³hÇh´MÇhj�h²hubhï)�”}”(hXThis mechanism isn't used when an XDP program is loaded, or when the RX packet is less than rx_copybreak bytes (in which case the packet is copied out of the RX buffer into the linear part of a new skb allocated for it and the RX buffer remains the same size, see `RX copybreak`_).”h]”(hX This mechanism isn’t used when an XDP program is loaded, or when the RX packet is less than rx_copybreak bytes (in which case the packet is copied out of the RX buffer into the linear part of a new skb allocated for it and the RX buffer remains the same size, see ”…”�”}”(hj¼h²hh³Nh´Nubjî)�”}”(hŒ`RX copybreak`_”h]”hŒ RX copybreak”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”Œ RX copybreak”jÿjÏ uh1jíhj¼jKubhŒ).”…”�”}”(hj¼h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîh³hÇh´MÔhj�h²hubeh}”(h]”Œdynamic-rx-buffers-drb”ah ]”h"]”Œdynamic rx buffers (drb)”ah$]”h&]”uh1hÈhjÉh²hh³hÇh´M»ubeh}”(h]”Œ data-path”ah ]”h"]”Œ data path”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´M|ubeh}”(h]”Œ:linux-kernel-driver-for-elastic-network-adapter-ena-family”ah ]”h"]”Œ