fm10k_ethtool.c 28 KB

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