fm10k_ethtool.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright(c) 2013 - 2019 Intel Corporation. */
  3. #include <linux/ethtool.h>
  4. #include <linux/vmalloc.h>
  5. #include "fm10k.h"
  6. struct fm10k_stats {
  7. /* The stat_string is expected to be a format string formatted using
  8. * vsnprintf by fm10k_add_stat_strings. Every member of a stats array
  9. * should use the same format specifiers as they will be formatted
  10. * using the same variadic arguments.
  11. */
  12. char stat_string[ETH_GSTRING_LEN];
  13. int sizeof_stat;
  14. int stat_offset;
  15. };
  16. #define FM10K_STAT_FIELDS(_type, _name, _stat) { \
  17. .stat_string = _name, \
  18. .sizeof_stat = sizeof_field(_type, _stat), \
  19. .stat_offset = offsetof(_type, _stat) \
  20. }
  21. /* netdevice statistics */
  22. #define FM10K_NETDEV_STAT(_net_stat) \
  23. FM10K_STAT_FIELDS(struct net_device_stats, __stringify(_net_stat), \
  24. _net_stat)
  25. static const struct fm10k_stats fm10k_gstrings_net_stats[] = {
  26. FM10K_NETDEV_STAT(tx_packets),
  27. FM10K_NETDEV_STAT(tx_bytes),
  28. FM10K_NETDEV_STAT(tx_errors),
  29. FM10K_NETDEV_STAT(rx_packets),
  30. FM10K_NETDEV_STAT(rx_bytes),
  31. FM10K_NETDEV_STAT(rx_errors),
  32. FM10K_NETDEV_STAT(rx_dropped),
  33. /* detailed Rx errors */
  34. FM10K_NETDEV_STAT(rx_length_errors),
  35. FM10K_NETDEV_STAT(rx_crc_errors),
  36. FM10K_NETDEV_STAT(rx_fifo_errors),
  37. };
  38. #define FM10K_NETDEV_STATS_LEN ARRAY_SIZE(fm10k_gstrings_net_stats)
  39. /* General interface statistics */
  40. #define FM10K_STAT(_name, _stat) \
  41. FM10K_STAT_FIELDS(struct fm10k_intfc, _name, _stat)
  42. static const struct fm10k_stats fm10k_gstrings_global_stats[] = {
  43. FM10K_STAT("tx_restart_queue", restart_queue),
  44. FM10K_STAT("tx_busy", tx_busy),
  45. FM10K_STAT("tx_csum_errors", tx_csum_errors),
  46. FM10K_STAT("rx_alloc_failed", alloc_failed),
  47. FM10K_STAT("rx_csum_errors", rx_csum_errors),
  48. FM10K_STAT("tx_packets_nic", tx_packets_nic),
  49. FM10K_STAT("tx_bytes_nic", tx_bytes_nic),
  50. FM10K_STAT("rx_packets_nic", rx_packets_nic),
  51. FM10K_STAT("rx_bytes_nic", rx_bytes_nic),
  52. FM10K_STAT("rx_drops_nic", rx_drops_nic),
  53. FM10K_STAT("rx_overrun_pf", rx_overrun_pf),
  54. FM10K_STAT("rx_overrun_vf", rx_overrun_vf),
  55. FM10K_STAT("swapi_status", hw.swapi.status),
  56. FM10K_STAT("mac_rules_used", hw.swapi.mac.used),
  57. FM10K_STAT("mac_rules_avail", hw.swapi.mac.avail),
  58. FM10K_STAT("reset_while_pending", hw.mac.reset_while_pending),
  59. FM10K_STAT("tx_hang_count", tx_timeout_count),
  60. };
  61. static const struct fm10k_stats fm10k_gstrings_pf_stats[] = {
  62. FM10K_STAT("timeout", stats.timeout.count),
  63. FM10K_STAT("ur", stats.ur.count),
  64. FM10K_STAT("ca", stats.ca.count),
  65. FM10K_STAT("um", stats.um.count),
  66. FM10K_STAT("xec", stats.xec.count),
  67. FM10K_STAT("vlan_drop", stats.vlan_drop.count),
  68. FM10K_STAT("loopback_drop", stats.loopback_drop.count),
  69. FM10K_STAT("nodesc_drop", stats.nodesc_drop.count),
  70. };
  71. /* mailbox statistics */
  72. #define FM10K_MBX_STAT(_name, _stat) \
  73. FM10K_STAT_FIELDS(struct fm10k_mbx_info, _name, _stat)
  74. static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = {
  75. FM10K_MBX_STAT("mbx_tx_busy", tx_busy),
  76. FM10K_MBX_STAT("mbx_tx_dropped", tx_dropped),
  77. FM10K_MBX_STAT("mbx_tx_messages", tx_messages),
  78. FM10K_MBX_STAT("mbx_tx_dwords", tx_dwords),
  79. FM10K_MBX_STAT("mbx_tx_mbmem_pulled", tx_mbmem_pulled),
  80. FM10K_MBX_STAT("mbx_rx_messages", rx_messages),
  81. FM10K_MBX_STAT("mbx_rx_dwords", rx_dwords),
  82. FM10K_MBX_STAT("mbx_rx_parse_err", rx_parse_err),
  83. FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed),
  84. };
  85. /* per-queue ring statistics */
  86. #define FM10K_QUEUE_STAT(_name, _stat) \
  87. FM10K_STAT_FIELDS(struct fm10k_ring, _name, _stat)
  88. static const struct fm10k_stats fm10k_gstrings_queue_stats[] = {
  89. FM10K_QUEUE_STAT("%s_queue_%u_packets", stats.packets),
  90. FM10K_QUEUE_STAT("%s_queue_%u_bytes", stats.bytes),
  91. };
  92. #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
  93. #define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)
  94. #define FM10K_MBX_STATS_LEN ARRAY_SIZE(fm10k_gstrings_mbx_stats)
  95. #define FM10K_QUEUE_STATS_LEN ARRAY_SIZE(fm10k_gstrings_queue_stats)
  96. #define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
  97. FM10K_NETDEV_STATS_LEN + \
  98. FM10K_MBX_STATS_LEN)
  99. static const char fm10k_gstrings_test[][ETH_GSTRING_LEN] = {
  100. "Mailbox test (on/offline)"
  101. };
  102. #define FM10K_TEST_LEN (sizeof(fm10k_gstrings_test) / ETH_GSTRING_LEN)
  103. enum fm10k_self_test_types {
  104. FM10K_TEST_MBX,
  105. FM10K_TEST_MAX = FM10K_TEST_LEN
  106. };
  107. enum {
  108. FM10K_PRV_FLAG_LEN,
  109. };
  110. static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = {
  111. };
  112. static void __fm10k_add_stat_strings(u8 **p, const struct fm10k_stats stats[],
  113. const unsigned int size, ...)
  114. {
  115. unsigned int i;
  116. for (i = 0; i < size; i++) {
  117. va_list args;
  118. va_start(args, size);
  119. vsnprintf(*p, ETH_GSTRING_LEN, stats[i].stat_string, args);
  120. *p += ETH_GSTRING_LEN;
  121. va_end(args);
  122. }
  123. }
  124. #define fm10k_add_stat_strings(p, stats, ...) \
  125. __fm10k_add_stat_strings(p, stats, ARRAY_SIZE(stats), ## __VA_ARGS__)
  126. static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
  127. {
  128. struct fm10k_intfc *interface = netdev_priv(dev);
  129. unsigned int i;
  130. fm10k_add_stat_strings(&data, fm10k_gstrings_net_stats);
  131. fm10k_add_stat_strings(&data, fm10k_gstrings_global_stats);
  132. fm10k_add_stat_strings(&data, fm10k_gstrings_mbx_stats);
  133. if (interface->hw.mac.type != fm10k_mac_vf)
  134. fm10k_add_stat_strings(&data, fm10k_gstrings_pf_stats);
  135. for (i = 0; i < interface->hw.mac.max_queues; i++) {
  136. fm10k_add_stat_strings(&data, fm10k_gstrings_queue_stats,
  137. "tx", i);
  138. fm10k_add_stat_strings(&data, fm10k_gstrings_queue_stats,
  139. "rx", i);
  140. }
  141. }
  142. static void fm10k_get_strings(struct net_device *dev,
  143. u32 stringset, u8 *data)
  144. {
  145. switch (stringset) {
  146. case ETH_SS_TEST:
  147. memcpy(data, fm10k_gstrings_test,
  148. FM10K_TEST_LEN * ETH_GSTRING_LEN);
  149. break;
  150. case ETH_SS_STATS:
  151. fm10k_get_stat_strings(dev, data);
  152. break;
  153. case ETH_SS_PRIV_FLAGS:
  154. memcpy(data, fm10k_prv_flags,
  155. FM10K_PRV_FLAG_LEN * ETH_GSTRING_LEN);
  156. break;
  157. }
  158. }
  159. static int fm10k_get_sset_count(struct net_device *dev, int sset)
  160. {
  161. struct fm10k_intfc *interface = netdev_priv(dev);
  162. struct fm10k_hw *hw = &interface->hw;
  163. int stats_len = FM10K_STATIC_STATS_LEN;
  164. switch (sset) {
  165. case ETH_SS_TEST:
  166. return FM10K_TEST_LEN;
  167. case ETH_SS_STATS:
  168. stats_len += hw->mac.max_queues * 2 * FM10K_QUEUE_STATS_LEN;
  169. if (hw->mac.type != fm10k_mac_vf)
  170. stats_len += FM10K_PF_STATS_LEN;
  171. return stats_len;
  172. case ETH_SS_PRIV_FLAGS:
  173. return FM10K_PRV_FLAG_LEN;
  174. default:
  175. return -EOPNOTSUPP;
  176. }
  177. }
  178. static void __fm10k_add_ethtool_stats(u64 **data, void *pointer,
  179. const struct fm10k_stats stats[],
  180. const unsigned int size)
  181. {
  182. unsigned int i;
  183. if (!pointer) {
  184. /* memory is not zero allocated so we have to clear it */
  185. for (i = 0; i < size; i++)
  186. *((*data)++) = 0;
  187. return;
  188. }
  189. for (i = 0; i < size; i++) {
  190. char *p = (char *)pointer + stats[i].stat_offset;
  191. switch (stats[i].sizeof_stat) {
  192. case sizeof(u64):
  193. *((*data)++) = *(u64 *)p;
  194. break;
  195. case sizeof(u32):
  196. *((*data)++) = *(u32 *)p;
  197. break;
  198. case sizeof(u16):
  199. *((*data)++) = *(u16 *)p;
  200. break;
  201. case sizeof(u8):
  202. *((*data)++) = *(u8 *)p;
  203. break;
  204. default:
  205. WARN_ONCE(1, "unexpected stat size for %s",
  206. stats[i].stat_string);
  207. *((*data)++) = 0;
  208. }
  209. }
  210. }
  211. #define fm10k_add_ethtool_stats(data, pointer, stats) \
  212. __fm10k_add_ethtool_stats(data, pointer, stats, ARRAY_SIZE(stats))
  213. static void fm10k_get_ethtool_stats(struct net_device *netdev,
  214. struct ethtool_stats __always_unused *stats,
  215. u64 *data)
  216. {
  217. struct fm10k_intfc *interface = netdev_priv(netdev);
  218. struct net_device_stats *net_stats = &netdev->stats;
  219. int i;
  220. fm10k_update_stats(interface);
  221. fm10k_add_ethtool_stats(&data, net_stats, fm10k_gstrings_net_stats);
  222. fm10k_add_ethtool_stats(&data, interface, fm10k_gstrings_global_stats);
  223. fm10k_add_ethtool_stats(&data, &interface->hw.mbx,
  224. fm10k_gstrings_mbx_stats);
  225. if (interface->hw.mac.type != fm10k_mac_vf) {
  226. fm10k_add_ethtool_stats(&data, interface,
  227. fm10k_gstrings_pf_stats);
  228. }
  229. for (i = 0; i < interface->hw.mac.max_queues; i++) {
  230. struct fm10k_ring *ring;
  231. ring = interface->tx_ring[i];
  232. fm10k_add_ethtool_stats(&data, ring,
  233. fm10k_gstrings_queue_stats);
  234. ring = interface->rx_ring[i];
  235. fm10k_add_ethtool_stats(&data, ring,
  236. fm10k_gstrings_queue_stats);
  237. }
  238. }
  239. /* If function below adds more registers this define needs to be updated */
  240. #define FM10K_REGS_LEN_Q 29
  241. static void fm10k_get_reg_q(struct fm10k_hw *hw, u32 *buff, int i)
  242. {
  243. int idx = 0;
  244. buff[idx++] = fm10k_read_reg(hw, FM10K_RDBAL(i));
  245. buff[idx++] = fm10k_read_reg(hw, FM10K_RDBAH(i));
  246. buff[idx++] = fm10k_read_reg(hw, FM10K_RDLEN(i));
  247. buff[idx++] = fm10k_read_reg(hw, FM10K_TPH_RXCTRL(i));
  248. buff[idx++] = fm10k_read_reg(hw, FM10K_RDH(i));
  249. buff[idx++] = fm10k_read_reg(hw, FM10K_RDT(i));
  250. buff[idx++] = fm10k_read_reg(hw, FM10K_RXQCTL(i));
  251. buff[idx++] = fm10k_read_reg(hw, FM10K_RXDCTL(i));
  252. buff[idx++] = fm10k_read_reg(hw, FM10K_RXINT(i));
  253. buff[idx++] = fm10k_read_reg(hw, FM10K_SRRCTL(i));
  254. buff[idx++] = fm10k_read_reg(hw, FM10K_QPRC(i));
  255. buff[idx++] = fm10k_read_reg(hw, FM10K_QPRDC(i));
  256. buff[idx++] = fm10k_read_reg(hw, FM10K_QBRC_L(i));
  257. buff[idx++] = fm10k_read_reg(hw, FM10K_QBRC_H(i));
  258. buff[idx++] = fm10k_read_reg(hw, FM10K_TDBAL(i));
  259. buff[idx++] = fm10k_read_reg(hw, FM10K_TDBAH(i));
  260. buff[idx++] = fm10k_read_reg(hw, FM10K_TDLEN(i));
  261. buff[idx++] = fm10k_read_reg(hw, FM10K_TPH_TXCTRL(i));
  262. buff[idx++] = fm10k_read_reg(hw, FM10K_TDH(i));
  263. buff[idx++] = fm10k_read_reg(hw, FM10K_TDT(i));
  264. buff[idx++] = fm10k_read_reg(hw, FM10K_TXDCTL(i));
  265. buff[idx++] = fm10k_read_reg(hw, FM10K_TXQCTL(i));
  266. buff[idx++] = fm10k_read_reg(hw, FM10K_TXINT(i));
  267. buff[idx++] = fm10k_read_reg(hw, FM10K_QPTC(i));
  268. buff[idx++] = fm10k_read_reg(hw, FM10K_QBTC_L(i));
  269. buff[idx++] = fm10k_read_reg(hw, FM10K_QBTC_H(i));
  270. buff[idx++] = fm10k_read_reg(hw, FM10K_TQDLOC(i));
  271. buff[idx++] = fm10k_read_reg(hw, FM10K_TX_SGLORT(i));
  272. buff[idx++] = fm10k_read_reg(hw, FM10K_PFVTCTL(i));
  273. BUG_ON(idx != FM10K_REGS_LEN_Q);
  274. }
  275. /* If function above adds more registers this define needs to be updated */
  276. #define FM10K_REGS_LEN_VSI 43
  277. static void fm10k_get_reg_vsi(struct fm10k_hw *hw, u32 *buff, int i)
  278. {
  279. int idx = 0, j;
  280. buff[idx++] = fm10k_read_reg(hw, FM10K_MRQC(i));
  281. for (j = 0; j < 10; j++)
  282. buff[idx++] = fm10k_read_reg(hw, FM10K_RSSRK(i, j));
  283. for (j = 0; j < 32; j++)
  284. buff[idx++] = fm10k_read_reg(hw, FM10K_RETA(i, j));
  285. BUG_ON(idx != FM10K_REGS_LEN_VSI);
  286. }
  287. static void fm10k_get_regs(struct net_device *netdev,
  288. struct ethtool_regs *regs, void *p)
  289. {
  290. struct fm10k_intfc *interface = netdev_priv(netdev);
  291. struct fm10k_hw *hw = &interface->hw;
  292. u32 *buff = p;
  293. u16 i;
  294. regs->version = BIT(24) | (hw->revision_id << 16) | hw->device_id;
  295. switch (hw->mac.type) {
  296. case fm10k_mac_pf:
  297. /* General PF Registers */
  298. *(buff++) = fm10k_read_reg(hw, FM10K_CTRL);
  299. *(buff++) = fm10k_read_reg(hw, FM10K_CTRL_EXT);
  300. *(buff++) = fm10k_read_reg(hw, FM10K_GCR);
  301. *(buff++) = fm10k_read_reg(hw, FM10K_GCR_EXT);
  302. for (i = 0; i < 8; i++) {
  303. *(buff++) = fm10k_read_reg(hw, FM10K_DGLORTMAP(i));
  304. *(buff++) = fm10k_read_reg(hw, FM10K_DGLORTDEC(i));
  305. }
  306. for (i = 0; i < 65; i++) {
  307. fm10k_get_reg_vsi(hw, buff, i);
  308. buff += FM10K_REGS_LEN_VSI;
  309. }
  310. *(buff++) = fm10k_read_reg(hw, FM10K_DMA_CTRL);
  311. *(buff++) = fm10k_read_reg(hw, FM10K_DMA_CTRL2);
  312. for (i = 0; i < FM10K_MAX_QUEUES_PF; i++) {
  313. fm10k_get_reg_q(hw, buff, i);
  314. buff += FM10K_REGS_LEN_Q;
  315. }
  316. *(buff++) = fm10k_read_reg(hw, FM10K_TPH_CTRL);
  317. for (i = 0; i < 8; i++)
  318. *(buff++) = fm10k_read_reg(hw, FM10K_INT_MAP(i));
  319. /* Interrupt Throttling Registers */
  320. for (i = 0; i < 130; i++)
  321. *(buff++) = fm10k_read_reg(hw, FM10K_ITR(i));
  322. break;
  323. case fm10k_mac_vf:
  324. /* General VF registers */
  325. *(buff++) = fm10k_read_reg(hw, FM10K_VFCTRL);
  326. *(buff++) = fm10k_read_reg(hw, FM10K_VFINT_MAP);
  327. *(buff++) = fm10k_read_reg(hw, FM10K_VFSYSTIME);
  328. /* Interrupt Throttling Registers */
  329. for (i = 0; i < 8; i++)
  330. *(buff++) = fm10k_read_reg(hw, FM10K_VFITR(i));
  331. fm10k_get_reg_vsi(hw, buff, 0);
  332. buff += FM10K_REGS_LEN_VSI;
  333. for (i = 0; i < FM10K_MAX_QUEUES_POOL; i++) {
  334. if (i < hw->mac.max_queues)
  335. fm10k_get_reg_q(hw, buff, i);
  336. else
  337. memset(buff, 0, sizeof(u32) * FM10K_REGS_LEN_Q);
  338. buff += FM10K_REGS_LEN_Q;
  339. }
  340. break;
  341. default:
  342. return;
  343. }
  344. }
  345. /* If function above adds more registers these define need to be updated */
  346. #define FM10K_REGS_LEN_PF \
  347. (162 + (65 * FM10K_REGS_LEN_VSI) + (FM10K_MAX_QUEUES_PF * FM10K_REGS_LEN_Q))
  348. #define FM10K_REGS_LEN_VF \
  349. (11 + FM10K_REGS_LEN_VSI + (FM10K_MAX_QUEUES_POOL * FM10K_REGS_LEN_Q))
  350. static int fm10k_get_regs_len(struct net_device *netdev)
  351. {
  352. struct fm10k_intfc *interface = netdev_priv(netdev);
  353. struct fm10k_hw *hw = &interface->hw;
  354. switch (hw->mac.type) {
  355. case fm10k_mac_pf:
  356. return FM10K_REGS_LEN_PF * sizeof(u32);
  357. case fm10k_mac_vf:
  358. return FM10K_REGS_LEN_VF * sizeof(u32);
  359. default:
  360. return 0;
  361. }
  362. }
  363. static void fm10k_get_drvinfo(struct net_device *dev,
  364. struct ethtool_drvinfo *info)
  365. {
  366. struct fm10k_intfc *interface = netdev_priv(dev);
  367. strscpy(info->driver, fm10k_driver_name,
  368. sizeof(info->driver));
  369. strscpy(info->bus_info, pci_name(interface->pdev),
  370. sizeof(info->bus_info));
  371. }
  372. static void fm10k_get_pauseparam(struct net_device *dev,
  373. struct ethtool_pauseparam *pause)
  374. {
  375. struct fm10k_intfc *interface = netdev_priv(dev);
  376. /* record fixed values for autoneg and tx pause */
  377. pause->autoneg = 0;
  378. pause->tx_pause = 1;
  379. pause->rx_pause = interface->rx_pause ? 1 : 0;
  380. }
  381. static int fm10k_set_pauseparam(struct net_device *dev,
  382. struct ethtool_pauseparam *pause)
  383. {
  384. struct fm10k_intfc *interface = netdev_priv(dev);
  385. struct fm10k_hw *hw = &interface->hw;
  386. if (pause->autoneg || !pause->tx_pause)
  387. return -EINVAL;
  388. /* we can only support pause on the PF to avoid head-of-line blocking */
  389. if (hw->mac.type == fm10k_mac_pf)
  390. interface->rx_pause = pause->rx_pause ? ~0 : 0;
  391. else if (pause->rx_pause)
  392. return -EINVAL;
  393. if (netif_running(dev))
  394. fm10k_update_rx_drop_en(interface);
  395. return 0;
  396. }
  397. static u32 fm10k_get_msglevel(struct net_device *netdev)
  398. {
  399. struct fm10k_intfc *interface = netdev_priv(netdev);
  400. return interface->msg_enable;
  401. }
  402. static void fm10k_set_msglevel(struct net_device *netdev, u32 data)
  403. {
  404. struct fm10k_intfc *interface = netdev_priv(netdev);
  405. interface->msg_enable = data;
  406. }
  407. static void fm10k_get_ringparam(struct net_device *netdev,
  408. struct ethtool_ringparam *ring,
  409. struct kernel_ethtool_ringparam *kernel_ring,
  410. struct netlink_ext_ack *extack)
  411. {
  412. struct fm10k_intfc *interface = netdev_priv(netdev);
  413. ring->rx_max_pending = FM10K_MAX_RXD;
  414. ring->tx_max_pending = FM10K_MAX_TXD;
  415. ring->rx_mini_max_pending = 0;
  416. ring->rx_jumbo_max_pending = 0;
  417. ring->rx_pending = interface->rx_ring_count;
  418. ring->tx_pending = interface->tx_ring_count;
  419. ring->rx_mini_pending = 0;
  420. ring->rx_jumbo_pending = 0;
  421. }
  422. static int fm10k_set_ringparam(struct net_device *netdev,
  423. struct ethtool_ringparam *ring,
  424. struct kernel_ethtool_ringparam *kernel_ring,
  425. struct netlink_ext_ack *extack)
  426. {
  427. struct fm10k_intfc *interface = netdev_priv(netdev);
  428. struct fm10k_ring *temp_ring;
  429. int i, err = 0;
  430. u32 new_rx_count, new_tx_count;
  431. if ((ring->rx_mini_pending) || (ring->rx_jumbo_pending))
  432. return -EINVAL;
  433. new_tx_count = clamp_t(u32, ring->tx_pending,
  434. FM10K_MIN_TXD, FM10K_MAX_TXD);
  435. new_tx_count = ALIGN(new_tx_count, FM10K_REQ_TX_DESCRIPTOR_MULTIPLE);
  436. new_rx_count = clamp_t(u32, ring->rx_pending,
  437. FM10K_MIN_RXD, FM10K_MAX_RXD);
  438. new_rx_count = ALIGN(new_rx_count, FM10K_REQ_RX_DESCRIPTOR_MULTIPLE);
  439. if ((new_tx_count == interface->tx_ring_count) &&
  440. (new_rx_count == interface->rx_ring_count)) {
  441. /* nothing to do */
  442. return 0;
  443. }
  444. while (test_and_set_bit(__FM10K_RESETTING, interface->state))
  445. usleep_range(1000, 2000);
  446. if (!netif_running(interface->netdev)) {
  447. for (i = 0; i < interface->num_tx_queues; i++)
  448. interface->tx_ring[i]->count = new_tx_count;
  449. for (i = 0; i < interface->num_rx_queues; i++)
  450. interface->rx_ring[i]->count = new_rx_count;
  451. interface->tx_ring_count = new_tx_count;
  452. interface->rx_ring_count = new_rx_count;
  453. goto clear_reset;
  454. }
  455. /* allocate temporary buffer to store rings in */
  456. i = max_t(int, interface->num_tx_queues, interface->num_rx_queues);
  457. temp_ring = vmalloc_array(i, sizeof(struct fm10k_ring));
  458. if (!temp_ring) {
  459. err = -ENOMEM;
  460. goto clear_reset;
  461. }
  462. fm10k_down(interface);
  463. /* Setup new Tx resources and free the old Tx resources in that order.
  464. * We can then assign the new resources to the rings via a memcpy.
  465. * The advantage to this approach is that we are guaranteed to still
  466. * have resources even in the case of an allocation failure.
  467. */
  468. if (new_tx_count != interface->tx_ring_count) {
  469. for (i = 0; i < interface->num_tx_queues; i++) {
  470. memcpy(&temp_ring[i], interface->tx_ring[i],
  471. sizeof(struct fm10k_ring));
  472. temp_ring[i].count = new_tx_count;
  473. err = fm10k_setup_tx_resources(&temp_ring[i]);
  474. if (err) {
  475. while (i) {
  476. i--;
  477. fm10k_free_tx_resources(&temp_ring[i]);
  478. }
  479. goto err_setup;
  480. }
  481. }
  482. for (i = 0; i < interface->num_tx_queues; i++) {
  483. fm10k_free_tx_resources(interface->tx_ring[i]);
  484. memcpy(interface->tx_ring[i], &temp_ring[i],
  485. sizeof(struct fm10k_ring));
  486. }
  487. interface->tx_ring_count = new_tx_count;
  488. }
  489. /* Repeat the process for the Rx rings if needed */
  490. if (new_rx_count != interface->rx_ring_count) {
  491. for (i = 0; i < interface->num_rx_queues; i++) {
  492. memcpy(&temp_ring[i], interface->rx_ring[i],
  493. sizeof(struct fm10k_ring));
  494. temp_ring[i].count = new_rx_count;
  495. err = fm10k_setup_rx_resources(&temp_ring[i]);
  496. if (err) {
  497. while (i) {
  498. i--;
  499. fm10k_free_rx_resources(&temp_ring[i]);
  500. }
  501. goto err_setup;
  502. }
  503. }
  504. for (i = 0; i < interface->num_rx_queues; i++) {
  505. fm10k_free_rx_resources(interface->rx_ring[i]);
  506. memcpy(interface->rx_ring[i], &temp_ring[i],
  507. sizeof(struct fm10k_ring));
  508. }
  509. interface->rx_ring_count = new_rx_count;
  510. }
  511. err_setup:
  512. fm10k_up(interface);
  513. vfree(temp_ring);
  514. clear_reset:
  515. clear_bit(__FM10K_RESETTING, interface->state);
  516. return err;
  517. }
  518. static int fm10k_get_coalesce(struct net_device *dev,
  519. struct ethtool_coalesce *ec,
  520. struct kernel_ethtool_coalesce *kernel_coal,
  521. struct netlink_ext_ack *extack)
  522. {
  523. struct fm10k_intfc *interface = netdev_priv(dev);
  524. ec->use_adaptive_tx_coalesce = ITR_IS_ADAPTIVE(interface->tx_itr);
  525. ec->tx_coalesce_usecs = interface->tx_itr & ~FM10K_ITR_ADAPTIVE;
  526. ec->use_adaptive_rx_coalesce = ITR_IS_ADAPTIVE(interface->rx_itr);
  527. ec->rx_coalesce_usecs = interface->rx_itr & ~FM10K_ITR_ADAPTIVE;
  528. return 0;
  529. }
  530. static int fm10k_set_coalesce(struct net_device *dev,
  531. struct ethtool_coalesce *ec,
  532. struct kernel_ethtool_coalesce *kernel_coal,
  533. struct netlink_ext_ack *extack)
  534. {
  535. struct fm10k_intfc *interface = netdev_priv(dev);
  536. u16 tx_itr, rx_itr;
  537. int i;
  538. /* verify limits */
  539. if ((ec->rx_coalesce_usecs > FM10K_ITR_MAX) ||
  540. (ec->tx_coalesce_usecs > FM10K_ITR_MAX))
  541. return -EINVAL;
  542. /* record settings */
  543. tx_itr = ec->tx_coalesce_usecs;
  544. rx_itr = ec->rx_coalesce_usecs;
  545. /* set initial values for adaptive ITR */
  546. if (ec->use_adaptive_tx_coalesce)
  547. tx_itr = FM10K_ITR_ADAPTIVE | FM10K_TX_ITR_DEFAULT;
  548. if (ec->use_adaptive_rx_coalesce)
  549. rx_itr = FM10K_ITR_ADAPTIVE | FM10K_RX_ITR_DEFAULT;
  550. /* update interface */
  551. interface->tx_itr = tx_itr;
  552. interface->rx_itr = rx_itr;
  553. /* update q_vectors */
  554. for (i = 0; i < interface->num_q_vectors; i++) {
  555. struct fm10k_q_vector *qv = interface->q_vector[i];
  556. qv->tx.itr = tx_itr;
  557. qv->rx.itr = rx_itr;
  558. }
  559. return 0;
  560. }
  561. static int fm10k_get_rssh_fields(struct net_device *dev,
  562. struct ethtool_rxfh_fields *cmd)
  563. {
  564. struct fm10k_intfc *interface = netdev_priv(dev);
  565. cmd->data = 0;
  566. /* Report default options for RSS on fm10k */
  567. switch (cmd->flow_type) {
  568. case TCP_V4_FLOW:
  569. case TCP_V6_FLOW:
  570. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  571. fallthrough;
  572. case UDP_V4_FLOW:
  573. if (test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP,
  574. interface->flags))
  575. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  576. fallthrough;
  577. case SCTP_V4_FLOW:
  578. case SCTP_V6_FLOW:
  579. case AH_ESP_V4_FLOW:
  580. case AH_ESP_V6_FLOW:
  581. case AH_V4_FLOW:
  582. case AH_V6_FLOW:
  583. case ESP_V4_FLOW:
  584. case ESP_V6_FLOW:
  585. case IPV4_FLOW:
  586. case IPV6_FLOW:
  587. cmd->data |= RXH_IP_SRC | RXH_IP_DST;
  588. break;
  589. case UDP_V6_FLOW:
  590. if (test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP,
  591. interface->flags))
  592. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  593. cmd->data |= RXH_IP_SRC | RXH_IP_DST;
  594. break;
  595. default:
  596. return -EINVAL;
  597. }
  598. return 0;
  599. }
  600. static u32 fm10k_get_rx_ring_count(struct net_device *dev)
  601. {
  602. struct fm10k_intfc *interface = netdev_priv(dev);
  603. return interface->num_rx_queues;
  604. }
  605. static int fm10k_set_rssh_fields(struct net_device *dev,
  606. const struct ethtool_rxfh_fields *nfc,
  607. struct netlink_ext_ack *extack)
  608. {
  609. struct fm10k_intfc *interface = netdev_priv(dev);
  610. int rss_ipv4_udp = test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP,
  611. interface->flags);
  612. int rss_ipv6_udp = test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP,
  613. interface->flags);
  614. /* RSS does not support anything other than hashing
  615. * to queues on src and dst IPs and ports
  616. */
  617. if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
  618. RXH_L4_B_0_1 | RXH_L4_B_2_3))
  619. return -EINVAL;
  620. switch (nfc->flow_type) {
  621. case TCP_V4_FLOW:
  622. case TCP_V6_FLOW:
  623. if (!(nfc->data & RXH_IP_SRC) ||
  624. !(nfc->data & RXH_IP_DST) ||
  625. !(nfc->data & RXH_L4_B_0_1) ||
  626. !(nfc->data & RXH_L4_B_2_3))
  627. return -EINVAL;
  628. break;
  629. case UDP_V4_FLOW:
  630. if (!(nfc->data & RXH_IP_SRC) ||
  631. !(nfc->data & RXH_IP_DST))
  632. return -EINVAL;
  633. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  634. case 0:
  635. clear_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP,
  636. interface->flags);
  637. break;
  638. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  639. set_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP,
  640. interface->flags);
  641. break;
  642. default:
  643. return -EINVAL;
  644. }
  645. break;
  646. case UDP_V6_FLOW:
  647. if (!(nfc->data & RXH_IP_SRC) ||
  648. !(nfc->data & RXH_IP_DST))
  649. return -EINVAL;
  650. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  651. case 0:
  652. clear_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP,
  653. interface->flags);
  654. break;
  655. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  656. set_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP,
  657. interface->flags);
  658. break;
  659. default:
  660. return -EINVAL;
  661. }
  662. break;
  663. case AH_ESP_V4_FLOW:
  664. case AH_V4_FLOW:
  665. case ESP_V4_FLOW:
  666. case SCTP_V4_FLOW:
  667. case AH_ESP_V6_FLOW:
  668. case AH_V6_FLOW:
  669. case ESP_V6_FLOW:
  670. case SCTP_V6_FLOW:
  671. if (!(nfc->data & RXH_IP_SRC) ||
  672. !(nfc->data & RXH_IP_DST) ||
  673. (nfc->data & RXH_L4_B_0_1) ||
  674. (nfc->data & RXH_L4_B_2_3))
  675. return -EINVAL;
  676. break;
  677. default:
  678. return -EINVAL;
  679. }
  680. /* If something changed we need to update the MRQC register. Note that
  681. * test_bit() is guaranteed to return strictly 0 or 1, so testing for
  682. * equality is safe.
  683. */
  684. if ((rss_ipv4_udp != test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP,
  685. interface->flags)) ||
  686. (rss_ipv6_udp != test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP,
  687. interface->flags))) {
  688. struct fm10k_hw *hw = &interface->hw;
  689. bool warn = false;
  690. u32 mrqc;
  691. /* Perform hash on these packet types */
  692. mrqc = FM10K_MRQC_IPV4 |
  693. FM10K_MRQC_TCP_IPV4 |
  694. FM10K_MRQC_IPV6 |
  695. FM10K_MRQC_TCP_IPV6;
  696. if (test_bit(FM10K_FLAG_RSS_FIELD_IPV4_UDP,
  697. interface->flags)) {
  698. mrqc |= FM10K_MRQC_UDP_IPV4;
  699. warn = true;
  700. }
  701. if (test_bit(FM10K_FLAG_RSS_FIELD_IPV6_UDP,
  702. interface->flags)) {
  703. mrqc |= FM10K_MRQC_UDP_IPV6;
  704. warn = true;
  705. }
  706. /* If we enable UDP RSS display a warning that this may cause
  707. * fragmented UDP packets to arrive out of order.
  708. */
  709. if (warn)
  710. netif_warn(interface, drv, interface->netdev,
  711. "enabling UDP RSS: fragmented packets may arrive out of order to the stack above\n");
  712. fm10k_write_reg(hw, FM10K_MRQC(0), mrqc);
  713. }
  714. return 0;
  715. }
  716. static int fm10k_mbx_test(struct fm10k_intfc *interface, u64 *data)
  717. {
  718. struct fm10k_hw *hw = &interface->hw;
  719. struct fm10k_mbx_info *mbx = &hw->mbx;
  720. u32 attr_flag, test_msg[6];
  721. unsigned long timeout;
  722. int err = -EINVAL;
  723. /* For now this is a VF only feature */
  724. if (hw->mac.type != fm10k_mac_vf)
  725. return 0;
  726. /* loop through both nested and unnested attribute types */
  727. for (attr_flag = BIT(FM10K_TEST_MSG_UNSET);
  728. attr_flag < BIT(2 * FM10K_TEST_MSG_NESTED);
  729. attr_flag += attr_flag) {
  730. /* generate message to be tested */
  731. fm10k_tlv_msg_test_create(test_msg, attr_flag);
  732. fm10k_mbx_lock(interface);
  733. mbx->test_result = FM10K_NOT_IMPLEMENTED;
  734. err = mbx->ops.enqueue_tx(hw, mbx, test_msg);
  735. fm10k_mbx_unlock(interface);
  736. /* wait up to 1 second for response */
  737. timeout = jiffies + HZ;
  738. do {
  739. if (err < 0)
  740. goto err_out;
  741. usleep_range(500, 1000);
  742. fm10k_mbx_lock(interface);
  743. mbx->ops.process(hw, mbx);
  744. fm10k_mbx_unlock(interface);
  745. err = mbx->test_result;
  746. if (!err)
  747. break;
  748. } while (time_is_after_jiffies(timeout));
  749. /* reporting errors */
  750. if (err)
  751. goto err_out;
  752. }
  753. err_out:
  754. *data = err < 0 ? (attr_flag) : (err > 0);
  755. return err;
  756. }
  757. static void fm10k_self_test(struct net_device *dev,
  758. struct ethtool_test *eth_test, u64 *data)
  759. {
  760. struct fm10k_intfc *interface = netdev_priv(dev);
  761. struct fm10k_hw *hw = &interface->hw;
  762. memset(data, 0, sizeof(*data) * FM10K_TEST_LEN);
  763. if (FM10K_REMOVED(hw->hw_addr)) {
  764. netif_err(interface, drv, dev,
  765. "Interface removed - test blocked\n");
  766. eth_test->flags |= ETH_TEST_FL_FAILED;
  767. return;
  768. }
  769. if (fm10k_mbx_test(interface, &data[FM10K_TEST_MBX]))
  770. eth_test->flags |= ETH_TEST_FL_FAILED;
  771. }
  772. static u32 fm10k_get_priv_flags(struct net_device *netdev)
  773. {
  774. return 0;
  775. }
  776. static int fm10k_set_priv_flags(struct net_device *netdev, u32 priv_flags)
  777. {
  778. if (priv_flags >= BIT(FM10K_PRV_FLAG_LEN))
  779. return -EINVAL;
  780. return 0;
  781. }
  782. static u32 fm10k_get_reta_size(struct net_device __always_unused *netdev)
  783. {
  784. return FM10K_RETA_SIZE * FM10K_RETA_ENTRIES_PER_REG;
  785. }
  786. void fm10k_write_reta(struct fm10k_intfc *interface, const u32 *indir)
  787. {
  788. u16 rss_i = interface->ring_feature[RING_F_RSS].indices;
  789. struct fm10k_hw *hw = &interface->hw;
  790. u32 table[4];
  791. int i, j;
  792. /* record entries to reta table */
  793. for (i = 0; i < FM10K_RETA_SIZE; i++) {
  794. u32 reta, n;
  795. /* generate a new table if we weren't given one */
  796. for (j = 0; j < 4; j++) {
  797. if (indir)
  798. n = indir[4 * i + j];
  799. else
  800. n = ethtool_rxfh_indir_default(4 * i + j,
  801. rss_i);
  802. table[j] = n;
  803. }
  804. reta = table[0] |
  805. (table[1] << 8) |
  806. (table[2] << 16) |
  807. (table[3] << 24);
  808. if (interface->reta[i] == reta)
  809. continue;
  810. interface->reta[i] = reta;
  811. fm10k_write_reg(hw, FM10K_RETA(0, i), reta);
  812. }
  813. }
  814. static int fm10k_get_reta(struct net_device *netdev, u32 *indir)
  815. {
  816. struct fm10k_intfc *interface = netdev_priv(netdev);
  817. int i;
  818. if (!indir)
  819. return 0;
  820. for (i = 0; i < FM10K_RETA_SIZE; i++, indir += 4) {
  821. u32 reta = interface->reta[i];
  822. indir[0] = (reta << 24) >> 24;
  823. indir[1] = (reta << 16) >> 24;
  824. indir[2] = (reta << 8) >> 24;
  825. indir[3] = (reta) >> 24;
  826. }
  827. return 0;
  828. }
  829. static int fm10k_set_reta(struct net_device *netdev, const u32 *indir)
  830. {
  831. struct fm10k_intfc *interface = netdev_priv(netdev);
  832. int i;
  833. u16 rss_i;
  834. if (!indir)
  835. return 0;
  836. /* Verify user input. */
  837. rss_i = interface->ring_feature[RING_F_RSS].indices;
  838. for (i = fm10k_get_reta_size(netdev); i--;) {
  839. if (indir[i] < rss_i)
  840. continue;
  841. return -EINVAL;
  842. }
  843. fm10k_write_reta(interface, indir);
  844. return 0;
  845. }
  846. static u32 fm10k_get_rssrk_size(struct net_device __always_unused *netdev)
  847. {
  848. return FM10K_RSSRK_SIZE * FM10K_RSSRK_ENTRIES_PER_REG;
  849. }
  850. static int fm10k_get_rssh(struct net_device *netdev,
  851. struct ethtool_rxfh_param *rxfh)
  852. {
  853. struct fm10k_intfc *interface = netdev_priv(netdev);
  854. u8 *key = rxfh->key;
  855. int i, err;
  856. rxfh->hfunc = ETH_RSS_HASH_TOP;
  857. err = fm10k_get_reta(netdev, rxfh->indir);
  858. if (err || !key)
  859. return err;
  860. for (i = 0; i < FM10K_RSSRK_SIZE; i++, key += 4)
  861. *(__le32 *)key = cpu_to_le32(interface->rssrk[i]);
  862. return 0;
  863. }
  864. static int fm10k_set_rssh(struct net_device *netdev,
  865. struct ethtool_rxfh_param *rxfh,
  866. struct netlink_ext_ack *extack)
  867. {
  868. struct fm10k_intfc *interface = netdev_priv(netdev);
  869. struct fm10k_hw *hw = &interface->hw;
  870. int i, err;
  871. /* We do not allow change in unsupported parameters */
  872. if (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
  873. rxfh->hfunc != ETH_RSS_HASH_TOP)
  874. return -EOPNOTSUPP;
  875. err = fm10k_set_reta(netdev, rxfh->indir);
  876. if (err || !rxfh->key)
  877. return err;
  878. for (i = 0; i < FM10K_RSSRK_SIZE; i++, rxfh->key += 4) {
  879. u32 rssrk = le32_to_cpu(*(__le32 *)rxfh->key);
  880. if (interface->rssrk[i] == rssrk)
  881. continue;
  882. interface->rssrk[i] = rssrk;
  883. fm10k_write_reg(hw, FM10K_RSSRK(0, i), rssrk);
  884. }
  885. return 0;
  886. }
  887. static unsigned int fm10k_max_channels(struct net_device *dev)
  888. {
  889. struct fm10k_intfc *interface = netdev_priv(dev);
  890. unsigned int max_combined = interface->hw.mac.max_queues;
  891. u8 tcs = netdev_get_num_tc(dev);
  892. /* For QoS report channels per traffic class */
  893. if (tcs > 1)
  894. max_combined = BIT((fls(max_combined / tcs) - 1));
  895. return max_combined;
  896. }
  897. static void fm10k_get_channels(struct net_device *dev,
  898. struct ethtool_channels *ch)
  899. {
  900. struct fm10k_intfc *interface = netdev_priv(dev);
  901. /* report maximum channels */
  902. ch->max_combined = fm10k_max_channels(dev);
  903. /* report info for other vector */
  904. ch->max_other = NON_Q_VECTORS;
  905. ch->other_count = ch->max_other;
  906. /* record RSS queues */
  907. ch->combined_count = interface->ring_feature[RING_F_RSS].indices;
  908. }
  909. static int fm10k_set_channels(struct net_device *dev,
  910. struct ethtool_channels *ch)
  911. {
  912. struct fm10k_intfc *interface = netdev_priv(dev);
  913. unsigned int count = ch->combined_count;
  914. /* verify they are not requesting separate vectors */
  915. if (!count || ch->rx_count || ch->tx_count)
  916. return -EINVAL;
  917. /* verify other_count has not changed */
  918. if (ch->other_count != NON_Q_VECTORS)
  919. return -EINVAL;
  920. /* verify the number of channels does not exceed hardware limits */
  921. if (count > fm10k_max_channels(dev))
  922. return -EINVAL;
  923. interface->ring_feature[RING_F_RSS].limit = count;
  924. /* use setup TC to update any traffic class queue mapping */
  925. return fm10k_setup_tc(dev, netdev_get_num_tc(dev));
  926. }
  927. static const struct ethtool_ops fm10k_ethtool_ops = {
  928. .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
  929. ETHTOOL_COALESCE_USE_ADAPTIVE,
  930. .get_strings = fm10k_get_strings,
  931. .get_sset_count = fm10k_get_sset_count,
  932. .get_ethtool_stats = fm10k_get_ethtool_stats,
  933. .get_drvinfo = fm10k_get_drvinfo,
  934. .get_link = ethtool_op_get_link,
  935. .get_pauseparam = fm10k_get_pauseparam,
  936. .set_pauseparam = fm10k_set_pauseparam,
  937. .get_msglevel = fm10k_get_msglevel,
  938. .set_msglevel = fm10k_set_msglevel,
  939. .get_ringparam = fm10k_get_ringparam,
  940. .set_ringparam = fm10k_set_ringparam,
  941. .get_coalesce = fm10k_get_coalesce,
  942. .set_coalesce = fm10k_set_coalesce,
  943. .get_rx_ring_count = fm10k_get_rx_ring_count,
  944. .get_regs = fm10k_get_regs,
  945. .get_regs_len = fm10k_get_regs_len,
  946. .self_test = fm10k_self_test,
  947. .get_priv_flags = fm10k_get_priv_flags,
  948. .set_priv_flags = fm10k_set_priv_flags,
  949. .get_rxfh_indir_size = fm10k_get_reta_size,
  950. .get_rxfh_key_size = fm10k_get_rssrk_size,
  951. .get_rxfh = fm10k_get_rssh,
  952. .set_rxfh = fm10k_set_rssh,
  953. .get_rxfh_fields = fm10k_get_rssh_fields,
  954. .set_rxfh_fields = fm10k_set_rssh_fields,
  955. .get_channels = fm10k_get_channels,
  956. .set_channels = fm10k_set_channels,
  957. .get_ts_info = ethtool_op_get_ts_info,
  958. };
  959. void fm10k_set_ethtool_ops(struct net_device *dev)
  960. {
  961. dev->ethtool_ops = &fm10k_ethtool_ops;
  962. }