fm10k_ethtool.c 31 KB

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