1
0

common.c 41 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. #include <linux/ethtool_netlink.h>
  3. #include <linux/net_tstamp.h>
  4. #include <linux/phy.h>
  5. #include <linux/rtnetlink.h>
  6. #include <linux/ptp_clock_kernel.h>
  7. #include <linux/phy_link_topology.h>
  8. #include <net/netdev_queues.h>
  9. #include "netlink.h"
  10. #include "common.h"
  11. #include "../core/dev.h"
  12. const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
  13. [NETIF_F_SG_BIT] = "tx-scatter-gather",
  14. [NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4",
  15. [NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic",
  16. [NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6",
  17. [NETIF_F_HIGHDMA_BIT] = "highdma",
  18. [NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist",
  19. [NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert",
  20. [NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse",
  21. [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
  22. [NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert",
  23. [NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse",
  24. [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
  25. [NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
  26. [NETIF_F_GSO_BIT] = "tx-generic-segmentation",
  27. [NETIF_F_GRO_BIT] = "rx-gro",
  28. [NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
  29. [NETIF_F_LRO_BIT] = "rx-lro",
  30. [NETIF_F_TSO_BIT] = "tx-tcp-segmentation",
  31. [NETIF_F_GSO_ROBUST_BIT] = "tx-gso-robust",
  32. [NETIF_F_TSO_ECN_BIT] = "tx-tcp-ecn-segmentation",
  33. [NETIF_F_GSO_ACCECN_BIT] = "tx-tcp-accecn-segmentation",
  34. [NETIF_F_TSO_MANGLEID_BIT] = "tx-tcp-mangleid-segmentation",
  35. [NETIF_F_TSO6_BIT] = "tx-tcp6-segmentation",
  36. [NETIF_F_FSO_BIT] = "tx-fcoe-segmentation",
  37. [NETIF_F_GSO_GRE_BIT] = "tx-gre-segmentation",
  38. [NETIF_F_GSO_GRE_CSUM_BIT] = "tx-gre-csum-segmentation",
  39. [NETIF_F_GSO_IPXIP4_BIT] = "tx-ipxip4-segmentation",
  40. [NETIF_F_GSO_IPXIP6_BIT] = "tx-ipxip6-segmentation",
  41. [NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation",
  42. [NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
  43. [NETIF_F_GSO_PARTIAL_BIT] = "tx-gso-partial",
  44. [NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
  45. [NETIF_F_GSO_SCTP_BIT] = "tx-sctp-segmentation",
  46. [NETIF_F_GSO_ESP_BIT] = "tx-esp-segmentation",
  47. [NETIF_F_GSO_UDP_L4_BIT] = "tx-udp-segmentation",
  48. [NETIF_F_GSO_FRAGLIST_BIT] = "tx-gso-list",
  49. [NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc",
  50. [NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp",
  51. [NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter",
  52. [NETIF_F_RXHASH_BIT] = "rx-hashing",
  53. [NETIF_F_RXCSUM_BIT] = "rx-checksum",
  54. [NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy",
  55. [NETIF_F_LOOPBACK_BIT] = "loopback",
  56. [NETIF_F_RXFCS_BIT] = "rx-fcs",
  57. [NETIF_F_RXALL_BIT] = "rx-all",
  58. [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
  59. [NETIF_F_HW_TC_BIT] = "hw-tc-offload",
  60. [NETIF_F_HW_ESP_BIT] = "esp-hw-offload",
  61. [NETIF_F_HW_ESP_TX_CSUM_BIT] = "esp-tx-csum-hw-offload",
  62. [NETIF_F_RX_UDP_TUNNEL_PORT_BIT] = "rx-udp_tunnel-port-offload",
  63. [NETIF_F_HW_TLS_RECORD_BIT] = "tls-hw-record",
  64. [NETIF_F_HW_TLS_TX_BIT] = "tls-hw-tx-offload",
  65. [NETIF_F_HW_TLS_RX_BIT] = "tls-hw-rx-offload",
  66. [NETIF_F_GRO_FRAGLIST_BIT] = "rx-gro-list",
  67. [NETIF_F_HW_MACSEC_BIT] = "macsec-hw-offload",
  68. [NETIF_F_GRO_UDP_FWD_BIT] = "rx-udp-gro-forwarding",
  69. [NETIF_F_HW_HSR_TAG_INS_BIT] = "hsr-tag-ins-offload",
  70. [NETIF_F_HW_HSR_TAG_RM_BIT] = "hsr-tag-rm-offload",
  71. [NETIF_F_HW_HSR_FWD_BIT] = "hsr-fwd-offload",
  72. [NETIF_F_HW_HSR_DUP_BIT] = "hsr-dup-offload",
  73. };
  74. const char
  75. rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
  76. [ETH_RSS_HASH_TOP_BIT] = "toeplitz",
  77. [ETH_RSS_HASH_XOR_BIT] = "xor",
  78. [ETH_RSS_HASH_CRC32_BIT] = "crc32",
  79. };
  80. const char
  81. tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
  82. [ETHTOOL_ID_UNSPEC] = "Unspec",
  83. [ETHTOOL_RX_COPYBREAK] = "rx-copybreak",
  84. [ETHTOOL_TX_COPYBREAK] = "tx-copybreak",
  85. [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
  86. [ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size",
  87. };
  88. const char
  89. phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
  90. [ETHTOOL_ID_UNSPEC] = "Unspec",
  91. [ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
  92. [ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
  93. [ETHTOOL_PHY_EDPD] = "phy-energy-detect-power-down",
  94. };
  95. #define __LINK_MODE_NAME(speed, type, duplex) \
  96. #speed "base" #type "/" #duplex
  97. #define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
  98. [ETHTOOL_LINK_MODE(speed, type, duplex)] = \
  99. __LINK_MODE_NAME(speed, type, duplex)
  100. #define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
  101. [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
  102. const char link_mode_names[][ETH_GSTRING_LEN] = {
  103. __DEFINE_LINK_MODE_NAME(10, T, Half),
  104. __DEFINE_LINK_MODE_NAME(10, T, Full),
  105. __DEFINE_LINK_MODE_NAME(100, T, Half),
  106. __DEFINE_LINK_MODE_NAME(100, T, Full),
  107. __DEFINE_LINK_MODE_NAME(1000, T, Half),
  108. __DEFINE_LINK_MODE_NAME(1000, T, Full),
  109. __DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
  110. __DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
  111. __DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
  112. __DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
  113. __DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
  114. __DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
  115. __DEFINE_LINK_MODE_NAME(10000, T, Full),
  116. __DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
  117. __DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
  118. __DEFINE_LINK_MODE_NAME(2500, X, Full),
  119. __DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
  120. __DEFINE_LINK_MODE_NAME(1000, KX, Full),
  121. __DEFINE_LINK_MODE_NAME(10000, KX4, Full),
  122. __DEFINE_LINK_MODE_NAME(10000, KR, Full),
  123. __DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
  124. __DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
  125. __DEFINE_LINK_MODE_NAME(20000, KR2, Full),
  126. __DEFINE_LINK_MODE_NAME(40000, KR4, Full),
  127. __DEFINE_LINK_MODE_NAME(40000, CR4, Full),
  128. __DEFINE_LINK_MODE_NAME(40000, SR4, Full),
  129. __DEFINE_LINK_MODE_NAME(40000, LR4, Full),
  130. __DEFINE_LINK_MODE_NAME(56000, KR4, Full),
  131. __DEFINE_LINK_MODE_NAME(56000, CR4, Full),
  132. __DEFINE_LINK_MODE_NAME(56000, SR4, Full),
  133. __DEFINE_LINK_MODE_NAME(56000, LR4, Full),
  134. __DEFINE_LINK_MODE_NAME(25000, CR, Full),
  135. __DEFINE_LINK_MODE_NAME(25000, KR, Full),
  136. __DEFINE_LINK_MODE_NAME(25000, SR, Full),
  137. __DEFINE_LINK_MODE_NAME(50000, CR2, Full),
  138. __DEFINE_LINK_MODE_NAME(50000, KR2, Full),
  139. __DEFINE_LINK_MODE_NAME(100000, KR4, Full),
  140. __DEFINE_LINK_MODE_NAME(100000, SR4, Full),
  141. __DEFINE_LINK_MODE_NAME(100000, CR4, Full),
  142. __DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
  143. __DEFINE_LINK_MODE_NAME(50000, SR2, Full),
  144. __DEFINE_LINK_MODE_NAME(1000, X, Full),
  145. __DEFINE_LINK_MODE_NAME(10000, CR, Full),
  146. __DEFINE_LINK_MODE_NAME(10000, SR, Full),
  147. __DEFINE_LINK_MODE_NAME(10000, LR, Full),
  148. __DEFINE_LINK_MODE_NAME(10000, LRM, Full),
  149. __DEFINE_LINK_MODE_NAME(10000, ER, Full),
  150. __DEFINE_LINK_MODE_NAME(2500, T, Full),
  151. __DEFINE_LINK_MODE_NAME(5000, T, Full),
  152. __DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
  153. __DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
  154. __DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
  155. __DEFINE_LINK_MODE_NAME(50000, KR, Full),
  156. __DEFINE_LINK_MODE_NAME(50000, SR, Full),
  157. __DEFINE_LINK_MODE_NAME(50000, CR, Full),
  158. __DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
  159. __DEFINE_LINK_MODE_NAME(50000, DR, Full),
  160. __DEFINE_LINK_MODE_NAME(100000, KR2, Full),
  161. __DEFINE_LINK_MODE_NAME(100000, SR2, Full),
  162. __DEFINE_LINK_MODE_NAME(100000, CR2, Full),
  163. __DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
  164. __DEFINE_LINK_MODE_NAME(100000, DR2, Full),
  165. __DEFINE_LINK_MODE_NAME(200000, KR4, Full),
  166. __DEFINE_LINK_MODE_NAME(200000, SR4, Full),
  167. __DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
  168. __DEFINE_LINK_MODE_NAME(200000, DR4, Full),
  169. __DEFINE_LINK_MODE_NAME(200000, CR4, Full),
  170. __DEFINE_LINK_MODE_NAME(100, T1, Full),
  171. __DEFINE_LINK_MODE_NAME(1000, T1, Full),
  172. __DEFINE_LINK_MODE_NAME(400000, KR8, Full),
  173. __DEFINE_LINK_MODE_NAME(400000, SR8, Full),
  174. __DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
  175. __DEFINE_LINK_MODE_NAME(400000, DR8, Full),
  176. __DEFINE_LINK_MODE_NAME(400000, CR8, Full),
  177. __DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
  178. __DEFINE_LINK_MODE_NAME(100000, KR, Full),
  179. __DEFINE_LINK_MODE_NAME(100000, SR, Full),
  180. __DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
  181. __DEFINE_LINK_MODE_NAME(100000, DR, Full),
  182. __DEFINE_LINK_MODE_NAME(100000, CR, Full),
  183. __DEFINE_LINK_MODE_NAME(200000, KR2, Full),
  184. __DEFINE_LINK_MODE_NAME(200000, SR2, Full),
  185. __DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
  186. __DEFINE_LINK_MODE_NAME(200000, DR2, Full),
  187. __DEFINE_LINK_MODE_NAME(200000, CR2, Full),
  188. __DEFINE_LINK_MODE_NAME(400000, KR4, Full),
  189. __DEFINE_LINK_MODE_NAME(400000, SR4, Full),
  190. __DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
  191. __DEFINE_LINK_MODE_NAME(400000, DR4, Full),
  192. __DEFINE_LINK_MODE_NAME(400000, CR4, Full),
  193. __DEFINE_LINK_MODE_NAME(100, FX, Half),
  194. __DEFINE_LINK_MODE_NAME(100, FX, Full),
  195. __DEFINE_LINK_MODE_NAME(10, T1L, Full),
  196. __DEFINE_LINK_MODE_NAME(800000, CR8, Full),
  197. __DEFINE_LINK_MODE_NAME(800000, KR8, Full),
  198. __DEFINE_LINK_MODE_NAME(800000, DR8, Full),
  199. __DEFINE_LINK_MODE_NAME(800000, DR8_2, Full),
  200. __DEFINE_LINK_MODE_NAME(800000, SR8, Full),
  201. __DEFINE_LINK_MODE_NAME(800000, VR8, Full),
  202. __DEFINE_LINK_MODE_NAME(10, T1S, Full),
  203. __DEFINE_LINK_MODE_NAME(10, T1S, Half),
  204. __DEFINE_LINK_MODE_NAME(10, T1S_P2MP, Half),
  205. __DEFINE_LINK_MODE_NAME(10, T1BRR, Full),
  206. __DEFINE_LINK_MODE_NAME(200000, CR, Full),
  207. __DEFINE_LINK_MODE_NAME(200000, KR, Full),
  208. __DEFINE_LINK_MODE_NAME(200000, DR, Full),
  209. __DEFINE_LINK_MODE_NAME(200000, DR_2, Full),
  210. __DEFINE_LINK_MODE_NAME(200000, SR, Full),
  211. __DEFINE_LINK_MODE_NAME(200000, VR, Full),
  212. __DEFINE_LINK_MODE_NAME(400000, CR2, Full),
  213. __DEFINE_LINK_MODE_NAME(400000, KR2, Full),
  214. __DEFINE_LINK_MODE_NAME(400000, DR2, Full),
  215. __DEFINE_LINK_MODE_NAME(400000, DR2_2, Full),
  216. __DEFINE_LINK_MODE_NAME(400000, SR2, Full),
  217. __DEFINE_LINK_MODE_NAME(400000, VR2, Full),
  218. __DEFINE_LINK_MODE_NAME(800000, CR4, Full),
  219. __DEFINE_LINK_MODE_NAME(800000, KR4, Full),
  220. __DEFINE_LINK_MODE_NAME(800000, DR4, Full),
  221. __DEFINE_LINK_MODE_NAME(800000, DR4_2, Full),
  222. __DEFINE_LINK_MODE_NAME(800000, SR4, Full),
  223. __DEFINE_LINK_MODE_NAME(800000, VR4, Full),
  224. __DEFINE_LINK_MODE_NAME(1600000, CR8, Full),
  225. __DEFINE_LINK_MODE_NAME(1600000, KR8, Full),
  226. __DEFINE_LINK_MODE_NAME(1600000, DR8, Full),
  227. __DEFINE_LINK_MODE_NAME(1600000, DR8_2, Full),
  228. };
  229. static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
  230. #define __LINK_MODE_LANES_CR 1
  231. #define __LINK_MODE_LANES_CR2 2
  232. #define __LINK_MODE_LANES_CR4 4
  233. #define __LINK_MODE_LANES_CR8 8
  234. #define __LINK_MODE_LANES_DR 1
  235. #define __LINK_MODE_LANES_DR_2 1
  236. #define __LINK_MODE_LANES_DR2 2
  237. #define __LINK_MODE_LANES_DR2_2 2
  238. #define __LINK_MODE_LANES_DR4 4
  239. #define __LINK_MODE_LANES_DR4_2 4
  240. #define __LINK_MODE_LANES_DR8 8
  241. #define __LINK_MODE_LANES_KR 1
  242. #define __LINK_MODE_LANES_KR2 2
  243. #define __LINK_MODE_LANES_KR4 4
  244. #define __LINK_MODE_LANES_KR8 8
  245. #define __LINK_MODE_LANES_SR 1
  246. #define __LINK_MODE_LANES_SR2 2
  247. #define __LINK_MODE_LANES_SR4 4
  248. #define __LINK_MODE_LANES_SR8 8
  249. #define __LINK_MODE_LANES_ER 1
  250. #define __LINK_MODE_LANES_KX 1
  251. #define __LINK_MODE_LANES_KX4 4
  252. #define __LINK_MODE_LANES_LR 1
  253. #define __LINK_MODE_LANES_LR4 4
  254. #define __LINK_MODE_LANES_LR4_ER4 4
  255. #define __LINK_MODE_LANES_LR_ER_FR 1
  256. #define __LINK_MODE_LANES_LR2_ER2_FR2 2
  257. #define __LINK_MODE_LANES_LR4_ER4_FR4 4
  258. #define __LINK_MODE_LANES_LR8_ER8_FR8 8
  259. #define __LINK_MODE_LANES_LRM 1
  260. #define __LINK_MODE_LANES_MLD2 2
  261. #define __LINK_MODE_LANES_T 1
  262. #define __LINK_MODE_LANES_T1 1
  263. #define __LINK_MODE_LANES_X 1
  264. #define __LINK_MODE_LANES_FX 1
  265. #define __LINK_MODE_LANES_T1L 1
  266. #define __LINK_MODE_LANES_T1S 1
  267. #define __LINK_MODE_LANES_T1S_P2MP 1
  268. #define __LINK_MODE_LANES_VR 1
  269. #define __LINK_MODE_LANES_VR2 2
  270. #define __LINK_MODE_LANES_VR4 4
  271. #define __LINK_MODE_LANES_VR8 8
  272. #define __LINK_MODE_LANES_DR8_2 8
  273. #define __LINK_MODE_LANES_T1BRR 1
  274. #define __DEFINE_LINK_MODE_PARAMS_PAIRS(_speed, _type, _min_pairs, _pairs, _duplex, _medium) \
  275. [ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = { \
  276. .speed = SPEED_ ## _speed, \
  277. .lanes = __LINK_MODE_LANES_ ## _type, \
  278. .min_pairs = _min_pairs, \
  279. .pairs = _pairs, \
  280. .duplex = __DUPLEX_ ## _duplex, \
  281. .mediums = BIT(ETHTOOL_LINK_MEDIUM_BASE ## _medium) \
  282. }
  283. #define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex, _medium) \
  284. [ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = { \
  285. .speed = SPEED_ ## _speed, \
  286. .lanes = __LINK_MODE_LANES_ ## _type, \
  287. .min_pairs = 0, \
  288. .pairs = 0, \
  289. .duplex = __DUPLEX_ ## _duplex, \
  290. .mediums = BIT(ETHTOOL_LINK_MEDIUM_BASE ## _medium) \
  291. }
  292. #define __DEFINE_LINK_MODE_PARAMS_MEDIUMS(_speed, _type, _duplex, _mediums) \
  293. [ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = { \
  294. .speed = SPEED_ ## _speed, \
  295. .lanes = __LINK_MODE_LANES_ ## _type, \
  296. .min_pairs = 0, \
  297. .pairs = 0, \
  298. .duplex = __DUPLEX_ ## _duplex, \
  299. .mediums = (_mediums) \
  300. }
  301. #define __MED(_medium) (BIT(ETHTOOL_LINK_MEDIUM_BASE ## _medium))
  302. #define __DUPLEX_Half DUPLEX_HALF
  303. #define __DUPLEX_Full DUPLEX_FULL
  304. #define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
  305. [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
  306. .speed = SPEED_UNKNOWN, \
  307. .lanes = 0, \
  308. .duplex = DUPLEX_UNKNOWN, \
  309. .mediums = BIT(ETHTOOL_LINK_MEDIUM_NONE), \
  310. }
  311. const struct link_mode_info link_mode_params[] = {
  312. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T, 2, 4, Half, T),
  313. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T, 2, 4, Full, T),
  314. __DEFINE_LINK_MODE_PARAMS_PAIRS(100, T, 2, 4, Half, T),
  315. __DEFINE_LINK_MODE_PARAMS_PAIRS(100, T, 2, 4, Full, T),
  316. __DEFINE_LINK_MODE_PARAMS_PAIRS(1000, T, 4, 4, Half, T),
  317. __DEFINE_LINK_MODE_PARAMS_PAIRS(1000, T, 4, 4, Full, T),
  318. __DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
  319. __DEFINE_SPECIAL_MODE_PARAMS(TP),
  320. __DEFINE_SPECIAL_MODE_PARAMS(AUI),
  321. __DEFINE_SPECIAL_MODE_PARAMS(MII),
  322. __DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
  323. __DEFINE_SPECIAL_MODE_PARAMS(BNC),
  324. __DEFINE_LINK_MODE_PARAMS_PAIRS(10000, T, 4, 4, Full, T),
  325. __DEFINE_SPECIAL_MODE_PARAMS(Pause),
  326. __DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
  327. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(2500, X, Full,
  328. __MED(C) | __MED(S) | __MED(L)),
  329. __DEFINE_SPECIAL_MODE_PARAMS(Backplane),
  330. __DEFINE_LINK_MODE_PARAMS(1000, KX, Full, K),
  331. __DEFINE_LINK_MODE_PARAMS(10000, KX4, Full, K),
  332. __DEFINE_LINK_MODE_PARAMS(10000, KR, Full, K),
  333. [ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
  334. .speed = SPEED_10000,
  335. .lanes = 1,
  336. .duplex = DUPLEX_FULL,
  337. },
  338. __DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full, MLD),
  339. __DEFINE_LINK_MODE_PARAMS(20000, KR2, Full, K),
  340. __DEFINE_LINK_MODE_PARAMS(40000, KR4, Full, K),
  341. __DEFINE_LINK_MODE_PARAMS(40000, CR4, Full, C),
  342. __DEFINE_LINK_MODE_PARAMS(40000, SR4, Full, S),
  343. __DEFINE_LINK_MODE_PARAMS(40000, LR4, Full, L),
  344. __DEFINE_LINK_MODE_PARAMS(56000, KR4, Full, K),
  345. __DEFINE_LINK_MODE_PARAMS(56000, CR4, Full, C),
  346. __DEFINE_LINK_MODE_PARAMS(56000, SR4, Full, S),
  347. __DEFINE_LINK_MODE_PARAMS(56000, LR4, Full, L),
  348. __DEFINE_LINK_MODE_PARAMS(25000, CR, Full, C),
  349. __DEFINE_LINK_MODE_PARAMS(25000, KR, Full, K),
  350. __DEFINE_LINK_MODE_PARAMS(25000, SR, Full, S),
  351. __DEFINE_LINK_MODE_PARAMS(50000, CR2, Full, C),
  352. __DEFINE_LINK_MODE_PARAMS(50000, KR2, Full, K),
  353. __DEFINE_LINK_MODE_PARAMS(100000, KR4, Full, K),
  354. __DEFINE_LINK_MODE_PARAMS(100000, SR4, Full, S),
  355. __DEFINE_LINK_MODE_PARAMS(100000, CR4, Full, C),
  356. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(100000, LR4_ER4, Full,
  357. __MED(L) | __MED(E)),
  358. __DEFINE_LINK_MODE_PARAMS(50000, SR2, Full, S),
  359. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(1000, X, Full,
  360. __MED(C) | __MED(S) | __MED(L)),
  361. __DEFINE_LINK_MODE_PARAMS(10000, CR, Full, C),
  362. __DEFINE_LINK_MODE_PARAMS(10000, SR, Full, S),
  363. __DEFINE_LINK_MODE_PARAMS(10000, LR, Full, L),
  364. __DEFINE_LINK_MODE_PARAMS(10000, LRM, Full, L),
  365. __DEFINE_LINK_MODE_PARAMS(10000, ER, Full, E),
  366. __DEFINE_LINK_MODE_PARAMS_PAIRS(2500, T, 4, 4, Full, T),
  367. __DEFINE_LINK_MODE_PARAMS_PAIRS(5000, T, 4, 4, Full, T),
  368. __DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
  369. __DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
  370. __DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
  371. __DEFINE_LINK_MODE_PARAMS(50000, KR, Full, K),
  372. __DEFINE_LINK_MODE_PARAMS(50000, SR, Full, S),
  373. __DEFINE_LINK_MODE_PARAMS(50000, CR, Full, C),
  374. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(50000, LR_ER_FR, Full,
  375. __MED(L) | __MED(E) | __MED(F)),
  376. __DEFINE_LINK_MODE_PARAMS(50000, DR, Full, D),
  377. __DEFINE_LINK_MODE_PARAMS(100000, KR2, Full, K),
  378. __DEFINE_LINK_MODE_PARAMS(100000, SR2, Full, S),
  379. __DEFINE_LINK_MODE_PARAMS(100000, CR2, Full, C),
  380. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(100000, LR2_ER2_FR2, Full,
  381. __MED(L) | __MED(E) | __MED(F)),
  382. __DEFINE_LINK_MODE_PARAMS(100000, DR2, Full, D),
  383. __DEFINE_LINK_MODE_PARAMS(200000, KR4, Full, K),
  384. __DEFINE_LINK_MODE_PARAMS(200000, SR4, Full, S),
  385. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(200000, LR4_ER4_FR4, Full,
  386. __MED(L) | __MED(E) | __MED(F)),
  387. __DEFINE_LINK_MODE_PARAMS(200000, DR4, Full, D),
  388. __DEFINE_LINK_MODE_PARAMS(200000, CR4, Full, C),
  389. __DEFINE_LINK_MODE_PARAMS_PAIRS(100, T1, 1, 1, Full, T),
  390. __DEFINE_LINK_MODE_PARAMS_PAIRS(1000, T1, 1, 1, Full, T),
  391. __DEFINE_LINK_MODE_PARAMS(400000, KR8, Full, K),
  392. __DEFINE_LINK_MODE_PARAMS(400000, SR8, Full, S),
  393. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(400000, LR8_ER8_FR8, Full,
  394. __MED(L) | __MED(E) | __MED(F)),
  395. __DEFINE_LINK_MODE_PARAMS(400000, DR8, Full, D),
  396. __DEFINE_LINK_MODE_PARAMS(400000, CR8, Full, C),
  397. __DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
  398. __DEFINE_LINK_MODE_PARAMS(100000, KR, Full, K),
  399. __DEFINE_LINK_MODE_PARAMS(100000, SR, Full, S),
  400. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(100000, LR_ER_FR, Full,
  401. __MED(L) | __MED(E) | __MED(F)),
  402. __DEFINE_LINK_MODE_PARAMS(100000, DR, Full, D),
  403. __DEFINE_LINK_MODE_PARAMS(100000, CR, Full, C),
  404. __DEFINE_LINK_MODE_PARAMS(200000, KR2, Full, K),
  405. __DEFINE_LINK_MODE_PARAMS(200000, SR2, Full, S),
  406. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(200000, LR2_ER2_FR2, Full,
  407. __MED(L) | __MED(E) | __MED(F)),
  408. __DEFINE_LINK_MODE_PARAMS(200000, DR2, Full, D),
  409. __DEFINE_LINK_MODE_PARAMS(200000, CR2, Full, C),
  410. __DEFINE_LINK_MODE_PARAMS(400000, KR4, Full, K),
  411. __DEFINE_LINK_MODE_PARAMS(400000, SR4, Full, S),
  412. __DEFINE_LINK_MODE_PARAMS_MEDIUMS(400000, LR4_ER4_FR4, Full,
  413. __MED(L) | __MED(E) | __MED(F)),
  414. __DEFINE_LINK_MODE_PARAMS(400000, DR4, Full, D),
  415. __DEFINE_LINK_MODE_PARAMS(400000, CR4, Full, C),
  416. __DEFINE_LINK_MODE_PARAMS(100, FX, Half, F),
  417. __DEFINE_LINK_MODE_PARAMS(100, FX, Full, F),
  418. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1L, 1, 1, Full, T),
  419. __DEFINE_LINK_MODE_PARAMS(800000, CR8, Full, C),
  420. __DEFINE_LINK_MODE_PARAMS(800000, KR8, Full, K),
  421. __DEFINE_LINK_MODE_PARAMS(800000, DR8, Full, D),
  422. __DEFINE_LINK_MODE_PARAMS(800000, DR8_2, Full, D),
  423. __DEFINE_LINK_MODE_PARAMS(800000, SR8, Full, S),
  424. __DEFINE_LINK_MODE_PARAMS(800000, VR8, Full, V),
  425. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1S, 1, 1, Full, T),
  426. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1S, 1, 1, Half, T),
  427. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1S_P2MP, 1, 1, Half, T),
  428. __DEFINE_LINK_MODE_PARAMS_PAIRS(10, T1BRR, 1, 1, Full, T),
  429. __DEFINE_LINK_MODE_PARAMS(200000, CR, Full, C),
  430. __DEFINE_LINK_MODE_PARAMS(200000, KR, Full, K),
  431. __DEFINE_LINK_MODE_PARAMS(200000, DR, Full, D),
  432. __DEFINE_LINK_MODE_PARAMS(200000, DR_2, Full, D),
  433. __DEFINE_LINK_MODE_PARAMS(200000, SR, Full, S),
  434. __DEFINE_LINK_MODE_PARAMS(200000, VR, Full, V),
  435. __DEFINE_LINK_MODE_PARAMS(400000, CR2, Full, C),
  436. __DEFINE_LINK_MODE_PARAMS(400000, KR2, Full, K),
  437. __DEFINE_LINK_MODE_PARAMS(400000, DR2, Full, D),
  438. __DEFINE_LINK_MODE_PARAMS(400000, DR2_2, Full, D),
  439. __DEFINE_LINK_MODE_PARAMS(400000, SR2, Full, S),
  440. __DEFINE_LINK_MODE_PARAMS(400000, VR2, Full, V),
  441. __DEFINE_LINK_MODE_PARAMS(800000, CR4, Full, C),
  442. __DEFINE_LINK_MODE_PARAMS(800000, KR4, Full, K),
  443. __DEFINE_LINK_MODE_PARAMS(800000, DR4, Full, D),
  444. __DEFINE_LINK_MODE_PARAMS(800000, DR4_2, Full, D),
  445. __DEFINE_LINK_MODE_PARAMS(800000, SR4, Full, S),
  446. __DEFINE_LINK_MODE_PARAMS(800000, VR4, Full, V),
  447. __DEFINE_LINK_MODE_PARAMS(1600000, CR8, Full, C),
  448. __DEFINE_LINK_MODE_PARAMS(1600000, KR8, Full, K),
  449. __DEFINE_LINK_MODE_PARAMS(1600000, DR8, Full, D),
  450. __DEFINE_LINK_MODE_PARAMS(1600000, DR8_2, Full, D),
  451. };
  452. static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
  453. EXPORT_SYMBOL_GPL(link_mode_params);
  454. static const char ethtool_link_medium_names[][ETH_GSTRING_LEN] = {
  455. [ETHTOOL_LINK_MEDIUM_BASET] = "BaseT",
  456. [ETHTOOL_LINK_MEDIUM_BASEK] = "BaseK",
  457. [ETHTOOL_LINK_MEDIUM_BASES] = "BaseS",
  458. [ETHTOOL_LINK_MEDIUM_BASEC] = "BaseC",
  459. [ETHTOOL_LINK_MEDIUM_BASEL] = "BaseL",
  460. [ETHTOOL_LINK_MEDIUM_BASED] = "BaseD",
  461. [ETHTOOL_LINK_MEDIUM_BASEE] = "BaseE",
  462. [ETHTOOL_LINK_MEDIUM_BASEF] = "BaseF",
  463. [ETHTOOL_LINK_MEDIUM_BASEV] = "BaseV",
  464. [ETHTOOL_LINK_MEDIUM_BASEMLD] = "BaseMLD",
  465. [ETHTOOL_LINK_MEDIUM_NONE] = "None",
  466. };
  467. static_assert(ARRAY_SIZE(ethtool_link_medium_names) == __ETHTOOL_LINK_MEDIUM_LAST);
  468. const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
  469. [NETIF_MSG_DRV_BIT] = "drv",
  470. [NETIF_MSG_PROBE_BIT] = "probe",
  471. [NETIF_MSG_LINK_BIT] = "link",
  472. [NETIF_MSG_TIMER_BIT] = "timer",
  473. [NETIF_MSG_IFDOWN_BIT] = "ifdown",
  474. [NETIF_MSG_IFUP_BIT] = "ifup",
  475. [NETIF_MSG_RX_ERR_BIT] = "rx_err",
  476. [NETIF_MSG_TX_ERR_BIT] = "tx_err",
  477. [NETIF_MSG_TX_QUEUED_BIT] = "tx_queued",
  478. [NETIF_MSG_INTR_BIT] = "intr",
  479. [NETIF_MSG_TX_DONE_BIT] = "tx_done",
  480. [NETIF_MSG_RX_STATUS_BIT] = "rx_status",
  481. [NETIF_MSG_PKTDATA_BIT] = "pktdata",
  482. [NETIF_MSG_HW_BIT] = "hw",
  483. [NETIF_MSG_WOL_BIT] = "wol",
  484. };
  485. static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
  486. const char wol_mode_names[][ETH_GSTRING_LEN] = {
  487. [const_ilog2(WAKE_PHY)] = "phy",
  488. [const_ilog2(WAKE_UCAST)] = "ucast",
  489. [const_ilog2(WAKE_MCAST)] = "mcast",
  490. [const_ilog2(WAKE_BCAST)] = "bcast",
  491. [const_ilog2(WAKE_ARP)] = "arp",
  492. [const_ilog2(WAKE_MAGIC)] = "magic",
  493. [const_ilog2(WAKE_MAGICSECURE)] = "magicsecure",
  494. [const_ilog2(WAKE_FILTER)] = "filter",
  495. };
  496. static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
  497. const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
  498. [const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)] = "hardware-transmit",
  499. [const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)] = "software-transmit",
  500. [const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)] = "hardware-receive",
  501. [const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)] = "software-receive",
  502. [const_ilog2(SOF_TIMESTAMPING_SOFTWARE)] = "software-system-clock",
  503. [const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
  504. [const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
  505. [const_ilog2(SOF_TIMESTAMPING_OPT_ID)] = "option-id",
  506. [const_ilog2(SOF_TIMESTAMPING_TX_SCHED)] = "sched-transmit",
  507. [const_ilog2(SOF_TIMESTAMPING_TX_ACK)] = "ack-transmit",
  508. [const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)] = "option-cmsg",
  509. [const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)] = "option-tsonly",
  510. [const_ilog2(SOF_TIMESTAMPING_OPT_STATS)] = "option-stats",
  511. [const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)] = "option-pktinfo",
  512. [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw",
  513. [const_ilog2(SOF_TIMESTAMPING_BIND_PHC)] = "bind-phc",
  514. [const_ilog2(SOF_TIMESTAMPING_OPT_ID_TCP)] = "option-id-tcp",
  515. [const_ilog2(SOF_TIMESTAMPING_OPT_RX_FILTER)] = "option-rx-filter",
  516. [const_ilog2(SOF_TIMESTAMPING_TX_COMPLETION)] = "tx-completion",
  517. };
  518. static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
  519. const char ts_tx_type_names[][ETH_GSTRING_LEN] = {
  520. [HWTSTAMP_TX_OFF] = "off",
  521. [HWTSTAMP_TX_ON] = "on",
  522. [HWTSTAMP_TX_ONESTEP_SYNC] = "onestep-sync",
  523. [HWTSTAMP_TX_ONESTEP_P2P] = "onestep-p2p",
  524. };
  525. static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
  526. const char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
  527. [HWTSTAMP_FILTER_NONE] = "none",
  528. [HWTSTAMP_FILTER_ALL] = "all",
  529. [HWTSTAMP_FILTER_SOME] = "some",
  530. [HWTSTAMP_FILTER_PTP_V1_L4_EVENT] = "ptpv1-l4-event",
  531. [HWTSTAMP_FILTER_PTP_V1_L4_SYNC] = "ptpv1-l4-sync",
  532. [HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ] = "ptpv1-l4-delay-req",
  533. [HWTSTAMP_FILTER_PTP_V2_L4_EVENT] = "ptpv2-l4-event",
  534. [HWTSTAMP_FILTER_PTP_V2_L4_SYNC] = "ptpv2-l4-sync",
  535. [HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ] = "ptpv2-l4-delay-req",
  536. [HWTSTAMP_FILTER_PTP_V2_L2_EVENT] = "ptpv2-l2-event",
  537. [HWTSTAMP_FILTER_PTP_V2_L2_SYNC] = "ptpv2-l2-sync",
  538. [HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ] = "ptpv2-l2-delay-req",
  539. [HWTSTAMP_FILTER_PTP_V2_EVENT] = "ptpv2-event",
  540. [HWTSTAMP_FILTER_PTP_V2_SYNC] = "ptpv2-sync",
  541. [HWTSTAMP_FILTER_PTP_V2_DELAY_REQ] = "ptpv2-delay-req",
  542. [HWTSTAMP_FILTER_NTP_ALL] = "ntp-all",
  543. };
  544. static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
  545. const char ts_flags_names[][ETH_GSTRING_LEN] = {
  546. [const_ilog2(HWTSTAMP_FLAG_BONDED_PHC_INDEX)] = "bonded-phc-index",
  547. };
  548. static_assert(ARRAY_SIZE(ts_flags_names) == __HWTSTAMP_FLAG_CNT);
  549. const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
  550. [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN] = "vxlan",
  551. [ETHTOOL_UDP_TUNNEL_TYPE_GENEVE] = "geneve",
  552. [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE] = "vxlan-gpe",
  553. };
  554. static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
  555. __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
  556. /* return false if legacy contained non-0 deprecated fields
  557. * maxtxpkt/maxrxpkt. rest of ksettings always updated
  558. */
  559. bool
  560. convert_legacy_settings_to_link_ksettings(
  561. struct ethtool_link_ksettings *link_ksettings,
  562. const struct ethtool_cmd *legacy_settings)
  563. {
  564. bool retval = true;
  565. memset(link_ksettings, 0, sizeof(*link_ksettings));
  566. /* This is used to tell users that driver is still using these
  567. * deprecated legacy fields, and they should not use
  568. * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
  569. */
  570. if (legacy_settings->maxtxpkt ||
  571. legacy_settings->maxrxpkt)
  572. retval = false;
  573. ethtool_convert_legacy_u32_to_link_mode(
  574. link_ksettings->link_modes.supported,
  575. legacy_settings->supported);
  576. ethtool_convert_legacy_u32_to_link_mode(
  577. link_ksettings->link_modes.advertising,
  578. legacy_settings->advertising);
  579. ethtool_convert_legacy_u32_to_link_mode(
  580. link_ksettings->link_modes.lp_advertising,
  581. legacy_settings->lp_advertising);
  582. link_ksettings->base.speed
  583. = ethtool_cmd_speed(legacy_settings);
  584. link_ksettings->base.duplex
  585. = legacy_settings->duplex;
  586. link_ksettings->base.port
  587. = legacy_settings->port;
  588. link_ksettings->base.phy_address
  589. = legacy_settings->phy_address;
  590. link_ksettings->base.autoneg
  591. = legacy_settings->autoneg;
  592. link_ksettings->base.mdio_support
  593. = legacy_settings->mdio_support;
  594. link_ksettings->base.eth_tp_mdix
  595. = legacy_settings->eth_tp_mdix;
  596. link_ksettings->base.eth_tp_mdix_ctrl
  597. = legacy_settings->eth_tp_mdix_ctrl;
  598. return retval;
  599. }
  600. int __ethtool_get_link(struct net_device *dev)
  601. {
  602. if (!dev->ethtool_ops->get_link)
  603. return -EOPNOTSUPP;
  604. return netif_running(dev) && dev->ethtool_ops->get_link(dev);
  605. }
  606. int ethtool_get_rx_ring_count(struct net_device *dev)
  607. {
  608. const struct ethtool_ops *ops = dev->ethtool_ops;
  609. if (!ops->get_rx_ring_count)
  610. return -EOPNOTSUPP;
  611. return ops->get_rx_ring_count(dev);
  612. }
  613. static int ethtool_get_rxnfc_rule_count(struct net_device *dev)
  614. {
  615. const struct ethtool_ops *ops = dev->ethtool_ops;
  616. struct ethtool_rxnfc info = {
  617. .cmd = ETHTOOL_GRXCLSRLCNT,
  618. };
  619. int err;
  620. err = ops->get_rxnfc(dev, &info, NULL);
  621. if (err)
  622. return err;
  623. return info.rule_cnt;
  624. }
  625. /* Max offset for one RSS context */
  626. static u32 ethtool_get_rss_ctx_max_channel(struct ethtool_rxfh_context *ctx)
  627. {
  628. u32 max_ring = 0;
  629. u32 i, *tbl;
  630. if (WARN_ON_ONCE(!ctx))
  631. return 0;
  632. tbl = ethtool_rxfh_context_indir(ctx);
  633. for (i = 0; i < ctx->indir_size; i++)
  634. max_ring = max(max_ring, tbl[i]);
  635. return max_ring;
  636. }
  637. static int ethtool_get_max_rxnfc_channel(struct net_device *dev, u64 *max)
  638. {
  639. const struct ethtool_ops *ops = dev->ethtool_ops;
  640. struct ethtool_rxnfc *info;
  641. int err, i, rule_cnt;
  642. u64 max_ring = 0;
  643. if (!ops->get_rxnfc)
  644. return -EOPNOTSUPP;
  645. rule_cnt = ethtool_get_rxnfc_rule_count(dev);
  646. if (rule_cnt <= 0)
  647. return -EINVAL;
  648. info = kvzalloc_flex(*info, rule_locs, rule_cnt);
  649. if (!info)
  650. return -ENOMEM;
  651. info->cmd = ETHTOOL_GRXCLSRLALL;
  652. info->rule_cnt = rule_cnt;
  653. err = ops->get_rxnfc(dev, info, info->rule_locs);
  654. if (err)
  655. goto err_free_info;
  656. for (i = 0; i < rule_cnt; i++) {
  657. struct ethtool_rxnfc rule_info = {
  658. .cmd = ETHTOOL_GRXCLSRULE,
  659. .fs.location = info->rule_locs[i],
  660. };
  661. err = ops->get_rxnfc(dev, &rule_info, NULL);
  662. if (err)
  663. goto err_free_info;
  664. if (rule_info.fs.ring_cookie != RX_CLS_FLOW_DISC &&
  665. rule_info.fs.ring_cookie != RX_CLS_FLOW_WAKE &&
  666. !ethtool_get_flow_spec_ring_vf(rule_info.fs.ring_cookie)) {
  667. u64 ring = rule_info.fs.ring_cookie;
  668. if (rule_info.flow_type & FLOW_RSS) {
  669. struct ethtool_rxfh_context *ctx;
  670. ctx = xa_load(&dev->ethtool->rss_ctx,
  671. rule_info.rss_context);
  672. ring += ethtool_get_rss_ctx_max_channel(ctx);
  673. }
  674. max_ring = max_t(u64, max_ring, ring);
  675. }
  676. }
  677. kvfree(info);
  678. *max = max_ring;
  679. return 0;
  680. err_free_info:
  681. kvfree(info);
  682. return err;
  683. }
  684. /* Max offset across all of a device's RSS contexts */
  685. static u32 ethtool_get_max_rss_ctx_channel(struct net_device *dev)
  686. {
  687. struct ethtool_rxfh_context *ctx;
  688. unsigned long context;
  689. u32 max_ring = 0;
  690. mutex_lock(&dev->ethtool->rss_lock);
  691. xa_for_each(&dev->ethtool->rss_ctx, context, ctx)
  692. max_ring = max(max_ring, ethtool_get_rss_ctx_max_channel(ctx));
  693. mutex_unlock(&dev->ethtool->rss_lock);
  694. return max_ring;
  695. }
  696. static u32 ethtool_get_max_rxfh_channel(struct net_device *dev)
  697. {
  698. struct ethtool_rxfh_param rxfh = {};
  699. u32 dev_size, current_max = 0;
  700. int ret;
  701. /* While we do track whether RSS context has an indirection
  702. * table explicitly set by the user, no driver looks at that bit.
  703. * Assume drivers won't auto-regenerate the additional tables,
  704. * to be safe.
  705. */
  706. current_max = ethtool_get_max_rss_ctx_channel(dev);
  707. if (!netif_is_rxfh_configured(dev))
  708. return current_max;
  709. if (!dev->ethtool_ops->get_rxfh_indir_size ||
  710. !dev->ethtool_ops->get_rxfh)
  711. return current_max;
  712. dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
  713. if (dev_size == 0)
  714. return current_max;
  715. rxfh.indir = kzalloc_objs(rxfh.indir[0], dev_size, GFP_USER);
  716. if (!rxfh.indir)
  717. return U32_MAX;
  718. mutex_lock(&dev->ethtool->rss_lock);
  719. ret = dev->ethtool_ops->get_rxfh(dev, &rxfh);
  720. mutex_unlock(&dev->ethtool->rss_lock);
  721. if (ret) {
  722. current_max = U32_MAX;
  723. goto out_free;
  724. }
  725. while (dev_size--)
  726. current_max = max(current_max, rxfh.indir[dev_size]);
  727. out_free:
  728. kfree(rxfh.indir);
  729. return current_max;
  730. }
  731. int ethtool_check_max_channel(struct net_device *dev,
  732. struct ethtool_channels channels,
  733. struct genl_info *info)
  734. {
  735. u64 max_rxnfc_in_use;
  736. u32 max_rxfh_in_use;
  737. int max_mp_in_use;
  738. /* ensure the new Rx count fits within the configured Rx flow
  739. * indirection table/rxnfc settings
  740. */
  741. if (ethtool_get_max_rxnfc_channel(dev, &max_rxnfc_in_use))
  742. max_rxnfc_in_use = 0;
  743. max_rxfh_in_use = ethtool_get_max_rxfh_channel(dev);
  744. if (channels.combined_count + channels.rx_count <= max_rxfh_in_use) {
  745. if (info)
  746. GENL_SET_ERR_MSG_FMT(info, "requested channel counts are too low for existing indirection table (%d)", max_rxfh_in_use);
  747. return -EINVAL;
  748. }
  749. if (channels.combined_count + channels.rx_count <= max_rxnfc_in_use) {
  750. if (info)
  751. GENL_SET_ERR_MSG(info, "requested channel counts are too low for existing ntuple filter settings");
  752. return -EINVAL;
  753. }
  754. max_mp_in_use = dev_get_min_mp_channel_count(dev);
  755. if (channels.combined_count + channels.rx_count <= max_mp_in_use) {
  756. if (info)
  757. GENL_SET_ERR_MSG_FMT(info, "requested channel counts are too low for existing memory provider setting (%d)", max_mp_in_use);
  758. return -EINVAL;
  759. }
  760. return 0;
  761. }
  762. int ethtool_check_rss_ctx_busy(struct net_device *dev, u32 rss_context)
  763. {
  764. const struct ethtool_ops *ops = dev->ethtool_ops;
  765. struct ethtool_rxnfc *info;
  766. int rc, i, rule_cnt;
  767. if (!ops->get_rxnfc)
  768. return 0;
  769. rule_cnt = ethtool_get_rxnfc_rule_count(dev);
  770. if (!rule_cnt)
  771. return 0;
  772. if (rule_cnt < 0)
  773. return -EINVAL;
  774. info = kvzalloc_flex(*info, rule_locs, rule_cnt);
  775. if (!info)
  776. return -ENOMEM;
  777. info->cmd = ETHTOOL_GRXCLSRLALL;
  778. info->rule_cnt = rule_cnt;
  779. rc = ops->get_rxnfc(dev, info, info->rule_locs);
  780. if (rc)
  781. goto out_free;
  782. for (i = 0; i < rule_cnt; i++) {
  783. struct ethtool_rxnfc rule_info = {
  784. .cmd = ETHTOOL_GRXCLSRULE,
  785. .fs.location = info->rule_locs[i],
  786. };
  787. rc = ops->get_rxnfc(dev, &rule_info, NULL);
  788. if (rc)
  789. goto out_free;
  790. if (rule_info.fs.flow_type & FLOW_RSS &&
  791. rule_info.rss_context == rss_context) {
  792. rc = -EBUSY;
  793. goto out_free;
  794. }
  795. }
  796. out_free:
  797. kvfree(info);
  798. return rc;
  799. }
  800. struct ethtool_rxfh_context *
  801. ethtool_rxfh_ctx_alloc(const struct ethtool_ops *ops,
  802. u32 indir_size, u32 key_size)
  803. {
  804. size_t indir_bytes, flex_len, key_off, size;
  805. struct ethtool_rxfh_context *ctx;
  806. u32 priv_bytes, indir_max;
  807. u16 key_max;
  808. key_max = max(key_size, ops->rxfh_key_space);
  809. indir_max = max(indir_size, ops->rxfh_indir_space);
  810. priv_bytes = ALIGN(ops->rxfh_priv_size, sizeof(u32));
  811. indir_bytes = array_size(indir_max, sizeof(u32));
  812. key_off = size_add(priv_bytes, indir_bytes);
  813. flex_len = size_add(key_off, key_max);
  814. size = struct_size_t(struct ethtool_rxfh_context, data, flex_len);
  815. ctx = kzalloc(size, GFP_KERNEL_ACCOUNT);
  816. if (!ctx)
  817. return NULL;
  818. ctx->indir_size = indir_size;
  819. ctx->key_size = key_size;
  820. ctx->key_off = key_off;
  821. ctx->priv_size = ops->rxfh_priv_size;
  822. return ctx;
  823. }
  824. /* Check if fields configured for flow hash are symmetric - if src is included
  825. * so is dst and vice versa.
  826. */
  827. int ethtool_rxfh_config_is_sym(u64 rxfh)
  828. {
  829. bool sym;
  830. sym = rxfh == (rxfh & (RXH_IP_SRC | RXH_IP_DST |
  831. RXH_L4_B_0_1 | RXH_L4_B_2_3));
  832. sym &= !!(rxfh & RXH_IP_SRC) == !!(rxfh & RXH_IP_DST);
  833. sym &= !!(rxfh & RXH_L4_B_0_1) == !!(rxfh & RXH_L4_B_2_3);
  834. return sym;
  835. }
  836. int ethtool_check_ops(const struct ethtool_ops *ops)
  837. {
  838. if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
  839. return -EINVAL;
  840. if (WARN_ON(ops->rxfh_max_num_contexts == 1))
  841. return -EINVAL;
  842. if (WARN_ON(ops->supported_input_xfrm && !ops->get_rxfh_fields))
  843. return -EINVAL;
  844. if (WARN_ON(ops->supported_input_xfrm &&
  845. ops->rxfh_per_ctx_fields != ops->rxfh_per_ctx_key))
  846. return -EINVAL;
  847. /* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
  848. * the fact that ops are checked at registration time does not
  849. * mean the ops attached to a netdev later on are sane.
  850. */
  851. return 0;
  852. }
  853. void ethtool_ringparam_get_cfg(struct net_device *dev,
  854. struct ethtool_ringparam *param,
  855. struct kernel_ethtool_ringparam *kparam,
  856. struct netlink_ext_ack *extack)
  857. {
  858. memset(param, 0, sizeof(*param));
  859. memset(kparam, 0, sizeof(*kparam));
  860. param->cmd = ETHTOOL_GRINGPARAM;
  861. dev->ethtool_ops->get_ringparam(dev, param, kparam, extack);
  862. /* Driver gives us current state, we want to return current config */
  863. kparam->tcp_data_split = dev->cfg->hds_config;
  864. kparam->hds_thresh = dev->cfg->hds_thresh;
  865. }
  866. static void ethtool_init_tsinfo(struct kernel_ethtool_ts_info *info)
  867. {
  868. memset(info, 0, sizeof(*info));
  869. info->cmd = ETHTOOL_GET_TS_INFO;
  870. info->phc_index = -1;
  871. }
  872. int ethtool_net_get_ts_info_by_phc(struct net_device *dev,
  873. struct kernel_ethtool_ts_info *info,
  874. struct hwtstamp_provider_desc *hwprov_desc)
  875. {
  876. const struct ethtool_ops *ops = dev->ethtool_ops;
  877. int err;
  878. if (!ops->get_ts_info)
  879. return -EOPNOTSUPP;
  880. /* Does ptp comes from netdev */
  881. ethtool_init_tsinfo(info);
  882. info->phc_qualifier = hwprov_desc->qualifier;
  883. err = ops->get_ts_info(dev, info);
  884. if (err)
  885. return err;
  886. if (info->phc_index == hwprov_desc->index &&
  887. net_support_hwtstamp_qualifier(dev, hwprov_desc->qualifier))
  888. return 0;
  889. return -ENODEV;
  890. }
  891. struct phy_device *
  892. ethtool_phy_get_ts_info_by_phc(struct net_device *dev,
  893. struct kernel_ethtool_ts_info *info,
  894. struct hwtstamp_provider_desc *hwprov_desc)
  895. {
  896. int err;
  897. /* Only precise qualifier is supported in phydev */
  898. if (hwprov_desc->qualifier != HWTSTAMP_PROVIDER_QUALIFIER_PRECISE)
  899. return ERR_PTR(-ENODEV);
  900. /* Look in the phy topology */
  901. if (dev->link_topo) {
  902. struct phy_device_node *pdn;
  903. unsigned long phy_index;
  904. xa_for_each(&dev->link_topo->phys, phy_index, pdn) {
  905. if (!phy_has_tsinfo(pdn->phy))
  906. continue;
  907. ethtool_init_tsinfo(info);
  908. err = phy_ts_info(pdn->phy, info);
  909. if (err)
  910. return ERR_PTR(err);
  911. if (info->phc_index == hwprov_desc->index)
  912. return pdn->phy;
  913. }
  914. return ERR_PTR(-ENODEV);
  915. }
  916. /* Look on the dev->phydev */
  917. if (phy_has_tsinfo(dev->phydev)) {
  918. ethtool_init_tsinfo(info);
  919. err = phy_ts_info(dev->phydev, info);
  920. if (err)
  921. return ERR_PTR(err);
  922. if (info->phc_index == hwprov_desc->index)
  923. return dev->phydev;
  924. }
  925. return ERR_PTR(-ENODEV);
  926. }
  927. int ethtool_get_ts_info_by_phc(struct net_device *dev,
  928. struct kernel_ethtool_ts_info *info,
  929. struct hwtstamp_provider_desc *hwprov_desc)
  930. {
  931. int err;
  932. err = ethtool_net_get_ts_info_by_phc(dev, info, hwprov_desc);
  933. if (err == -ENODEV || err == -EOPNOTSUPP) {
  934. struct phy_device *phy;
  935. phy = ethtool_phy_get_ts_info_by_phc(dev, info, hwprov_desc);
  936. if (IS_ERR(phy))
  937. return PTR_ERR(phy);
  938. /* Report the phc source only if we have a real
  939. * phc source with an index.
  940. */
  941. if (info->phc_index >= 0) {
  942. info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
  943. info->phc_phyindex = phy->phyindex;
  944. }
  945. err = 0;
  946. } else if (!err && info->phc_index >= 0) {
  947. info->phc_source = HWTSTAMP_SOURCE_NETDEV;
  948. }
  949. info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
  950. SOF_TIMESTAMPING_SOFTWARE;
  951. return err;
  952. }
  953. int __ethtool_get_ts_info(struct net_device *dev,
  954. struct kernel_ethtool_ts_info *info)
  955. {
  956. struct hwtstamp_provider *hwprov;
  957. int err = 0;
  958. rcu_read_lock();
  959. hwprov = rcu_dereference(dev->hwprov);
  960. /* No provider specified, use default behavior */
  961. if (!hwprov) {
  962. const struct ethtool_ops *ops = dev->ethtool_ops;
  963. struct phy_device *phydev = dev->phydev;
  964. ethtool_init_tsinfo(info);
  965. if (phy_is_default_hwtstamp(phydev) &&
  966. phy_has_tsinfo(phydev)) {
  967. err = phy_ts_info(phydev, info);
  968. /* Report the phc source only if we have a real
  969. * phc source with an index.
  970. */
  971. if (!err && info->phc_index >= 0) {
  972. info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
  973. info->phc_phyindex = phydev->phyindex;
  974. }
  975. } else if (ops->get_ts_info) {
  976. err = ops->get_ts_info(dev, info);
  977. if (!err && info->phc_index >= 0)
  978. info->phc_source = HWTSTAMP_SOURCE_NETDEV;
  979. }
  980. info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
  981. SOF_TIMESTAMPING_SOFTWARE;
  982. rcu_read_unlock();
  983. return err;
  984. }
  985. err = ethtool_get_ts_info_by_phc(dev, info, &hwprov->desc);
  986. rcu_read_unlock();
  987. return err;
  988. }
  989. bool net_support_hwtstamp_qualifier(struct net_device *dev,
  990. enum hwtstamp_provider_qualifier qualifier)
  991. {
  992. const struct ethtool_ops *ops = dev->ethtool_ops;
  993. if (!ops)
  994. return false;
  995. /* Return true with precise qualifier and with NIC without
  996. * qualifier description to not break the old behavior.
  997. */
  998. if (!ops->supported_hwtstamp_qualifiers &&
  999. qualifier == HWTSTAMP_PROVIDER_QUALIFIER_PRECISE)
  1000. return true;
  1001. if (ops->supported_hwtstamp_qualifiers & BIT(qualifier))
  1002. return true;
  1003. return false;
  1004. }
  1005. int ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index)
  1006. {
  1007. struct kernel_ethtool_ts_info info = { };
  1008. int num = 0;
  1009. if (!__ethtool_get_ts_info(dev, &info))
  1010. num = ptp_get_vclocks_index(info.phc_index, vclock_index);
  1011. return num;
  1012. }
  1013. EXPORT_SYMBOL(ethtool_get_phc_vclocks);
  1014. int ethtool_get_ts_info_by_layer(struct net_device *dev, struct kernel_ethtool_ts_info *info)
  1015. {
  1016. return __ethtool_get_ts_info(dev, info);
  1017. }
  1018. EXPORT_SYMBOL(ethtool_get_ts_info_by_layer);
  1019. const struct ethtool_phy_ops *ethtool_phy_ops;
  1020. void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
  1021. {
  1022. ASSERT_RTNL();
  1023. ethtool_phy_ops = ops;
  1024. }
  1025. EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);
  1026. void
  1027. ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
  1028. enum ethtool_link_mode_bit_indices link_mode)
  1029. {
  1030. const struct link_mode_info *link_info;
  1031. if (WARN_ON_ONCE(link_mode >= __ETHTOOL_LINK_MODE_MASK_NBITS))
  1032. return;
  1033. link_info = &link_mode_params[link_mode];
  1034. link_ksettings->base.speed = link_info->speed;
  1035. link_ksettings->lanes = link_info->lanes;
  1036. link_ksettings->base.duplex = link_info->duplex;
  1037. }
  1038. EXPORT_SYMBOL_GPL(ethtool_params_from_link_mode);
  1039. /**
  1040. * ethtool_forced_speed_maps_init
  1041. * @maps: Pointer to an array of Ethtool forced speed map
  1042. * @size: Array size
  1043. *
  1044. * Initialize an array of Ethtool forced speed map to Ethtool link modes. This
  1045. * should be called during driver module init.
  1046. */
  1047. void
  1048. ethtool_forced_speed_maps_init(struct ethtool_forced_speed_map *maps, u32 size)
  1049. {
  1050. for (u32 i = 0; i < size; i++) {
  1051. struct ethtool_forced_speed_map *map = &maps[i];
  1052. linkmode_set_bit_array(map->cap_arr, map->arr_size, map->caps);
  1053. map->cap_arr = NULL;
  1054. map->arr_size = 0;
  1055. }
  1056. }
  1057. EXPORT_SYMBOL_GPL(ethtool_forced_speed_maps_init);
  1058. void ethtool_rxfh_context_lost(struct net_device *dev, u32 context_id)
  1059. {
  1060. struct ethtool_rxfh_context *ctx;
  1061. WARN_ONCE(!rtnl_is_locked() &&
  1062. !lockdep_is_held_type(&dev->ethtool->rss_lock, -1),
  1063. "RSS context lock assertion failed\n");
  1064. netdev_err(dev, "device error, RSS context %d lost\n", context_id);
  1065. ctx = xa_erase(&dev->ethtool->rss_ctx, context_id);
  1066. kfree(ctx);
  1067. ethtool_rss_notify(dev, ETHTOOL_MSG_RSS_DELETE_NTF, context_id);
  1068. }
  1069. EXPORT_SYMBOL(ethtool_rxfh_context_lost);
  1070. enum ethtool_link_medium ethtool_str_to_medium(const char *str)
  1071. {
  1072. int i;
  1073. for (i = 0; i < __ETHTOOL_LINK_MEDIUM_LAST; i++)
  1074. if (!strcmp(ethtool_link_medium_names[i], str))
  1075. return i;
  1076. return ETHTOOL_LINK_MEDIUM_NONE;
  1077. }
  1078. EXPORT_SYMBOL_GPL(ethtool_str_to_medium);