common.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  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 "common.h"
  8. const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
  9. [NETIF_F_SG_BIT] = "tx-scatter-gather",
  10. [NETIF_F_IP_CSUM_BIT] = "tx-checksum-ipv4",
  11. [NETIF_F_HW_CSUM_BIT] = "tx-checksum-ip-generic",
  12. [NETIF_F_IPV6_CSUM_BIT] = "tx-checksum-ipv6",
  13. [NETIF_F_HIGHDMA_BIT] = "highdma",
  14. [NETIF_F_FRAGLIST_BIT] = "tx-scatter-gather-fraglist",
  15. [NETIF_F_HW_VLAN_CTAG_TX_BIT] = "tx-vlan-hw-insert",
  16. [NETIF_F_HW_VLAN_CTAG_RX_BIT] = "rx-vlan-hw-parse",
  17. [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
  18. [NETIF_F_HW_VLAN_STAG_TX_BIT] = "tx-vlan-stag-hw-insert",
  19. [NETIF_F_HW_VLAN_STAG_RX_BIT] = "rx-vlan-stag-hw-parse",
  20. [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
  21. [NETIF_F_VLAN_CHALLENGED_BIT] = "vlan-challenged",
  22. [NETIF_F_GSO_BIT] = "tx-generic-segmentation",
  23. [NETIF_F_LLTX_BIT] = "tx-lockless",
  24. [NETIF_F_NETNS_LOCAL_BIT] = "netns-local",
  25. [NETIF_F_GRO_BIT] = "rx-gro",
  26. [NETIF_F_GRO_HW_BIT] = "rx-gro-hw",
  27. [NETIF_F_LRO_BIT] = "rx-lro",
  28. [NETIF_F_TSO_BIT] = "tx-tcp-segmentation",
  29. [NETIF_F_GSO_ROBUST_BIT] = "tx-gso-robust",
  30. [NETIF_F_TSO_ECN_BIT] = "tx-tcp-ecn-segmentation",
  31. [NETIF_F_TSO_MANGLEID_BIT] = "tx-tcp-mangleid-segmentation",
  32. [NETIF_F_TSO6_BIT] = "tx-tcp6-segmentation",
  33. [NETIF_F_FSO_BIT] = "tx-fcoe-segmentation",
  34. [NETIF_F_GSO_GRE_BIT] = "tx-gre-segmentation",
  35. [NETIF_F_GSO_GRE_CSUM_BIT] = "tx-gre-csum-segmentation",
  36. [NETIF_F_GSO_IPXIP4_BIT] = "tx-ipxip4-segmentation",
  37. [NETIF_F_GSO_IPXIP6_BIT] = "tx-ipxip6-segmentation",
  38. [NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation",
  39. [NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
  40. [NETIF_F_GSO_PARTIAL_BIT] = "tx-gso-partial",
  41. [NETIF_F_GSO_TUNNEL_REMCSUM_BIT] = "tx-tunnel-remcsum-segmentation",
  42. [NETIF_F_GSO_SCTP_BIT] = "tx-sctp-segmentation",
  43. [NETIF_F_GSO_ESP_BIT] = "tx-esp-segmentation",
  44. [NETIF_F_GSO_UDP_L4_BIT] = "tx-udp-segmentation",
  45. [NETIF_F_GSO_FRAGLIST_BIT] = "tx-gso-list",
  46. [NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc",
  47. [NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp",
  48. [NETIF_F_FCOE_MTU_BIT] = "fcoe-mtu",
  49. [NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter",
  50. [NETIF_F_RXHASH_BIT] = "rx-hashing",
  51. [NETIF_F_RXCSUM_BIT] = "rx-checksum",
  52. [NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy",
  53. [NETIF_F_LOOPBACK_BIT] = "loopback",
  54. [NETIF_F_RXFCS_BIT] = "rx-fcs",
  55. [NETIF_F_RXALL_BIT] = "rx-all",
  56. [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
  57. [NETIF_F_HW_TC_BIT] = "hw-tc-offload",
  58. [NETIF_F_HW_ESP_BIT] = "esp-hw-offload",
  59. [NETIF_F_HW_ESP_TX_CSUM_BIT] = "esp-tx-csum-hw-offload",
  60. [NETIF_F_RX_UDP_TUNNEL_PORT_BIT] = "rx-udp_tunnel-port-offload",
  61. [NETIF_F_HW_TLS_RECORD_BIT] = "tls-hw-record",
  62. [NETIF_F_HW_TLS_TX_BIT] = "tls-hw-tx-offload",
  63. [NETIF_F_HW_TLS_RX_BIT] = "tls-hw-rx-offload",
  64. [NETIF_F_GRO_FRAGLIST_BIT] = "rx-gro-list",
  65. [NETIF_F_HW_MACSEC_BIT] = "macsec-hw-offload",
  66. [NETIF_F_GRO_UDP_FWD_BIT] = "rx-udp-gro-forwarding",
  67. [NETIF_F_HW_HSR_TAG_INS_BIT] = "hsr-tag-ins-offload",
  68. [NETIF_F_HW_HSR_TAG_RM_BIT] = "hsr-tag-rm-offload",
  69. [NETIF_F_HW_HSR_FWD_BIT] = "hsr-fwd-offload",
  70. [NETIF_F_HW_HSR_DUP_BIT] = "hsr-dup-offload",
  71. };
  72. const char
  73. rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
  74. [ETH_RSS_HASH_TOP_BIT] = "toeplitz",
  75. [ETH_RSS_HASH_XOR_BIT] = "xor",
  76. [ETH_RSS_HASH_CRC32_BIT] = "crc32",
  77. };
  78. const char
  79. tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
  80. [ETHTOOL_ID_UNSPEC] = "Unspec",
  81. [ETHTOOL_RX_COPYBREAK] = "rx-copybreak",
  82. [ETHTOOL_TX_COPYBREAK] = "tx-copybreak",
  83. [ETHTOOL_PFC_PREVENTION_TOUT] = "pfc-prevention-tout",
  84. [ETHTOOL_TX_COPYBREAK_BUF_SIZE] = "tx-copybreak-buf-size",
  85. };
  86. const char
  87. phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
  88. [ETHTOOL_ID_UNSPEC] = "Unspec",
  89. [ETHTOOL_PHY_DOWNSHIFT] = "phy-downshift",
  90. [ETHTOOL_PHY_FAST_LINK_DOWN] = "phy-fast-link-down",
  91. [ETHTOOL_PHY_EDPD] = "phy-energy-detect-power-down",
  92. };
  93. #define __LINK_MODE_NAME(speed, type, duplex) \
  94. #speed "base" #type "/" #duplex
  95. #define __DEFINE_LINK_MODE_NAME(speed, type, duplex) \
  96. [ETHTOOL_LINK_MODE(speed, type, duplex)] = \
  97. __LINK_MODE_NAME(speed, type, duplex)
  98. #define __DEFINE_SPECIAL_MODE_NAME(_mode, _name) \
  99. [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = _name
  100. const char link_mode_names[][ETH_GSTRING_LEN] = {
  101. __DEFINE_LINK_MODE_NAME(10, T, Half),
  102. __DEFINE_LINK_MODE_NAME(10, T, Full),
  103. __DEFINE_LINK_MODE_NAME(100, T, Half),
  104. __DEFINE_LINK_MODE_NAME(100, T, Full),
  105. __DEFINE_LINK_MODE_NAME(1000, T, Half),
  106. __DEFINE_LINK_MODE_NAME(1000, T, Full),
  107. __DEFINE_SPECIAL_MODE_NAME(Autoneg, "Autoneg"),
  108. __DEFINE_SPECIAL_MODE_NAME(TP, "TP"),
  109. __DEFINE_SPECIAL_MODE_NAME(AUI, "AUI"),
  110. __DEFINE_SPECIAL_MODE_NAME(MII, "MII"),
  111. __DEFINE_SPECIAL_MODE_NAME(FIBRE, "FIBRE"),
  112. __DEFINE_SPECIAL_MODE_NAME(BNC, "BNC"),
  113. __DEFINE_LINK_MODE_NAME(10000, T, Full),
  114. __DEFINE_SPECIAL_MODE_NAME(Pause, "Pause"),
  115. __DEFINE_SPECIAL_MODE_NAME(Asym_Pause, "Asym_Pause"),
  116. __DEFINE_LINK_MODE_NAME(2500, X, Full),
  117. __DEFINE_SPECIAL_MODE_NAME(Backplane, "Backplane"),
  118. __DEFINE_LINK_MODE_NAME(1000, KX, Full),
  119. __DEFINE_LINK_MODE_NAME(10000, KX4, Full),
  120. __DEFINE_LINK_MODE_NAME(10000, KR, Full),
  121. __DEFINE_SPECIAL_MODE_NAME(10000baseR_FEC, "10000baseR_FEC"),
  122. __DEFINE_LINK_MODE_NAME(20000, MLD2, Full),
  123. __DEFINE_LINK_MODE_NAME(20000, KR2, Full),
  124. __DEFINE_LINK_MODE_NAME(40000, KR4, Full),
  125. __DEFINE_LINK_MODE_NAME(40000, CR4, Full),
  126. __DEFINE_LINK_MODE_NAME(40000, SR4, Full),
  127. __DEFINE_LINK_MODE_NAME(40000, LR4, Full),
  128. __DEFINE_LINK_MODE_NAME(56000, KR4, Full),
  129. __DEFINE_LINK_MODE_NAME(56000, CR4, Full),
  130. __DEFINE_LINK_MODE_NAME(56000, SR4, Full),
  131. __DEFINE_LINK_MODE_NAME(56000, LR4, Full),
  132. __DEFINE_LINK_MODE_NAME(25000, CR, Full),
  133. __DEFINE_LINK_MODE_NAME(25000, KR, Full),
  134. __DEFINE_LINK_MODE_NAME(25000, SR, Full),
  135. __DEFINE_LINK_MODE_NAME(50000, CR2, Full),
  136. __DEFINE_LINK_MODE_NAME(50000, KR2, Full),
  137. __DEFINE_LINK_MODE_NAME(100000, KR4, Full),
  138. __DEFINE_LINK_MODE_NAME(100000, SR4, Full),
  139. __DEFINE_LINK_MODE_NAME(100000, CR4, Full),
  140. __DEFINE_LINK_MODE_NAME(100000, LR4_ER4, Full),
  141. __DEFINE_LINK_MODE_NAME(50000, SR2, Full),
  142. __DEFINE_LINK_MODE_NAME(1000, X, Full),
  143. __DEFINE_LINK_MODE_NAME(10000, CR, Full),
  144. __DEFINE_LINK_MODE_NAME(10000, SR, Full),
  145. __DEFINE_LINK_MODE_NAME(10000, LR, Full),
  146. __DEFINE_LINK_MODE_NAME(10000, LRM, Full),
  147. __DEFINE_LINK_MODE_NAME(10000, ER, Full),
  148. __DEFINE_LINK_MODE_NAME(2500, T, Full),
  149. __DEFINE_LINK_MODE_NAME(5000, T, Full),
  150. __DEFINE_SPECIAL_MODE_NAME(FEC_NONE, "None"),
  151. __DEFINE_SPECIAL_MODE_NAME(FEC_RS, "RS"),
  152. __DEFINE_SPECIAL_MODE_NAME(FEC_BASER, "BASER"),
  153. __DEFINE_LINK_MODE_NAME(50000, KR, Full),
  154. __DEFINE_LINK_MODE_NAME(50000, SR, Full),
  155. __DEFINE_LINK_MODE_NAME(50000, CR, Full),
  156. __DEFINE_LINK_MODE_NAME(50000, LR_ER_FR, Full),
  157. __DEFINE_LINK_MODE_NAME(50000, DR, Full),
  158. __DEFINE_LINK_MODE_NAME(100000, KR2, Full),
  159. __DEFINE_LINK_MODE_NAME(100000, SR2, Full),
  160. __DEFINE_LINK_MODE_NAME(100000, CR2, Full),
  161. __DEFINE_LINK_MODE_NAME(100000, LR2_ER2_FR2, Full),
  162. __DEFINE_LINK_MODE_NAME(100000, DR2, Full),
  163. __DEFINE_LINK_MODE_NAME(200000, KR4, Full),
  164. __DEFINE_LINK_MODE_NAME(200000, SR4, Full),
  165. __DEFINE_LINK_MODE_NAME(200000, LR4_ER4_FR4, Full),
  166. __DEFINE_LINK_MODE_NAME(200000, DR4, Full),
  167. __DEFINE_LINK_MODE_NAME(200000, CR4, Full),
  168. __DEFINE_LINK_MODE_NAME(100, T1, Full),
  169. __DEFINE_LINK_MODE_NAME(1000, T1, Full),
  170. __DEFINE_LINK_MODE_NAME(400000, KR8, Full),
  171. __DEFINE_LINK_MODE_NAME(400000, SR8, Full),
  172. __DEFINE_LINK_MODE_NAME(400000, LR8_ER8_FR8, Full),
  173. __DEFINE_LINK_MODE_NAME(400000, DR8, Full),
  174. __DEFINE_LINK_MODE_NAME(400000, CR8, Full),
  175. __DEFINE_SPECIAL_MODE_NAME(FEC_LLRS, "LLRS"),
  176. __DEFINE_LINK_MODE_NAME(100000, KR, Full),
  177. __DEFINE_LINK_MODE_NAME(100000, SR, Full),
  178. __DEFINE_LINK_MODE_NAME(100000, LR_ER_FR, Full),
  179. __DEFINE_LINK_MODE_NAME(100000, DR, Full),
  180. __DEFINE_LINK_MODE_NAME(100000, CR, Full),
  181. __DEFINE_LINK_MODE_NAME(200000, KR2, Full),
  182. __DEFINE_LINK_MODE_NAME(200000, SR2, Full),
  183. __DEFINE_LINK_MODE_NAME(200000, LR2_ER2_FR2, Full),
  184. __DEFINE_LINK_MODE_NAME(200000, DR2, Full),
  185. __DEFINE_LINK_MODE_NAME(200000, CR2, Full),
  186. __DEFINE_LINK_MODE_NAME(400000, KR4, Full),
  187. __DEFINE_LINK_MODE_NAME(400000, SR4, Full),
  188. __DEFINE_LINK_MODE_NAME(400000, LR4_ER4_FR4, Full),
  189. __DEFINE_LINK_MODE_NAME(400000, DR4, Full),
  190. __DEFINE_LINK_MODE_NAME(400000, CR4, Full),
  191. __DEFINE_LINK_MODE_NAME(100, FX, Half),
  192. __DEFINE_LINK_MODE_NAME(100, FX, Full),
  193. __DEFINE_LINK_MODE_NAME(10, T1L, Full),
  194. };
  195. static_assert(ARRAY_SIZE(link_mode_names) == __ETHTOOL_LINK_MODE_MASK_NBITS);
  196. #define __LINK_MODE_LANES_CR 1
  197. #define __LINK_MODE_LANES_CR2 2
  198. #define __LINK_MODE_LANES_CR4 4
  199. #define __LINK_MODE_LANES_CR8 8
  200. #define __LINK_MODE_LANES_DR 1
  201. #define __LINK_MODE_LANES_DR2 2
  202. #define __LINK_MODE_LANES_DR4 4
  203. #define __LINK_MODE_LANES_DR8 8
  204. #define __LINK_MODE_LANES_KR 1
  205. #define __LINK_MODE_LANES_KR2 2
  206. #define __LINK_MODE_LANES_KR4 4
  207. #define __LINK_MODE_LANES_KR8 8
  208. #define __LINK_MODE_LANES_SR 1
  209. #define __LINK_MODE_LANES_SR2 2
  210. #define __LINK_MODE_LANES_SR4 4
  211. #define __LINK_MODE_LANES_SR8 8
  212. #define __LINK_MODE_LANES_ER 1
  213. #define __LINK_MODE_LANES_KX 1
  214. #define __LINK_MODE_LANES_KX4 4
  215. #define __LINK_MODE_LANES_LR 1
  216. #define __LINK_MODE_LANES_LR4 4
  217. #define __LINK_MODE_LANES_LR4_ER4 4
  218. #define __LINK_MODE_LANES_LR_ER_FR 1
  219. #define __LINK_MODE_LANES_LR2_ER2_FR2 2
  220. #define __LINK_MODE_LANES_LR4_ER4_FR4 4
  221. #define __LINK_MODE_LANES_LR8_ER8_FR8 8
  222. #define __LINK_MODE_LANES_LRM 1
  223. #define __LINK_MODE_LANES_MLD2 2
  224. #define __LINK_MODE_LANES_T 1
  225. #define __LINK_MODE_LANES_T1 1
  226. #define __LINK_MODE_LANES_X 1
  227. #define __LINK_MODE_LANES_FX 1
  228. #define __LINK_MODE_LANES_T1L 1
  229. #define __DEFINE_LINK_MODE_PARAMS(_speed, _type, _duplex) \
  230. [ETHTOOL_LINK_MODE(_speed, _type, _duplex)] = { \
  231. .speed = SPEED_ ## _speed, \
  232. .lanes = __LINK_MODE_LANES_ ## _type, \
  233. .duplex = __DUPLEX_ ## _duplex \
  234. }
  235. #define __DUPLEX_Half DUPLEX_HALF
  236. #define __DUPLEX_Full DUPLEX_FULL
  237. #define __DEFINE_SPECIAL_MODE_PARAMS(_mode) \
  238. [ETHTOOL_LINK_MODE_ ## _mode ## _BIT] = { \
  239. .speed = SPEED_UNKNOWN, \
  240. .lanes = 0, \
  241. .duplex = DUPLEX_UNKNOWN, \
  242. }
  243. const struct link_mode_info link_mode_params[] = {
  244. __DEFINE_LINK_MODE_PARAMS(10, T, Half),
  245. __DEFINE_LINK_MODE_PARAMS(10, T, Full),
  246. __DEFINE_LINK_MODE_PARAMS(100, T, Half),
  247. __DEFINE_LINK_MODE_PARAMS(100, T, Full),
  248. __DEFINE_LINK_MODE_PARAMS(1000, T, Half),
  249. __DEFINE_LINK_MODE_PARAMS(1000, T, Full),
  250. __DEFINE_SPECIAL_MODE_PARAMS(Autoneg),
  251. __DEFINE_SPECIAL_MODE_PARAMS(TP),
  252. __DEFINE_SPECIAL_MODE_PARAMS(AUI),
  253. __DEFINE_SPECIAL_MODE_PARAMS(MII),
  254. __DEFINE_SPECIAL_MODE_PARAMS(FIBRE),
  255. __DEFINE_SPECIAL_MODE_PARAMS(BNC),
  256. __DEFINE_LINK_MODE_PARAMS(10000, T, Full),
  257. __DEFINE_SPECIAL_MODE_PARAMS(Pause),
  258. __DEFINE_SPECIAL_MODE_PARAMS(Asym_Pause),
  259. __DEFINE_LINK_MODE_PARAMS(2500, X, Full),
  260. __DEFINE_SPECIAL_MODE_PARAMS(Backplane),
  261. __DEFINE_LINK_MODE_PARAMS(1000, KX, Full),
  262. __DEFINE_LINK_MODE_PARAMS(10000, KX4, Full),
  263. __DEFINE_LINK_MODE_PARAMS(10000, KR, Full),
  264. [ETHTOOL_LINK_MODE_10000baseR_FEC_BIT] = {
  265. .speed = SPEED_10000,
  266. .lanes = 1,
  267. .duplex = DUPLEX_FULL,
  268. },
  269. __DEFINE_LINK_MODE_PARAMS(20000, MLD2, Full),
  270. __DEFINE_LINK_MODE_PARAMS(20000, KR2, Full),
  271. __DEFINE_LINK_MODE_PARAMS(40000, KR4, Full),
  272. __DEFINE_LINK_MODE_PARAMS(40000, CR4, Full),
  273. __DEFINE_LINK_MODE_PARAMS(40000, SR4, Full),
  274. __DEFINE_LINK_MODE_PARAMS(40000, LR4, Full),
  275. __DEFINE_LINK_MODE_PARAMS(56000, KR4, Full),
  276. __DEFINE_LINK_MODE_PARAMS(56000, CR4, Full),
  277. __DEFINE_LINK_MODE_PARAMS(56000, SR4, Full),
  278. __DEFINE_LINK_MODE_PARAMS(56000, LR4, Full),
  279. __DEFINE_LINK_MODE_PARAMS(25000, CR, Full),
  280. __DEFINE_LINK_MODE_PARAMS(25000, KR, Full),
  281. __DEFINE_LINK_MODE_PARAMS(25000, SR, Full),
  282. __DEFINE_LINK_MODE_PARAMS(50000, CR2, Full),
  283. __DEFINE_LINK_MODE_PARAMS(50000, KR2, Full),
  284. __DEFINE_LINK_MODE_PARAMS(100000, KR4, Full),
  285. __DEFINE_LINK_MODE_PARAMS(100000, SR4, Full),
  286. __DEFINE_LINK_MODE_PARAMS(100000, CR4, Full),
  287. __DEFINE_LINK_MODE_PARAMS(100000, LR4_ER4, Full),
  288. __DEFINE_LINK_MODE_PARAMS(50000, SR2, Full),
  289. __DEFINE_LINK_MODE_PARAMS(1000, X, Full),
  290. __DEFINE_LINK_MODE_PARAMS(10000, CR, Full),
  291. __DEFINE_LINK_MODE_PARAMS(10000, SR, Full),
  292. __DEFINE_LINK_MODE_PARAMS(10000, LR, Full),
  293. __DEFINE_LINK_MODE_PARAMS(10000, LRM, Full),
  294. __DEFINE_LINK_MODE_PARAMS(10000, ER, Full),
  295. __DEFINE_LINK_MODE_PARAMS(2500, T, Full),
  296. __DEFINE_LINK_MODE_PARAMS(5000, T, Full),
  297. __DEFINE_SPECIAL_MODE_PARAMS(FEC_NONE),
  298. __DEFINE_SPECIAL_MODE_PARAMS(FEC_RS),
  299. __DEFINE_SPECIAL_MODE_PARAMS(FEC_BASER),
  300. __DEFINE_LINK_MODE_PARAMS(50000, KR, Full),
  301. __DEFINE_LINK_MODE_PARAMS(50000, SR, Full),
  302. __DEFINE_LINK_MODE_PARAMS(50000, CR, Full),
  303. __DEFINE_LINK_MODE_PARAMS(50000, LR_ER_FR, Full),
  304. __DEFINE_LINK_MODE_PARAMS(50000, DR, Full),
  305. __DEFINE_LINK_MODE_PARAMS(100000, KR2, Full),
  306. __DEFINE_LINK_MODE_PARAMS(100000, SR2, Full),
  307. __DEFINE_LINK_MODE_PARAMS(100000, CR2, Full),
  308. __DEFINE_LINK_MODE_PARAMS(100000, LR2_ER2_FR2, Full),
  309. __DEFINE_LINK_MODE_PARAMS(100000, DR2, Full),
  310. __DEFINE_LINK_MODE_PARAMS(200000, KR4, Full),
  311. __DEFINE_LINK_MODE_PARAMS(200000, SR4, Full),
  312. __DEFINE_LINK_MODE_PARAMS(200000, LR4_ER4_FR4, Full),
  313. __DEFINE_LINK_MODE_PARAMS(200000, DR4, Full),
  314. __DEFINE_LINK_MODE_PARAMS(200000, CR4, Full),
  315. __DEFINE_LINK_MODE_PARAMS(100, T1, Full),
  316. __DEFINE_LINK_MODE_PARAMS(1000, T1, Full),
  317. __DEFINE_LINK_MODE_PARAMS(400000, KR8, Full),
  318. __DEFINE_LINK_MODE_PARAMS(400000, SR8, Full),
  319. __DEFINE_LINK_MODE_PARAMS(400000, LR8_ER8_FR8, Full),
  320. __DEFINE_LINK_MODE_PARAMS(400000, DR8, Full),
  321. __DEFINE_LINK_MODE_PARAMS(400000, CR8, Full),
  322. __DEFINE_SPECIAL_MODE_PARAMS(FEC_LLRS),
  323. __DEFINE_LINK_MODE_PARAMS(100000, KR, Full),
  324. __DEFINE_LINK_MODE_PARAMS(100000, SR, Full),
  325. __DEFINE_LINK_MODE_PARAMS(100000, LR_ER_FR, Full),
  326. __DEFINE_LINK_MODE_PARAMS(100000, DR, Full),
  327. __DEFINE_LINK_MODE_PARAMS(100000, CR, Full),
  328. __DEFINE_LINK_MODE_PARAMS(200000, KR2, Full),
  329. __DEFINE_LINK_MODE_PARAMS(200000, SR2, Full),
  330. __DEFINE_LINK_MODE_PARAMS(200000, LR2_ER2_FR2, Full),
  331. __DEFINE_LINK_MODE_PARAMS(200000, DR2, Full),
  332. __DEFINE_LINK_MODE_PARAMS(200000, CR2, Full),
  333. __DEFINE_LINK_MODE_PARAMS(400000, KR4, Full),
  334. __DEFINE_LINK_MODE_PARAMS(400000, SR4, Full),
  335. __DEFINE_LINK_MODE_PARAMS(400000, LR4_ER4_FR4, Full),
  336. __DEFINE_LINK_MODE_PARAMS(400000, DR4, Full),
  337. __DEFINE_LINK_MODE_PARAMS(400000, CR4, Full),
  338. __DEFINE_LINK_MODE_PARAMS(100, FX, Half),
  339. __DEFINE_LINK_MODE_PARAMS(100, FX, Full),
  340. __DEFINE_LINK_MODE_PARAMS(10, T1L, Full),
  341. };
  342. static_assert(ARRAY_SIZE(link_mode_params) == __ETHTOOL_LINK_MODE_MASK_NBITS);
  343. const char netif_msg_class_names[][ETH_GSTRING_LEN] = {
  344. [NETIF_MSG_DRV_BIT] = "drv",
  345. [NETIF_MSG_PROBE_BIT] = "probe",
  346. [NETIF_MSG_LINK_BIT] = "link",
  347. [NETIF_MSG_TIMER_BIT] = "timer",
  348. [NETIF_MSG_IFDOWN_BIT] = "ifdown",
  349. [NETIF_MSG_IFUP_BIT] = "ifup",
  350. [NETIF_MSG_RX_ERR_BIT] = "rx_err",
  351. [NETIF_MSG_TX_ERR_BIT] = "tx_err",
  352. [NETIF_MSG_TX_QUEUED_BIT] = "tx_queued",
  353. [NETIF_MSG_INTR_BIT] = "intr",
  354. [NETIF_MSG_TX_DONE_BIT] = "tx_done",
  355. [NETIF_MSG_RX_STATUS_BIT] = "rx_status",
  356. [NETIF_MSG_PKTDATA_BIT] = "pktdata",
  357. [NETIF_MSG_HW_BIT] = "hw",
  358. [NETIF_MSG_WOL_BIT] = "wol",
  359. };
  360. static_assert(ARRAY_SIZE(netif_msg_class_names) == NETIF_MSG_CLASS_COUNT);
  361. const char wol_mode_names[][ETH_GSTRING_LEN] = {
  362. [const_ilog2(WAKE_PHY)] = "phy",
  363. [const_ilog2(WAKE_UCAST)] = "ucast",
  364. [const_ilog2(WAKE_MCAST)] = "mcast",
  365. [const_ilog2(WAKE_BCAST)] = "bcast",
  366. [const_ilog2(WAKE_ARP)] = "arp",
  367. [const_ilog2(WAKE_MAGIC)] = "magic",
  368. [const_ilog2(WAKE_MAGICSECURE)] = "magicsecure",
  369. [const_ilog2(WAKE_FILTER)] = "filter",
  370. };
  371. static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT);
  372. const char sof_timestamping_names[][ETH_GSTRING_LEN] = {
  373. [const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)] = "hardware-transmit",
  374. [const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)] = "software-transmit",
  375. [const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)] = "hardware-receive",
  376. [const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)] = "software-receive",
  377. [const_ilog2(SOF_TIMESTAMPING_SOFTWARE)] = "software-system-clock",
  378. [const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock",
  379. [const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock",
  380. [const_ilog2(SOF_TIMESTAMPING_OPT_ID)] = "option-id",
  381. [const_ilog2(SOF_TIMESTAMPING_TX_SCHED)] = "sched-transmit",
  382. [const_ilog2(SOF_TIMESTAMPING_TX_ACK)] = "ack-transmit",
  383. [const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)] = "option-cmsg",
  384. [const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)] = "option-tsonly",
  385. [const_ilog2(SOF_TIMESTAMPING_OPT_STATS)] = "option-stats",
  386. [const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)] = "option-pktinfo",
  387. [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw",
  388. [const_ilog2(SOF_TIMESTAMPING_BIND_PHC)] = "bind-phc",
  389. };
  390. static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT);
  391. const char ts_tx_type_names[][ETH_GSTRING_LEN] = {
  392. [HWTSTAMP_TX_OFF] = "off",
  393. [HWTSTAMP_TX_ON] = "on",
  394. [HWTSTAMP_TX_ONESTEP_SYNC] = "onestep-sync",
  395. [HWTSTAMP_TX_ONESTEP_P2P] = "onestep-p2p",
  396. };
  397. static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT);
  398. const char ts_rx_filter_names[][ETH_GSTRING_LEN] = {
  399. [HWTSTAMP_FILTER_NONE] = "none",
  400. [HWTSTAMP_FILTER_ALL] = "all",
  401. [HWTSTAMP_FILTER_SOME] = "some",
  402. [HWTSTAMP_FILTER_PTP_V1_L4_EVENT] = "ptpv1-l4-event",
  403. [HWTSTAMP_FILTER_PTP_V1_L4_SYNC] = "ptpv1-l4-sync",
  404. [HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ] = "ptpv1-l4-delay-req",
  405. [HWTSTAMP_FILTER_PTP_V2_L4_EVENT] = "ptpv2-l4-event",
  406. [HWTSTAMP_FILTER_PTP_V2_L4_SYNC] = "ptpv2-l4-sync",
  407. [HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ] = "ptpv2-l4-delay-req",
  408. [HWTSTAMP_FILTER_PTP_V2_L2_EVENT] = "ptpv2-l2-event",
  409. [HWTSTAMP_FILTER_PTP_V2_L2_SYNC] = "ptpv2-l2-sync",
  410. [HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ] = "ptpv2-l2-delay-req",
  411. [HWTSTAMP_FILTER_PTP_V2_EVENT] = "ptpv2-event",
  412. [HWTSTAMP_FILTER_PTP_V2_SYNC] = "ptpv2-sync",
  413. [HWTSTAMP_FILTER_PTP_V2_DELAY_REQ] = "ptpv2-delay-req",
  414. [HWTSTAMP_FILTER_NTP_ALL] = "ntp-all",
  415. };
  416. static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT);
  417. const char udp_tunnel_type_names[][ETH_GSTRING_LEN] = {
  418. [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN] = "vxlan",
  419. [ETHTOOL_UDP_TUNNEL_TYPE_GENEVE] = "geneve",
  420. [ETHTOOL_UDP_TUNNEL_TYPE_VXLAN_GPE] = "vxlan-gpe",
  421. };
  422. static_assert(ARRAY_SIZE(udp_tunnel_type_names) ==
  423. __ETHTOOL_UDP_TUNNEL_TYPE_CNT);
  424. /* return false if legacy contained non-0 deprecated fields
  425. * maxtxpkt/maxrxpkt. rest of ksettings always updated
  426. */
  427. bool
  428. convert_legacy_settings_to_link_ksettings(
  429. struct ethtool_link_ksettings *link_ksettings,
  430. const struct ethtool_cmd *legacy_settings)
  431. {
  432. bool retval = true;
  433. memset(link_ksettings, 0, sizeof(*link_ksettings));
  434. /* This is used to tell users that driver is still using these
  435. * deprecated legacy fields, and they should not use
  436. * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
  437. */
  438. if (legacy_settings->maxtxpkt ||
  439. legacy_settings->maxrxpkt)
  440. retval = false;
  441. ethtool_convert_legacy_u32_to_link_mode(
  442. link_ksettings->link_modes.supported,
  443. legacy_settings->supported);
  444. ethtool_convert_legacy_u32_to_link_mode(
  445. link_ksettings->link_modes.advertising,
  446. legacy_settings->advertising);
  447. ethtool_convert_legacy_u32_to_link_mode(
  448. link_ksettings->link_modes.lp_advertising,
  449. legacy_settings->lp_advertising);
  450. link_ksettings->base.speed
  451. = ethtool_cmd_speed(legacy_settings);
  452. link_ksettings->base.duplex
  453. = legacy_settings->duplex;
  454. link_ksettings->base.port
  455. = legacy_settings->port;
  456. link_ksettings->base.phy_address
  457. = legacy_settings->phy_address;
  458. link_ksettings->base.autoneg
  459. = legacy_settings->autoneg;
  460. link_ksettings->base.mdio_support
  461. = legacy_settings->mdio_support;
  462. link_ksettings->base.eth_tp_mdix
  463. = legacy_settings->eth_tp_mdix;
  464. link_ksettings->base.eth_tp_mdix_ctrl
  465. = legacy_settings->eth_tp_mdix_ctrl;
  466. return retval;
  467. }
  468. int __ethtool_get_link(struct net_device *dev)
  469. {
  470. if (!dev->ethtool_ops->get_link)
  471. return -EOPNOTSUPP;
  472. return netif_running(dev) && dev->ethtool_ops->get_link(dev);
  473. }
  474. int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max)
  475. {
  476. u32 dev_size, current_max = 0;
  477. u32 *indir;
  478. int ret;
  479. if (!dev->ethtool_ops->get_rxfh_indir_size ||
  480. !dev->ethtool_ops->get_rxfh)
  481. return -EOPNOTSUPP;
  482. dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
  483. if (dev_size == 0)
  484. return -EOPNOTSUPP;
  485. indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
  486. if (!indir)
  487. return -ENOMEM;
  488. ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL);
  489. if (ret)
  490. goto out;
  491. while (dev_size--)
  492. current_max = max(current_max, indir[dev_size]);
  493. *max = current_max;
  494. out:
  495. kfree(indir);
  496. return ret;
  497. }
  498. int ethtool_check_ops(const struct ethtool_ops *ops)
  499. {
  500. if (WARN_ON(ops->set_coalesce && !ops->supported_coalesce_params))
  501. return -EINVAL;
  502. /* NOTE: sufficiently insane drivers may swap ethtool_ops at runtime,
  503. * the fact that ops are checked at registration time does not
  504. * mean the ops attached to a netdev later on are sane.
  505. */
  506. return 0;
  507. }
  508. int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
  509. {
  510. const struct ethtool_ops *ops = dev->ethtool_ops;
  511. struct phy_device *phydev = dev->phydev;
  512. memset(info, 0, sizeof(*info));
  513. info->cmd = ETHTOOL_GET_TS_INFO;
  514. if (phy_has_tsinfo(phydev))
  515. return phy_ts_info(phydev, info);
  516. if (ops->get_ts_info)
  517. return ops->get_ts_info(dev, info);
  518. info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE |
  519. SOF_TIMESTAMPING_SOFTWARE;
  520. info->phc_index = -1;
  521. return 0;
  522. }
  523. int ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index)
  524. {
  525. struct ethtool_ts_info info = { };
  526. int num = 0;
  527. if (!__ethtool_get_ts_info(dev, &info))
  528. num = ptp_get_vclocks_index(info.phc_index, vclock_index);
  529. return num;
  530. }
  531. EXPORT_SYMBOL(ethtool_get_phc_vclocks);
  532. const struct ethtool_phy_ops *ethtool_phy_ops;
  533. void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
  534. {
  535. rtnl_lock();
  536. ethtool_phy_ops = ops;
  537. rtnl_unlock();
  538. }
  539. EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);
  540. void
  541. ethtool_params_from_link_mode(struct ethtool_link_ksettings *link_ksettings,
  542. enum ethtool_link_mode_bit_indices link_mode)
  543. {
  544. const struct link_mode_info *link_info;
  545. if (WARN_ON_ONCE(link_mode >= __ETHTOOL_LINK_MODE_MASK_NBITS))
  546. return;
  547. link_info = &link_mode_params[link_mode];
  548. link_ksettings->base.speed = link_info->speed;
  549. link_ksettings->lanes = link_info->lanes;
  550. link_ksettings->base.duplex = link_info->duplex;
  551. }
  552. EXPORT_SYMBOL_GPL(ethtool_params_from_link_mode);