igc_ethtool.c 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (c) 2018 Intel Corporation */
  3. /* ethtool support for igc */
  4. #include <linux/if_vlan.h>
  5. #include <linux/pm_runtime.h>
  6. #include <linux/mdio.h>
  7. #include "igc.h"
  8. #include "igc_diag.h"
  9. /* forward declaration */
  10. struct igc_stats {
  11. char stat_string[ETH_GSTRING_LEN];
  12. int sizeof_stat;
  13. int stat_offset;
  14. };
  15. #define IGC_STAT(_name, _stat) { \
  16. .stat_string = _name, \
  17. .sizeof_stat = sizeof_field(struct igc_adapter, _stat), \
  18. .stat_offset = offsetof(struct igc_adapter, _stat) \
  19. }
  20. static const struct igc_stats igc_gstrings_stats[] = {
  21. IGC_STAT("rx_packets", stats.gprc),
  22. IGC_STAT("tx_packets", stats.gptc),
  23. IGC_STAT("rx_bytes", stats.gorc),
  24. IGC_STAT("tx_bytes", stats.gotc),
  25. IGC_STAT("rx_broadcast", stats.bprc),
  26. IGC_STAT("tx_broadcast", stats.bptc),
  27. IGC_STAT("rx_multicast", stats.mprc),
  28. IGC_STAT("tx_multicast", stats.mptc),
  29. IGC_STAT("multicast", stats.mprc),
  30. IGC_STAT("collisions", stats.colc),
  31. IGC_STAT("rx_crc_errors", stats.crcerrs),
  32. IGC_STAT("rx_no_buffer_count", stats.rnbc),
  33. IGC_STAT("rx_missed_errors", stats.mpc),
  34. IGC_STAT("tx_aborted_errors", stats.ecol),
  35. IGC_STAT("tx_carrier_errors", stats.tncrs),
  36. IGC_STAT("tx_window_errors", stats.latecol),
  37. IGC_STAT("tx_abort_late_coll", stats.latecol),
  38. IGC_STAT("tx_deferred_ok", stats.dc),
  39. IGC_STAT("tx_single_coll_ok", stats.scc),
  40. IGC_STAT("tx_multi_coll_ok", stats.mcc),
  41. IGC_STAT("tx_timeout_count", tx_timeout_count),
  42. IGC_STAT("rx_long_length_errors", stats.roc),
  43. IGC_STAT("rx_short_length_errors", stats.ruc),
  44. IGC_STAT("rx_align_errors", stats.algnerrc),
  45. IGC_STAT("tx_tcp_seg_good", stats.tsctc),
  46. IGC_STAT("tx_tcp_seg_failed", stats.tsctfc),
  47. IGC_STAT("rx_flow_control_xon", stats.xonrxc),
  48. IGC_STAT("rx_flow_control_xoff", stats.xoffrxc),
  49. IGC_STAT("tx_flow_control_xon", stats.xontxc),
  50. IGC_STAT("tx_flow_control_xoff", stats.xofftxc),
  51. IGC_STAT("rx_long_byte_count", stats.gorc),
  52. IGC_STAT("tx_dma_out_of_sync", stats.doosync),
  53. IGC_STAT("tx_smbus", stats.mgptc),
  54. IGC_STAT("rx_smbus", stats.mgprc),
  55. IGC_STAT("dropped_smbus", stats.mgpdc),
  56. IGC_STAT("os2bmc_rx_by_bmc", stats.o2bgptc),
  57. IGC_STAT("os2bmc_tx_by_bmc", stats.b2ospc),
  58. IGC_STAT("os2bmc_tx_by_host", stats.o2bspc),
  59. IGC_STAT("os2bmc_rx_by_host", stats.b2ogprc),
  60. IGC_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts),
  61. IGC_STAT("tx_hwtstamp_skipped", tx_hwtstamp_skipped),
  62. IGC_STAT("rx_hwtstamp_cleared", rx_hwtstamp_cleared),
  63. IGC_STAT("tx_lpi_counter", stats.tlpic),
  64. IGC_STAT("rx_lpi_counter", stats.rlpic),
  65. IGC_STAT("qbv_config_change_errors", qbv_config_change_errors),
  66. };
  67. #define IGC_NETDEV_STAT(_net_stat) { \
  68. .stat_string = __stringify(_net_stat), \
  69. .sizeof_stat = sizeof_field(struct rtnl_link_stats64, _net_stat), \
  70. .stat_offset = offsetof(struct rtnl_link_stats64, _net_stat) \
  71. }
  72. static const struct igc_stats igc_gstrings_net_stats[] = {
  73. IGC_NETDEV_STAT(rx_errors),
  74. IGC_NETDEV_STAT(tx_errors),
  75. IGC_NETDEV_STAT(tx_dropped),
  76. IGC_NETDEV_STAT(rx_length_errors),
  77. IGC_NETDEV_STAT(rx_over_errors),
  78. IGC_NETDEV_STAT(rx_frame_errors),
  79. IGC_NETDEV_STAT(rx_fifo_errors),
  80. IGC_NETDEV_STAT(tx_fifo_errors),
  81. IGC_NETDEV_STAT(tx_heartbeat_errors)
  82. };
  83. enum igc_diagnostics_results {
  84. TEST_REG = 0,
  85. TEST_EEP,
  86. TEST_IRQ,
  87. TEST_LOOP,
  88. TEST_LINK
  89. };
  90. static const char igc_gstrings_test[][ETH_GSTRING_LEN] = {
  91. [TEST_REG] = "Register test (offline)",
  92. [TEST_EEP] = "Eeprom test (offline)",
  93. [TEST_IRQ] = "Interrupt test (offline)",
  94. [TEST_LOOP] = "Loopback test (offline)",
  95. [TEST_LINK] = "Link test (on/offline)"
  96. };
  97. #define IGC_TEST_LEN (sizeof(igc_gstrings_test) / ETH_GSTRING_LEN)
  98. #define IGC_GLOBAL_STATS_LEN \
  99. (sizeof(igc_gstrings_stats) / sizeof(struct igc_stats))
  100. #define IGC_NETDEV_STATS_LEN \
  101. (sizeof(igc_gstrings_net_stats) / sizeof(struct igc_stats))
  102. #define IGC_RX_QUEUE_STATS_LEN \
  103. (sizeof(struct igc_rx_queue_stats) / sizeof(u64))
  104. #define IGC_TX_QUEUE_STATS_LEN 3 /* packets, bytes, restart_queue */
  105. #define IGC_QUEUE_STATS_LEN \
  106. ((((struct igc_adapter *)netdev_priv(netdev))->num_rx_queues * \
  107. IGC_RX_QUEUE_STATS_LEN) + \
  108. (((struct igc_adapter *)netdev_priv(netdev))->num_tx_queues * \
  109. IGC_TX_QUEUE_STATS_LEN))
  110. #define IGC_STATS_LEN \
  111. (IGC_GLOBAL_STATS_LEN + IGC_NETDEV_STATS_LEN + IGC_QUEUE_STATS_LEN)
  112. static const char igc_priv_flags_strings[][ETH_GSTRING_LEN] = {
  113. #define IGC_PRIV_FLAGS_LEGACY_RX BIT(0)
  114. "legacy-rx",
  115. };
  116. #define IGC_PRIV_FLAGS_STR_LEN ARRAY_SIZE(igc_priv_flags_strings)
  117. static void igc_ethtool_get_drvinfo(struct net_device *netdev,
  118. struct ethtool_drvinfo *drvinfo)
  119. {
  120. struct igc_adapter *adapter = netdev_priv(netdev);
  121. struct igc_hw *hw = &adapter->hw;
  122. u16 nvm_version = 0;
  123. u16 gphy_version;
  124. strscpy(drvinfo->driver, igc_driver_name, sizeof(drvinfo->driver));
  125. /* NVM image version is reported as firmware version for i225 device */
  126. hw->nvm.ops.read(hw, IGC_NVM_DEV_STARTER, 1, &nvm_version);
  127. /* gPHY firmware version is reported as PHY FW version */
  128. gphy_version = igc_read_phy_fw_version(hw);
  129. scnprintf(adapter->fw_version,
  130. sizeof(adapter->fw_version),
  131. "%x:%x",
  132. nvm_version,
  133. gphy_version);
  134. strscpy(drvinfo->fw_version, adapter->fw_version,
  135. sizeof(drvinfo->fw_version));
  136. strscpy(drvinfo->bus_info, pci_name(adapter->pdev),
  137. sizeof(drvinfo->bus_info));
  138. drvinfo->n_priv_flags = IGC_PRIV_FLAGS_STR_LEN;
  139. }
  140. static int igc_ethtool_get_regs_len(struct net_device *netdev)
  141. {
  142. return IGC_REGS_LEN * sizeof(u32);
  143. }
  144. static void igc_ethtool_get_regs(struct net_device *netdev,
  145. struct ethtool_regs *regs, void *p)
  146. {
  147. struct igc_adapter *adapter = netdev_priv(netdev);
  148. struct igc_hw *hw = &adapter->hw;
  149. u32 *regs_buff = p;
  150. u8 i;
  151. memset(p, 0, IGC_REGS_LEN * sizeof(u32));
  152. regs->version = (2u << 24) | (hw->revision_id << 16) | hw->device_id;
  153. /* General Registers */
  154. regs_buff[0] = rd32(IGC_CTRL);
  155. regs_buff[1] = rd32(IGC_STATUS);
  156. regs_buff[2] = rd32(IGC_CTRL_EXT);
  157. regs_buff[3] = rd32(IGC_MDIC);
  158. regs_buff[4] = rd32(IGC_CONNSW);
  159. /* NVM Register */
  160. regs_buff[5] = rd32(IGC_EECD);
  161. /* Interrupt */
  162. /* Reading EICS for EICR because they read the
  163. * same but EICS does not clear on read
  164. */
  165. regs_buff[6] = rd32(IGC_EICS);
  166. regs_buff[7] = rd32(IGC_EICS);
  167. regs_buff[8] = rd32(IGC_EIMS);
  168. regs_buff[9] = rd32(IGC_EIMC);
  169. regs_buff[10] = rd32(IGC_EIAC);
  170. regs_buff[11] = rd32(IGC_EIAM);
  171. /* Reading ICS for ICR because they read the
  172. * same but ICS does not clear on read
  173. */
  174. regs_buff[12] = rd32(IGC_ICS);
  175. regs_buff[13] = rd32(IGC_ICS);
  176. regs_buff[14] = rd32(IGC_IMS);
  177. regs_buff[15] = rd32(IGC_IMC);
  178. regs_buff[16] = rd32(IGC_IAC);
  179. regs_buff[17] = rd32(IGC_IAM);
  180. /* Flow Control */
  181. regs_buff[18] = rd32(IGC_FCAL);
  182. regs_buff[19] = rd32(IGC_FCAH);
  183. regs_buff[20] = rd32(IGC_FCTTV);
  184. regs_buff[21] = rd32(IGC_FCRTL);
  185. regs_buff[22] = rd32(IGC_FCRTH);
  186. regs_buff[23] = rd32(IGC_FCRTV);
  187. /* Receive */
  188. regs_buff[24] = rd32(IGC_RCTL);
  189. regs_buff[25] = rd32(IGC_RXCSUM);
  190. regs_buff[26] = rd32(IGC_RLPML);
  191. regs_buff[27] = rd32(IGC_RFCTL);
  192. /* Transmit */
  193. regs_buff[28] = rd32(IGC_TCTL);
  194. regs_buff[29] = rd32(IGC_TIPG);
  195. /* Wake Up */
  196. /* MAC */
  197. /* Statistics */
  198. regs_buff[30] = adapter->stats.crcerrs;
  199. regs_buff[31] = adapter->stats.algnerrc;
  200. regs_buff[32] = adapter->stats.symerrs;
  201. regs_buff[33] = adapter->stats.rxerrc;
  202. regs_buff[34] = adapter->stats.mpc;
  203. regs_buff[35] = adapter->stats.scc;
  204. regs_buff[36] = adapter->stats.ecol;
  205. regs_buff[37] = adapter->stats.mcc;
  206. regs_buff[38] = adapter->stats.latecol;
  207. regs_buff[39] = adapter->stats.colc;
  208. regs_buff[40] = adapter->stats.dc;
  209. regs_buff[41] = adapter->stats.tncrs;
  210. regs_buff[42] = adapter->stats.sec;
  211. regs_buff[43] = adapter->stats.htdpmc;
  212. regs_buff[44] = adapter->stats.rlec;
  213. regs_buff[45] = adapter->stats.xonrxc;
  214. regs_buff[46] = adapter->stats.xontxc;
  215. regs_buff[47] = adapter->stats.xoffrxc;
  216. regs_buff[48] = adapter->stats.xofftxc;
  217. regs_buff[49] = adapter->stats.fcruc;
  218. regs_buff[50] = adapter->stats.prc64;
  219. regs_buff[51] = adapter->stats.prc127;
  220. regs_buff[52] = adapter->stats.prc255;
  221. regs_buff[53] = adapter->stats.prc511;
  222. regs_buff[54] = adapter->stats.prc1023;
  223. regs_buff[55] = adapter->stats.prc1522;
  224. regs_buff[56] = adapter->stats.gprc;
  225. regs_buff[57] = adapter->stats.bprc;
  226. regs_buff[58] = adapter->stats.mprc;
  227. regs_buff[59] = adapter->stats.gptc;
  228. regs_buff[60] = adapter->stats.gorc;
  229. regs_buff[61] = adapter->stats.gotc;
  230. regs_buff[62] = adapter->stats.rnbc;
  231. regs_buff[63] = adapter->stats.ruc;
  232. regs_buff[64] = adapter->stats.rfc;
  233. regs_buff[65] = adapter->stats.roc;
  234. regs_buff[66] = adapter->stats.rjc;
  235. regs_buff[67] = adapter->stats.mgprc;
  236. regs_buff[68] = adapter->stats.mgpdc;
  237. regs_buff[69] = adapter->stats.mgptc;
  238. regs_buff[70] = adapter->stats.tor;
  239. regs_buff[71] = adapter->stats.tot;
  240. regs_buff[72] = adapter->stats.tpr;
  241. regs_buff[73] = adapter->stats.tpt;
  242. regs_buff[74] = adapter->stats.ptc64;
  243. regs_buff[75] = adapter->stats.ptc127;
  244. regs_buff[76] = adapter->stats.ptc255;
  245. regs_buff[77] = adapter->stats.ptc511;
  246. regs_buff[78] = adapter->stats.ptc1023;
  247. regs_buff[79] = adapter->stats.ptc1522;
  248. regs_buff[80] = adapter->stats.mptc;
  249. regs_buff[81] = adapter->stats.bptc;
  250. regs_buff[82] = adapter->stats.tsctc;
  251. regs_buff[83] = adapter->stats.iac;
  252. regs_buff[84] = adapter->stats.rpthc;
  253. regs_buff[85] = adapter->stats.hgptc;
  254. regs_buff[86] = adapter->stats.hgorc;
  255. regs_buff[87] = adapter->stats.hgotc;
  256. regs_buff[88] = adapter->stats.lenerrs;
  257. regs_buff[89] = adapter->stats.scvpc;
  258. regs_buff[90] = adapter->stats.hrmpc;
  259. for (i = 0; i < 4; i++)
  260. regs_buff[91 + i] = rd32(IGC_SRRCTL(i));
  261. for (i = 0; i < 4; i++)
  262. regs_buff[95 + i] = rd32(IGC_PSRTYPE(i));
  263. for (i = 0; i < 4; i++)
  264. regs_buff[99 + i] = rd32(IGC_RDBAL(i));
  265. for (i = 0; i < 4; i++)
  266. regs_buff[103 + i] = rd32(IGC_RDBAH(i));
  267. for (i = 0; i < 4; i++)
  268. regs_buff[107 + i] = rd32(IGC_RDLEN(i));
  269. for (i = 0; i < 4; i++)
  270. regs_buff[111 + i] = rd32(IGC_RDH(i));
  271. for (i = 0; i < 4; i++)
  272. regs_buff[115 + i] = rd32(IGC_RDT(i));
  273. for (i = 0; i < 4; i++)
  274. regs_buff[119 + i] = rd32(IGC_RXDCTL(i));
  275. for (i = 0; i < 10; i++)
  276. regs_buff[123 + i] = rd32(IGC_EITR(i));
  277. for (i = 0; i < 16; i++)
  278. regs_buff[139 + i] = rd32(IGC_RAL(i));
  279. for (i = 0; i < 16; i++)
  280. regs_buff[145 + i] = rd32(IGC_RAH(i));
  281. for (i = 0; i < 4; i++)
  282. regs_buff[149 + i] = rd32(IGC_TDBAL(i));
  283. for (i = 0; i < 4; i++)
  284. regs_buff[152 + i] = rd32(IGC_TDBAH(i));
  285. for (i = 0; i < 4; i++)
  286. regs_buff[156 + i] = rd32(IGC_TDLEN(i));
  287. for (i = 0; i < 4; i++)
  288. regs_buff[160 + i] = rd32(IGC_TDH(i));
  289. for (i = 0; i < 4; i++)
  290. regs_buff[164 + i] = rd32(IGC_TDT(i));
  291. for (i = 0; i < 4; i++)
  292. regs_buff[168 + i] = rd32(IGC_TXDCTL(i));
  293. /* XXX: Due to a bug few lines above, RAL and RAH registers are
  294. * overwritten. To preserve the ABI, we write these registers again in
  295. * regs_buff.
  296. */
  297. for (i = 0; i < 16; i++)
  298. regs_buff[172 + i] = rd32(IGC_RAL(i));
  299. for (i = 0; i < 16; i++)
  300. regs_buff[188 + i] = rd32(IGC_RAH(i));
  301. regs_buff[204] = rd32(IGC_VLANPQF);
  302. for (i = 0; i < 8; i++)
  303. regs_buff[205 + i] = rd32(IGC_ETQF(i));
  304. regs_buff[213] = adapter->stats.tlpic;
  305. regs_buff[214] = adapter->stats.rlpic;
  306. }
  307. static void igc_ethtool_get_wol(struct net_device *netdev,
  308. struct ethtool_wolinfo *wol)
  309. {
  310. struct igc_adapter *adapter = netdev_priv(netdev);
  311. wol->wolopts = 0;
  312. if (!(adapter->flags & IGC_FLAG_WOL_SUPPORTED))
  313. return;
  314. wol->supported = WAKE_UCAST | WAKE_MCAST |
  315. WAKE_BCAST | WAKE_MAGIC |
  316. WAKE_PHY;
  317. /* apply any specific unsupported masks here */
  318. switch (adapter->hw.device_id) {
  319. default:
  320. break;
  321. }
  322. if (adapter->wol & IGC_WUFC_EX)
  323. wol->wolopts |= WAKE_UCAST;
  324. if (adapter->wol & IGC_WUFC_MC)
  325. wol->wolopts |= WAKE_MCAST;
  326. if (adapter->wol & IGC_WUFC_BC)
  327. wol->wolopts |= WAKE_BCAST;
  328. if (adapter->wol & IGC_WUFC_MAG)
  329. wol->wolopts |= WAKE_MAGIC;
  330. if (adapter->wol & IGC_WUFC_LNKC)
  331. wol->wolopts |= WAKE_PHY;
  332. }
  333. static int igc_ethtool_set_wol(struct net_device *netdev,
  334. struct ethtool_wolinfo *wol)
  335. {
  336. struct igc_adapter *adapter = netdev_priv(netdev);
  337. if (wol->wolopts & (WAKE_ARP | WAKE_MAGICSECURE | WAKE_FILTER))
  338. return -EOPNOTSUPP;
  339. if (!(adapter->flags & IGC_FLAG_WOL_SUPPORTED))
  340. return wol->wolopts ? -EOPNOTSUPP : 0;
  341. /* these settings will always override what we currently have */
  342. adapter->wol = 0;
  343. if (wol->wolopts & WAKE_UCAST)
  344. adapter->wol |= IGC_WUFC_EX;
  345. if (wol->wolopts & WAKE_MCAST)
  346. adapter->wol |= IGC_WUFC_MC;
  347. if (wol->wolopts & WAKE_BCAST)
  348. adapter->wol |= IGC_WUFC_BC;
  349. if (wol->wolopts & WAKE_MAGIC)
  350. adapter->wol |= IGC_WUFC_MAG;
  351. if (wol->wolopts & WAKE_PHY)
  352. adapter->wol |= IGC_WUFC_LNKC;
  353. device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
  354. return 0;
  355. }
  356. static u32 igc_ethtool_get_msglevel(struct net_device *netdev)
  357. {
  358. struct igc_adapter *adapter = netdev_priv(netdev);
  359. return adapter->msg_enable;
  360. }
  361. static void igc_ethtool_set_msglevel(struct net_device *netdev, u32 data)
  362. {
  363. struct igc_adapter *adapter = netdev_priv(netdev);
  364. adapter->msg_enable = data;
  365. }
  366. static int igc_ethtool_nway_reset(struct net_device *netdev)
  367. {
  368. struct igc_adapter *adapter = netdev_priv(netdev);
  369. if (netif_running(netdev))
  370. igc_reinit_locked(adapter);
  371. return 0;
  372. }
  373. static u32 igc_ethtool_get_link(struct net_device *netdev)
  374. {
  375. struct igc_adapter *adapter = netdev_priv(netdev);
  376. struct igc_mac_info *mac = &adapter->hw.mac;
  377. /* If the link is not reported up to netdev, interrupts are disabled,
  378. * and so the physical link state may have changed since we last
  379. * looked. Set get_link_status to make sure that the true link
  380. * state is interrogated, rather than pulling a cached and possibly
  381. * stale link state from the driver.
  382. */
  383. if (!netif_carrier_ok(netdev))
  384. mac->get_link_status = 1;
  385. return igc_has_link(adapter);
  386. }
  387. static int igc_ethtool_get_eeprom_len(struct net_device *netdev)
  388. {
  389. struct igc_adapter *adapter = netdev_priv(netdev);
  390. return adapter->hw.nvm.word_size * 2;
  391. }
  392. static int igc_ethtool_get_eeprom(struct net_device *netdev,
  393. struct ethtool_eeprom *eeprom, u8 *bytes)
  394. {
  395. struct igc_adapter *adapter = netdev_priv(netdev);
  396. struct igc_hw *hw = &adapter->hw;
  397. int first_word, last_word;
  398. u16 *eeprom_buff;
  399. int ret_val = 0;
  400. u16 i;
  401. if (eeprom->len == 0)
  402. return -EINVAL;
  403. eeprom->magic = hw->vendor_id | (hw->device_id << 16);
  404. first_word = eeprom->offset >> 1;
  405. last_word = (eeprom->offset + eeprom->len - 1) >> 1;
  406. eeprom_buff = kmalloc_array(last_word - first_word + 1, sizeof(u16),
  407. GFP_KERNEL);
  408. if (!eeprom_buff)
  409. return -ENOMEM;
  410. if (hw->nvm.type == igc_nvm_eeprom_spi) {
  411. ret_val = hw->nvm.ops.read(hw, first_word,
  412. last_word - first_word + 1,
  413. eeprom_buff);
  414. } else {
  415. for (i = 0; i < last_word - first_word + 1; i++) {
  416. ret_val = hw->nvm.ops.read(hw, first_word + i, 1,
  417. &eeprom_buff[i]);
  418. if (ret_val)
  419. break;
  420. }
  421. }
  422. /* Device's eeprom is always little-endian, word addressable */
  423. for (i = 0; i < last_word - first_word + 1; i++)
  424. le16_to_cpus(&eeprom_buff[i]);
  425. memcpy(bytes, (u8 *)eeprom_buff + (eeprom->offset & 1),
  426. eeprom->len);
  427. kfree(eeprom_buff);
  428. return ret_val;
  429. }
  430. static int igc_ethtool_set_eeprom(struct net_device *netdev,
  431. struct ethtool_eeprom *eeprom, u8 *bytes)
  432. {
  433. struct igc_adapter *adapter = netdev_priv(netdev);
  434. struct igc_hw *hw = &adapter->hw;
  435. int max_len, first_word, last_word, ret_val = 0;
  436. u16 *eeprom_buff;
  437. void *ptr;
  438. u16 i;
  439. if (eeprom->len == 0)
  440. return -EOPNOTSUPP;
  441. if (hw->mac.type >= igc_i225 &&
  442. !igc_get_flash_presence_i225(hw)) {
  443. return -EOPNOTSUPP;
  444. }
  445. if (eeprom->magic != (hw->vendor_id | (hw->device_id << 16)))
  446. return -EFAULT;
  447. max_len = hw->nvm.word_size * 2;
  448. first_word = eeprom->offset >> 1;
  449. last_word = (eeprom->offset + eeprom->len - 1) >> 1;
  450. eeprom_buff = kmalloc(max_len, GFP_KERNEL);
  451. if (!eeprom_buff)
  452. return -ENOMEM;
  453. ptr = (void *)eeprom_buff;
  454. if (eeprom->offset & 1) {
  455. /* need read/modify/write of first changed EEPROM word
  456. * only the second byte of the word is being modified
  457. */
  458. ret_val = hw->nvm.ops.read(hw, first_word, 1,
  459. &eeprom_buff[0]);
  460. ptr++;
  461. }
  462. if (((eeprom->offset + eeprom->len) & 1) && ret_val == 0) {
  463. /* need read/modify/write of last changed EEPROM word
  464. * only the first byte of the word is being modified
  465. */
  466. ret_val = hw->nvm.ops.read(hw, last_word, 1,
  467. &eeprom_buff[last_word - first_word]);
  468. }
  469. /* Device's eeprom is always little-endian, word addressable */
  470. for (i = 0; i < last_word - first_word + 1; i++)
  471. le16_to_cpus(&eeprom_buff[i]);
  472. memcpy(ptr, bytes, eeprom->len);
  473. for (i = 0; i < last_word - first_word + 1; i++)
  474. cpu_to_le16s(&eeprom_buff[i]);
  475. ret_val = hw->nvm.ops.write(hw, first_word,
  476. last_word - first_word + 1, eeprom_buff);
  477. /* Update the checksum if nvm write succeeded */
  478. if (ret_val == 0)
  479. hw->nvm.ops.update(hw);
  480. kfree(eeprom_buff);
  481. return ret_val;
  482. }
  483. static void
  484. igc_ethtool_get_ringparam(struct net_device *netdev,
  485. struct ethtool_ringparam *ring,
  486. struct kernel_ethtool_ringparam *kernel_ering,
  487. struct netlink_ext_ack *extack)
  488. {
  489. struct igc_adapter *adapter = netdev_priv(netdev);
  490. ring->rx_max_pending = IGC_MAX_RXD;
  491. ring->tx_max_pending = IGC_MAX_TXD;
  492. ring->rx_pending = adapter->rx_ring_count;
  493. ring->tx_pending = adapter->tx_ring_count;
  494. }
  495. static int
  496. igc_ethtool_set_ringparam(struct net_device *netdev,
  497. struct ethtool_ringparam *ring,
  498. struct kernel_ethtool_ringparam *kernel_ering,
  499. struct netlink_ext_ack *extack)
  500. {
  501. struct igc_adapter *adapter = netdev_priv(netdev);
  502. struct igc_ring *temp_ring;
  503. u16 new_rx_count, new_tx_count;
  504. int i, err = 0;
  505. if (ring->rx_mini_pending || ring->rx_jumbo_pending)
  506. return -EINVAL;
  507. new_rx_count = min_t(u32, ring->rx_pending, IGC_MAX_RXD);
  508. new_rx_count = max_t(u16, new_rx_count, IGC_MIN_RXD);
  509. new_rx_count = ALIGN(new_rx_count, REQ_RX_DESCRIPTOR_MULTIPLE);
  510. new_tx_count = min_t(u32, ring->tx_pending, IGC_MAX_TXD);
  511. new_tx_count = max_t(u16, new_tx_count, IGC_MIN_TXD);
  512. new_tx_count = ALIGN(new_tx_count, REQ_TX_DESCRIPTOR_MULTIPLE);
  513. if (new_tx_count == adapter->tx_ring_count &&
  514. new_rx_count == adapter->rx_ring_count) {
  515. /* nothing to do */
  516. return 0;
  517. }
  518. while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
  519. usleep_range(1000, 2000);
  520. if (!netif_running(adapter->netdev)) {
  521. for (i = 0; i < adapter->num_tx_queues; i++)
  522. adapter->tx_ring[i]->count = new_tx_count;
  523. for (i = 0; i < adapter->num_rx_queues; i++)
  524. adapter->rx_ring[i]->count = new_rx_count;
  525. adapter->tx_ring_count = new_tx_count;
  526. adapter->rx_ring_count = new_rx_count;
  527. goto clear_reset;
  528. }
  529. if (adapter->num_tx_queues > adapter->num_rx_queues)
  530. temp_ring = vmalloc(array_size(sizeof(struct igc_ring),
  531. adapter->num_tx_queues));
  532. else
  533. temp_ring = vmalloc(array_size(sizeof(struct igc_ring),
  534. adapter->num_rx_queues));
  535. if (!temp_ring) {
  536. err = -ENOMEM;
  537. goto clear_reset;
  538. }
  539. igc_down(adapter);
  540. /* We can't just free everything and then setup again,
  541. * because the ISRs in MSI-X mode get passed pointers
  542. * to the Tx and Rx ring structs.
  543. */
  544. if (new_tx_count != adapter->tx_ring_count) {
  545. for (i = 0; i < adapter->num_tx_queues; i++) {
  546. memcpy(&temp_ring[i], adapter->tx_ring[i],
  547. sizeof(struct igc_ring));
  548. temp_ring[i].count = new_tx_count;
  549. err = igc_setup_tx_resources(&temp_ring[i]);
  550. if (err) {
  551. while (i) {
  552. i--;
  553. igc_free_tx_resources(&temp_ring[i]);
  554. }
  555. goto err_setup;
  556. }
  557. }
  558. for (i = 0; i < adapter->num_tx_queues; i++) {
  559. igc_free_tx_resources(adapter->tx_ring[i]);
  560. memcpy(adapter->tx_ring[i], &temp_ring[i],
  561. sizeof(struct igc_ring));
  562. }
  563. adapter->tx_ring_count = new_tx_count;
  564. }
  565. if (new_rx_count != adapter->rx_ring_count) {
  566. for (i = 0; i < adapter->num_rx_queues; i++) {
  567. memcpy(&temp_ring[i], adapter->rx_ring[i],
  568. sizeof(struct igc_ring));
  569. temp_ring[i].count = new_rx_count;
  570. err = igc_setup_rx_resources(&temp_ring[i]);
  571. if (err) {
  572. while (i) {
  573. i--;
  574. igc_free_rx_resources(&temp_ring[i]);
  575. }
  576. goto err_setup;
  577. }
  578. }
  579. for (i = 0; i < adapter->num_rx_queues; i++) {
  580. igc_free_rx_resources(adapter->rx_ring[i]);
  581. memcpy(adapter->rx_ring[i], &temp_ring[i],
  582. sizeof(struct igc_ring));
  583. }
  584. adapter->rx_ring_count = new_rx_count;
  585. }
  586. err_setup:
  587. igc_up(adapter);
  588. vfree(temp_ring);
  589. clear_reset:
  590. clear_bit(__IGC_RESETTING, &adapter->state);
  591. return err;
  592. }
  593. static void igc_ethtool_get_pauseparam(struct net_device *netdev,
  594. struct ethtool_pauseparam *pause)
  595. {
  596. struct igc_adapter *adapter = netdev_priv(netdev);
  597. struct igc_hw *hw = &adapter->hw;
  598. pause->autoneg =
  599. (adapter->fc_autoneg ? AUTONEG_ENABLE : AUTONEG_DISABLE);
  600. if (hw->fc.current_mode == igc_fc_rx_pause) {
  601. pause->rx_pause = 1;
  602. } else if (hw->fc.current_mode == igc_fc_tx_pause) {
  603. pause->tx_pause = 1;
  604. } else if (hw->fc.current_mode == igc_fc_full) {
  605. pause->rx_pause = 1;
  606. pause->tx_pause = 1;
  607. }
  608. }
  609. static int igc_ethtool_set_pauseparam(struct net_device *netdev,
  610. struct ethtool_pauseparam *pause)
  611. {
  612. struct igc_adapter *adapter = netdev_priv(netdev);
  613. struct igc_hw *hw = &adapter->hw;
  614. int retval = 0;
  615. adapter->fc_autoneg = pause->autoneg;
  616. while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
  617. usleep_range(1000, 2000);
  618. if (adapter->fc_autoneg == AUTONEG_ENABLE) {
  619. hw->fc.requested_mode = igc_fc_default;
  620. if (netif_running(adapter->netdev)) {
  621. igc_down(adapter);
  622. igc_up(adapter);
  623. } else {
  624. igc_reset(adapter);
  625. }
  626. } else {
  627. if (pause->rx_pause && pause->tx_pause)
  628. hw->fc.requested_mode = igc_fc_full;
  629. else if (pause->rx_pause && !pause->tx_pause)
  630. hw->fc.requested_mode = igc_fc_rx_pause;
  631. else if (!pause->rx_pause && pause->tx_pause)
  632. hw->fc.requested_mode = igc_fc_tx_pause;
  633. else if (!pause->rx_pause && !pause->tx_pause)
  634. hw->fc.requested_mode = igc_fc_none;
  635. hw->fc.current_mode = hw->fc.requested_mode;
  636. retval = ((hw->phy.media_type == igc_media_type_copper) ?
  637. igc_force_mac_fc(hw) : igc_setup_link(hw));
  638. }
  639. clear_bit(__IGC_RESETTING, &adapter->state);
  640. return retval;
  641. }
  642. static void igc_ethtool_get_strings(struct net_device *netdev, u32 stringset,
  643. u8 *data)
  644. {
  645. struct igc_adapter *adapter = netdev_priv(netdev);
  646. u8 *p = data;
  647. int i;
  648. switch (stringset) {
  649. case ETH_SS_TEST:
  650. memcpy(data, *igc_gstrings_test,
  651. IGC_TEST_LEN * ETH_GSTRING_LEN);
  652. break;
  653. case ETH_SS_STATS:
  654. for (i = 0; i < IGC_GLOBAL_STATS_LEN; i++)
  655. ethtool_puts(&p, igc_gstrings_stats[i].stat_string);
  656. for (i = 0; i < IGC_NETDEV_STATS_LEN; i++)
  657. ethtool_puts(&p, igc_gstrings_net_stats[i].stat_string);
  658. for (i = 0; i < adapter->num_tx_queues; i++) {
  659. ethtool_sprintf(&p, "tx_queue_%u_packets", i);
  660. ethtool_sprintf(&p, "tx_queue_%u_bytes", i);
  661. ethtool_sprintf(&p, "tx_queue_%u_restart", i);
  662. }
  663. for (i = 0; i < adapter->num_rx_queues; i++) {
  664. ethtool_sprintf(&p, "rx_queue_%u_packets", i);
  665. ethtool_sprintf(&p, "rx_queue_%u_bytes", i);
  666. ethtool_sprintf(&p, "rx_queue_%u_drops", i);
  667. ethtool_sprintf(&p, "rx_queue_%u_csum_err", i);
  668. ethtool_sprintf(&p, "rx_queue_%u_alloc_failed", i);
  669. }
  670. /* BUG_ON(p - data != IGC_STATS_LEN * ETH_GSTRING_LEN); */
  671. break;
  672. case ETH_SS_PRIV_FLAGS:
  673. memcpy(data, igc_priv_flags_strings,
  674. IGC_PRIV_FLAGS_STR_LEN * ETH_GSTRING_LEN);
  675. break;
  676. }
  677. }
  678. static int igc_ethtool_get_sset_count(struct net_device *netdev, int sset)
  679. {
  680. switch (sset) {
  681. case ETH_SS_STATS:
  682. return IGC_STATS_LEN;
  683. case ETH_SS_TEST:
  684. return IGC_TEST_LEN;
  685. case ETH_SS_PRIV_FLAGS:
  686. return IGC_PRIV_FLAGS_STR_LEN;
  687. default:
  688. return -ENOTSUPP;
  689. }
  690. }
  691. static void igc_ethtool_get_stats(struct net_device *netdev,
  692. struct ethtool_stats *stats, u64 *data)
  693. {
  694. struct igc_adapter *adapter = netdev_priv(netdev);
  695. struct rtnl_link_stats64 *net_stats = &adapter->stats64;
  696. unsigned int start;
  697. struct igc_ring *ring;
  698. int i, j;
  699. char *p;
  700. spin_lock(&adapter->stats64_lock);
  701. igc_update_stats(adapter);
  702. for (i = 0; i < IGC_GLOBAL_STATS_LEN; i++) {
  703. p = (char *)adapter + igc_gstrings_stats[i].stat_offset;
  704. data[i] = (igc_gstrings_stats[i].sizeof_stat ==
  705. sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
  706. }
  707. for (j = 0; j < IGC_NETDEV_STATS_LEN; j++, i++) {
  708. p = (char *)net_stats + igc_gstrings_net_stats[j].stat_offset;
  709. data[i] = (igc_gstrings_net_stats[j].sizeof_stat ==
  710. sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
  711. }
  712. for (j = 0; j < adapter->num_tx_queues; j++) {
  713. u64 restart2;
  714. ring = adapter->tx_ring[j];
  715. do {
  716. start = u64_stats_fetch_begin(&ring->tx_syncp);
  717. data[i] = ring->tx_stats.packets;
  718. data[i + 1] = ring->tx_stats.bytes;
  719. data[i + 2] = ring->tx_stats.restart_queue;
  720. } while (u64_stats_fetch_retry(&ring->tx_syncp, start));
  721. do {
  722. start = u64_stats_fetch_begin(&ring->tx_syncp2);
  723. restart2 = ring->tx_stats.restart_queue2;
  724. } while (u64_stats_fetch_retry(&ring->tx_syncp2, start));
  725. data[i + 2] += restart2;
  726. i += IGC_TX_QUEUE_STATS_LEN;
  727. }
  728. for (j = 0; j < adapter->num_rx_queues; j++) {
  729. ring = adapter->rx_ring[j];
  730. do {
  731. start = u64_stats_fetch_begin(&ring->rx_syncp);
  732. data[i] = ring->rx_stats.packets;
  733. data[i + 1] = ring->rx_stats.bytes;
  734. data[i + 2] = ring->rx_stats.drops;
  735. data[i + 3] = ring->rx_stats.csum_err;
  736. data[i + 4] = ring->rx_stats.alloc_failed;
  737. } while (u64_stats_fetch_retry(&ring->rx_syncp, start));
  738. i += IGC_RX_QUEUE_STATS_LEN;
  739. }
  740. spin_unlock(&adapter->stats64_lock);
  741. }
  742. static int igc_ethtool_get_previous_rx_coalesce(struct igc_adapter *adapter)
  743. {
  744. return (adapter->rx_itr_setting <= 3) ?
  745. adapter->rx_itr_setting : adapter->rx_itr_setting >> 2;
  746. }
  747. static int igc_ethtool_get_previous_tx_coalesce(struct igc_adapter *adapter)
  748. {
  749. return (adapter->tx_itr_setting <= 3) ?
  750. adapter->tx_itr_setting : adapter->tx_itr_setting >> 2;
  751. }
  752. static int igc_ethtool_get_coalesce(struct net_device *netdev,
  753. struct ethtool_coalesce *ec,
  754. struct kernel_ethtool_coalesce *kernel_coal,
  755. struct netlink_ext_ack *extack)
  756. {
  757. struct igc_adapter *adapter = netdev_priv(netdev);
  758. ec->rx_coalesce_usecs = igc_ethtool_get_previous_rx_coalesce(adapter);
  759. ec->tx_coalesce_usecs = igc_ethtool_get_previous_tx_coalesce(adapter);
  760. return 0;
  761. }
  762. static int igc_ethtool_set_coalesce(struct net_device *netdev,
  763. struct ethtool_coalesce *ec,
  764. struct kernel_ethtool_coalesce *kernel_coal,
  765. struct netlink_ext_ack *extack)
  766. {
  767. struct igc_adapter *adapter = netdev_priv(netdev);
  768. int i;
  769. if (ec->rx_coalesce_usecs > IGC_MAX_ITR_USECS ||
  770. (ec->rx_coalesce_usecs > 3 &&
  771. ec->rx_coalesce_usecs < IGC_MIN_ITR_USECS) ||
  772. ec->rx_coalesce_usecs == 2)
  773. return -EINVAL;
  774. if (ec->tx_coalesce_usecs > IGC_MAX_ITR_USECS ||
  775. (ec->tx_coalesce_usecs > 3 &&
  776. ec->tx_coalesce_usecs < IGC_MIN_ITR_USECS) ||
  777. ec->tx_coalesce_usecs == 2)
  778. return -EINVAL;
  779. if ((adapter->flags & IGC_FLAG_QUEUE_PAIRS) &&
  780. ec->tx_coalesce_usecs != igc_ethtool_get_previous_tx_coalesce(adapter)) {
  781. NL_SET_ERR_MSG_MOD(extack,
  782. "Queue Pair mode enabled, both Rx and Tx coalescing controlled by rx-usecs");
  783. return -EINVAL;
  784. }
  785. /* If ITR is disabled, disable DMAC */
  786. if (ec->rx_coalesce_usecs == 0) {
  787. if (adapter->flags & IGC_FLAG_DMAC)
  788. adapter->flags &= ~IGC_FLAG_DMAC;
  789. }
  790. /* convert to rate of irq's per second */
  791. if (ec->rx_coalesce_usecs && ec->rx_coalesce_usecs <= 3)
  792. adapter->rx_itr_setting = ec->rx_coalesce_usecs;
  793. else
  794. adapter->rx_itr_setting = ec->rx_coalesce_usecs << 2;
  795. /* convert to rate of irq's per second */
  796. if (adapter->flags & IGC_FLAG_QUEUE_PAIRS)
  797. adapter->tx_itr_setting = adapter->rx_itr_setting;
  798. else if (ec->tx_coalesce_usecs && ec->tx_coalesce_usecs <= 3)
  799. adapter->tx_itr_setting = ec->tx_coalesce_usecs;
  800. else
  801. adapter->tx_itr_setting = ec->tx_coalesce_usecs << 2;
  802. for (i = 0; i < adapter->num_q_vectors; i++) {
  803. struct igc_q_vector *q_vector = adapter->q_vector[i];
  804. q_vector->tx.work_limit = adapter->tx_work_limit;
  805. if (q_vector->rx.ring)
  806. q_vector->itr_val = adapter->rx_itr_setting;
  807. else
  808. q_vector->itr_val = adapter->tx_itr_setting;
  809. if (q_vector->itr_val && q_vector->itr_val <= 3)
  810. q_vector->itr_val = IGC_START_ITR;
  811. q_vector->set_itr = 1;
  812. }
  813. return 0;
  814. }
  815. #define ETHER_TYPE_FULL_MASK ((__force __be16)~0)
  816. #define VLAN_TCI_FULL_MASK ((__force __be16)~0)
  817. static int igc_ethtool_get_nfc_rule(struct igc_adapter *adapter,
  818. struct ethtool_rxnfc *cmd)
  819. {
  820. struct ethtool_rx_flow_spec *fsp = &cmd->fs;
  821. struct igc_nfc_rule *rule = NULL;
  822. cmd->data = IGC_MAX_RXNFC_RULES;
  823. mutex_lock(&adapter->nfc_rule_lock);
  824. rule = igc_get_nfc_rule(adapter, fsp->location);
  825. if (!rule)
  826. goto out;
  827. fsp->flow_type = ETHER_FLOW;
  828. fsp->ring_cookie = rule->action;
  829. if (rule->filter.match_flags & IGC_FILTER_FLAG_ETHER_TYPE) {
  830. fsp->h_u.ether_spec.h_proto = htons(rule->filter.etype);
  831. fsp->m_u.ether_spec.h_proto = ETHER_TYPE_FULL_MASK;
  832. }
  833. if (rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_ETYPE) {
  834. fsp->flow_type |= FLOW_EXT;
  835. fsp->h_ext.vlan_etype = htons(rule->filter.vlan_etype);
  836. fsp->m_ext.vlan_etype = ETHER_TYPE_FULL_MASK;
  837. }
  838. if (rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_TCI) {
  839. fsp->flow_type |= FLOW_EXT;
  840. fsp->h_ext.vlan_tci = htons(rule->filter.vlan_tci);
  841. fsp->m_ext.vlan_tci = htons(rule->filter.vlan_tci_mask);
  842. }
  843. if (rule->filter.match_flags & IGC_FILTER_FLAG_DST_MAC_ADDR) {
  844. ether_addr_copy(fsp->h_u.ether_spec.h_dest,
  845. rule->filter.dst_addr);
  846. eth_broadcast_addr(fsp->m_u.ether_spec.h_dest);
  847. }
  848. if (rule->filter.match_flags & IGC_FILTER_FLAG_SRC_MAC_ADDR) {
  849. ether_addr_copy(fsp->h_u.ether_spec.h_source,
  850. rule->filter.src_addr);
  851. eth_broadcast_addr(fsp->m_u.ether_spec.h_source);
  852. }
  853. if (rule->filter.match_flags & IGC_FILTER_FLAG_USER_DATA) {
  854. fsp->flow_type |= FLOW_EXT;
  855. memcpy(fsp->h_ext.data, rule->filter.user_data, sizeof(fsp->h_ext.data));
  856. memcpy(fsp->m_ext.data, rule->filter.user_mask, sizeof(fsp->m_ext.data));
  857. }
  858. mutex_unlock(&adapter->nfc_rule_lock);
  859. return 0;
  860. out:
  861. mutex_unlock(&adapter->nfc_rule_lock);
  862. return -EINVAL;
  863. }
  864. static int igc_ethtool_get_nfc_rules(struct igc_adapter *adapter,
  865. struct ethtool_rxnfc *cmd,
  866. u32 *rule_locs)
  867. {
  868. struct igc_nfc_rule *rule;
  869. int cnt = 0;
  870. cmd->data = IGC_MAX_RXNFC_RULES;
  871. mutex_lock(&adapter->nfc_rule_lock);
  872. list_for_each_entry(rule, &adapter->nfc_rule_list, list) {
  873. if (cnt == cmd->rule_cnt) {
  874. mutex_unlock(&adapter->nfc_rule_lock);
  875. return -EMSGSIZE;
  876. }
  877. rule_locs[cnt] = rule->location;
  878. cnt++;
  879. }
  880. mutex_unlock(&adapter->nfc_rule_lock);
  881. cmd->rule_cnt = cnt;
  882. return 0;
  883. }
  884. static int igc_ethtool_get_rss_hash_opts(struct igc_adapter *adapter,
  885. struct ethtool_rxnfc *cmd)
  886. {
  887. cmd->data = 0;
  888. /* Report default options for RSS on igc */
  889. switch (cmd->flow_type) {
  890. case TCP_V4_FLOW:
  891. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  892. fallthrough;
  893. case UDP_V4_FLOW:
  894. if (adapter->flags & IGC_FLAG_RSS_FIELD_IPV4_UDP)
  895. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  896. fallthrough;
  897. case SCTP_V4_FLOW:
  898. case AH_ESP_V4_FLOW:
  899. case AH_V4_FLOW:
  900. case ESP_V4_FLOW:
  901. case IPV4_FLOW:
  902. cmd->data |= RXH_IP_SRC | RXH_IP_DST;
  903. break;
  904. case TCP_V6_FLOW:
  905. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  906. fallthrough;
  907. case UDP_V6_FLOW:
  908. if (adapter->flags & IGC_FLAG_RSS_FIELD_IPV6_UDP)
  909. cmd->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  910. fallthrough;
  911. case SCTP_V6_FLOW:
  912. case AH_ESP_V6_FLOW:
  913. case AH_V6_FLOW:
  914. case ESP_V6_FLOW:
  915. case IPV6_FLOW:
  916. cmd->data |= RXH_IP_SRC | RXH_IP_DST;
  917. break;
  918. default:
  919. return -EINVAL;
  920. }
  921. return 0;
  922. }
  923. static int igc_ethtool_get_rxnfc(struct net_device *dev,
  924. struct ethtool_rxnfc *cmd, u32 *rule_locs)
  925. {
  926. struct igc_adapter *adapter = netdev_priv(dev);
  927. switch (cmd->cmd) {
  928. case ETHTOOL_GRXRINGS:
  929. cmd->data = adapter->num_rx_queues;
  930. return 0;
  931. case ETHTOOL_GRXCLSRLCNT:
  932. cmd->rule_cnt = adapter->nfc_rule_count;
  933. return 0;
  934. case ETHTOOL_GRXCLSRULE:
  935. return igc_ethtool_get_nfc_rule(adapter, cmd);
  936. case ETHTOOL_GRXCLSRLALL:
  937. return igc_ethtool_get_nfc_rules(adapter, cmd, rule_locs);
  938. case ETHTOOL_GRXFH:
  939. return igc_ethtool_get_rss_hash_opts(adapter, cmd);
  940. default:
  941. return -EOPNOTSUPP;
  942. }
  943. }
  944. #define UDP_RSS_FLAGS (IGC_FLAG_RSS_FIELD_IPV4_UDP | \
  945. IGC_FLAG_RSS_FIELD_IPV6_UDP)
  946. static int igc_ethtool_set_rss_hash_opt(struct igc_adapter *adapter,
  947. struct ethtool_rxnfc *nfc)
  948. {
  949. u32 flags = adapter->flags;
  950. /* RSS does not support anything other than hashing
  951. * to queues on src and dst IPs and ports
  952. */
  953. if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
  954. RXH_L4_B_0_1 | RXH_L4_B_2_3))
  955. return -EINVAL;
  956. switch (nfc->flow_type) {
  957. case TCP_V4_FLOW:
  958. case TCP_V6_FLOW:
  959. if (!(nfc->data & RXH_IP_SRC) ||
  960. !(nfc->data & RXH_IP_DST) ||
  961. !(nfc->data & RXH_L4_B_0_1) ||
  962. !(nfc->data & RXH_L4_B_2_3))
  963. return -EINVAL;
  964. break;
  965. case UDP_V4_FLOW:
  966. if (!(nfc->data & RXH_IP_SRC) ||
  967. !(nfc->data & RXH_IP_DST))
  968. return -EINVAL;
  969. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  970. case 0:
  971. flags &= ~IGC_FLAG_RSS_FIELD_IPV4_UDP;
  972. break;
  973. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  974. flags |= IGC_FLAG_RSS_FIELD_IPV4_UDP;
  975. break;
  976. default:
  977. return -EINVAL;
  978. }
  979. break;
  980. case UDP_V6_FLOW:
  981. if (!(nfc->data & RXH_IP_SRC) ||
  982. !(nfc->data & RXH_IP_DST))
  983. return -EINVAL;
  984. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  985. case 0:
  986. flags &= ~IGC_FLAG_RSS_FIELD_IPV6_UDP;
  987. break;
  988. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  989. flags |= IGC_FLAG_RSS_FIELD_IPV6_UDP;
  990. break;
  991. default:
  992. return -EINVAL;
  993. }
  994. break;
  995. case AH_ESP_V4_FLOW:
  996. case AH_V4_FLOW:
  997. case ESP_V4_FLOW:
  998. case SCTP_V4_FLOW:
  999. case AH_ESP_V6_FLOW:
  1000. case AH_V6_FLOW:
  1001. case ESP_V6_FLOW:
  1002. case SCTP_V6_FLOW:
  1003. if (!(nfc->data & RXH_IP_SRC) ||
  1004. !(nfc->data & RXH_IP_DST) ||
  1005. (nfc->data & RXH_L4_B_0_1) ||
  1006. (nfc->data & RXH_L4_B_2_3))
  1007. return -EINVAL;
  1008. break;
  1009. default:
  1010. return -EINVAL;
  1011. }
  1012. /* if we changed something we need to update flags */
  1013. if (flags != adapter->flags) {
  1014. struct igc_hw *hw = &adapter->hw;
  1015. u32 mrqc = rd32(IGC_MRQC);
  1016. if ((flags & UDP_RSS_FLAGS) &&
  1017. !(adapter->flags & UDP_RSS_FLAGS))
  1018. netdev_err(adapter->netdev,
  1019. "Enabling UDP RSS: fragmented packets may arrive out of order to the stack above\n");
  1020. adapter->flags = flags;
  1021. /* Perform hash on these packet types */
  1022. mrqc |= IGC_MRQC_RSS_FIELD_IPV4 |
  1023. IGC_MRQC_RSS_FIELD_IPV4_TCP |
  1024. IGC_MRQC_RSS_FIELD_IPV6 |
  1025. IGC_MRQC_RSS_FIELD_IPV6_TCP;
  1026. mrqc &= ~(IGC_MRQC_RSS_FIELD_IPV4_UDP |
  1027. IGC_MRQC_RSS_FIELD_IPV6_UDP);
  1028. if (flags & IGC_FLAG_RSS_FIELD_IPV4_UDP)
  1029. mrqc |= IGC_MRQC_RSS_FIELD_IPV4_UDP;
  1030. if (flags & IGC_FLAG_RSS_FIELD_IPV6_UDP)
  1031. mrqc |= IGC_MRQC_RSS_FIELD_IPV6_UDP;
  1032. wr32(IGC_MRQC, mrqc);
  1033. }
  1034. return 0;
  1035. }
  1036. static void igc_ethtool_init_nfc_rule(struct igc_nfc_rule *rule,
  1037. const struct ethtool_rx_flow_spec *fsp)
  1038. {
  1039. INIT_LIST_HEAD(&rule->list);
  1040. rule->action = fsp->ring_cookie;
  1041. rule->location = fsp->location;
  1042. if ((fsp->flow_type & FLOW_EXT) && fsp->m_ext.vlan_tci) {
  1043. rule->filter.vlan_tci = ntohs(fsp->h_ext.vlan_tci);
  1044. rule->filter.vlan_tci_mask = ntohs(fsp->m_ext.vlan_tci);
  1045. rule->filter.match_flags |= IGC_FILTER_FLAG_VLAN_TCI;
  1046. }
  1047. if (fsp->m_u.ether_spec.h_proto == ETHER_TYPE_FULL_MASK) {
  1048. rule->filter.etype = ntohs(fsp->h_u.ether_spec.h_proto);
  1049. rule->filter.match_flags = IGC_FILTER_FLAG_ETHER_TYPE;
  1050. }
  1051. /* Both source and destination address filters only support the full
  1052. * mask.
  1053. */
  1054. if (is_broadcast_ether_addr(fsp->m_u.ether_spec.h_source)) {
  1055. rule->filter.match_flags |= IGC_FILTER_FLAG_SRC_MAC_ADDR;
  1056. ether_addr_copy(rule->filter.src_addr,
  1057. fsp->h_u.ether_spec.h_source);
  1058. }
  1059. if (is_broadcast_ether_addr(fsp->m_u.ether_spec.h_dest)) {
  1060. rule->filter.match_flags |= IGC_FILTER_FLAG_DST_MAC_ADDR;
  1061. ether_addr_copy(rule->filter.dst_addr,
  1062. fsp->h_u.ether_spec.h_dest);
  1063. }
  1064. /* VLAN etype matching */
  1065. if ((fsp->flow_type & FLOW_EXT) && fsp->h_ext.vlan_etype) {
  1066. rule->filter.vlan_etype = ntohs(fsp->h_ext.vlan_etype);
  1067. rule->filter.match_flags |= IGC_FILTER_FLAG_VLAN_ETYPE;
  1068. }
  1069. /* Check for user defined data */
  1070. if ((fsp->flow_type & FLOW_EXT) &&
  1071. (fsp->h_ext.data[0] || fsp->h_ext.data[1])) {
  1072. rule->filter.match_flags |= IGC_FILTER_FLAG_USER_DATA;
  1073. memcpy(rule->filter.user_data, fsp->h_ext.data, sizeof(fsp->h_ext.data));
  1074. memcpy(rule->filter.user_mask, fsp->m_ext.data, sizeof(fsp->m_ext.data));
  1075. }
  1076. /* The i225/i226 has various different filters. Flex filters provide a
  1077. * way to match up to the first 128 bytes of a packet. Use them for:
  1078. * a) For specific user data
  1079. * b) For VLAN EtherType
  1080. * c) For full TCI match
  1081. * d) Or in case multiple filter criteria are set
  1082. *
  1083. * Otherwise, use the simple MAC, VLAN PRIO or EtherType filters.
  1084. */
  1085. if ((rule->filter.match_flags & IGC_FILTER_FLAG_USER_DATA) ||
  1086. (rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_ETYPE) ||
  1087. ((rule->filter.match_flags & IGC_FILTER_FLAG_VLAN_TCI) &&
  1088. rule->filter.vlan_tci_mask == ntohs(VLAN_TCI_FULL_MASK)) ||
  1089. (rule->filter.match_flags & (rule->filter.match_flags - 1)))
  1090. rule->flex = true;
  1091. else
  1092. rule->flex = false;
  1093. }
  1094. /**
  1095. * igc_ethtool_check_nfc_rule() - Check if NFC rule is valid
  1096. * @adapter: Pointer to adapter
  1097. * @rule: Rule under evaluation
  1098. *
  1099. * The driver doesn't support rules with multiple matches so if more than
  1100. * one bit in filter flags is set, @rule is considered invalid.
  1101. *
  1102. * Also, if there is already another rule with the same filter in a different
  1103. * location, @rule is considered invalid.
  1104. *
  1105. * Context: Expects adapter->nfc_rule_lock to be held by caller.
  1106. *
  1107. * Return: 0 in case of success, negative errno code otherwise.
  1108. */
  1109. static int igc_ethtool_check_nfc_rule(struct igc_adapter *adapter,
  1110. struct igc_nfc_rule *rule)
  1111. {
  1112. struct net_device *dev = adapter->netdev;
  1113. u8 flags = rule->filter.match_flags;
  1114. struct igc_nfc_rule *tmp;
  1115. if (!flags) {
  1116. netdev_dbg(dev, "Rule with no match\n");
  1117. return -EINVAL;
  1118. }
  1119. list_for_each_entry(tmp, &adapter->nfc_rule_list, list) {
  1120. if (!memcmp(&rule->filter, &tmp->filter,
  1121. sizeof(rule->filter)) &&
  1122. tmp->location != rule->location) {
  1123. netdev_dbg(dev, "Rule already exists\n");
  1124. return -EEXIST;
  1125. }
  1126. }
  1127. return 0;
  1128. }
  1129. static int igc_ethtool_add_nfc_rule(struct igc_adapter *adapter,
  1130. struct ethtool_rxnfc *cmd)
  1131. {
  1132. struct net_device *netdev = adapter->netdev;
  1133. struct ethtool_rx_flow_spec *fsp =
  1134. (struct ethtool_rx_flow_spec *)&cmd->fs;
  1135. struct igc_nfc_rule *rule, *old_rule;
  1136. int err;
  1137. if (!(netdev->hw_features & NETIF_F_NTUPLE)) {
  1138. netdev_dbg(netdev, "N-tuple filters disabled\n");
  1139. return -EOPNOTSUPP;
  1140. }
  1141. if ((fsp->flow_type & ~FLOW_EXT) != ETHER_FLOW) {
  1142. netdev_dbg(netdev, "Only ethernet flow type is supported\n");
  1143. return -EOPNOTSUPP;
  1144. }
  1145. if (fsp->ring_cookie >= adapter->num_rx_queues) {
  1146. netdev_dbg(netdev, "Invalid action\n");
  1147. return -EINVAL;
  1148. }
  1149. /* There are two ways to match the VLAN TCI:
  1150. * 1. Match on PCP field and use vlan prio filter for it
  1151. * 2. Match on complete TCI field and use flex filter for it
  1152. */
  1153. if ((fsp->flow_type & FLOW_EXT) &&
  1154. fsp->m_ext.vlan_tci &&
  1155. fsp->m_ext.vlan_tci != htons(VLAN_PRIO_MASK) &&
  1156. fsp->m_ext.vlan_tci != VLAN_TCI_FULL_MASK) {
  1157. netdev_dbg(netdev, "VLAN mask not supported\n");
  1158. return -EOPNOTSUPP;
  1159. }
  1160. /* VLAN EtherType can only be matched by full mask. */
  1161. if ((fsp->flow_type & FLOW_EXT) &&
  1162. fsp->m_ext.vlan_etype &&
  1163. fsp->m_ext.vlan_etype != ETHER_TYPE_FULL_MASK) {
  1164. netdev_dbg(netdev, "VLAN EtherType mask not supported\n");
  1165. return -EOPNOTSUPP;
  1166. }
  1167. if (fsp->location >= IGC_MAX_RXNFC_RULES) {
  1168. netdev_dbg(netdev, "Invalid location\n");
  1169. return -EINVAL;
  1170. }
  1171. rule = kzalloc(sizeof(*rule), GFP_KERNEL);
  1172. if (!rule)
  1173. return -ENOMEM;
  1174. igc_ethtool_init_nfc_rule(rule, fsp);
  1175. mutex_lock(&adapter->nfc_rule_lock);
  1176. err = igc_ethtool_check_nfc_rule(adapter, rule);
  1177. if (err)
  1178. goto err;
  1179. old_rule = igc_get_nfc_rule(adapter, fsp->location);
  1180. if (old_rule)
  1181. igc_del_nfc_rule(adapter, old_rule);
  1182. err = igc_add_nfc_rule(adapter, rule);
  1183. if (err)
  1184. goto err;
  1185. mutex_unlock(&adapter->nfc_rule_lock);
  1186. return 0;
  1187. err:
  1188. mutex_unlock(&adapter->nfc_rule_lock);
  1189. kfree(rule);
  1190. return err;
  1191. }
  1192. static int igc_ethtool_del_nfc_rule(struct igc_adapter *adapter,
  1193. struct ethtool_rxnfc *cmd)
  1194. {
  1195. struct ethtool_rx_flow_spec *fsp =
  1196. (struct ethtool_rx_flow_spec *)&cmd->fs;
  1197. struct igc_nfc_rule *rule;
  1198. mutex_lock(&adapter->nfc_rule_lock);
  1199. rule = igc_get_nfc_rule(adapter, fsp->location);
  1200. if (!rule) {
  1201. mutex_unlock(&adapter->nfc_rule_lock);
  1202. return -EINVAL;
  1203. }
  1204. igc_del_nfc_rule(adapter, rule);
  1205. mutex_unlock(&adapter->nfc_rule_lock);
  1206. return 0;
  1207. }
  1208. static int igc_ethtool_set_rxnfc(struct net_device *dev,
  1209. struct ethtool_rxnfc *cmd)
  1210. {
  1211. struct igc_adapter *adapter = netdev_priv(dev);
  1212. switch (cmd->cmd) {
  1213. case ETHTOOL_SRXFH:
  1214. return igc_ethtool_set_rss_hash_opt(adapter, cmd);
  1215. case ETHTOOL_SRXCLSRLINS:
  1216. return igc_ethtool_add_nfc_rule(adapter, cmd);
  1217. case ETHTOOL_SRXCLSRLDEL:
  1218. return igc_ethtool_del_nfc_rule(adapter, cmd);
  1219. default:
  1220. return -EOPNOTSUPP;
  1221. }
  1222. }
  1223. void igc_write_rss_indir_tbl(struct igc_adapter *adapter)
  1224. {
  1225. struct igc_hw *hw = &adapter->hw;
  1226. u32 reg = IGC_RETA(0);
  1227. u32 shift = 0;
  1228. int i = 0;
  1229. while (i < IGC_RETA_SIZE) {
  1230. u32 val = 0;
  1231. int j;
  1232. for (j = 3; j >= 0; j--) {
  1233. val <<= 8;
  1234. val |= adapter->rss_indir_tbl[i + j];
  1235. }
  1236. wr32(reg, val << shift);
  1237. reg += 4;
  1238. i += 4;
  1239. }
  1240. }
  1241. static u32 igc_ethtool_get_rxfh_indir_size(struct net_device *netdev)
  1242. {
  1243. return IGC_RETA_SIZE;
  1244. }
  1245. static int igc_ethtool_get_rxfh(struct net_device *netdev,
  1246. struct ethtool_rxfh_param *rxfh)
  1247. {
  1248. struct igc_adapter *adapter = netdev_priv(netdev);
  1249. int i;
  1250. rxfh->hfunc = ETH_RSS_HASH_TOP;
  1251. if (!rxfh->indir)
  1252. return 0;
  1253. for (i = 0; i < IGC_RETA_SIZE; i++)
  1254. rxfh->indir[i] = adapter->rss_indir_tbl[i];
  1255. return 0;
  1256. }
  1257. static int igc_ethtool_set_rxfh(struct net_device *netdev,
  1258. struct ethtool_rxfh_param *rxfh,
  1259. struct netlink_ext_ack *extack)
  1260. {
  1261. struct igc_adapter *adapter = netdev_priv(netdev);
  1262. u32 num_queues;
  1263. int i;
  1264. /* We do not allow change in unsupported parameters */
  1265. if (rxfh->key ||
  1266. (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
  1267. rxfh->hfunc != ETH_RSS_HASH_TOP))
  1268. return -EOPNOTSUPP;
  1269. if (!rxfh->indir)
  1270. return 0;
  1271. num_queues = adapter->rss_queues;
  1272. /* Verify user input. */
  1273. for (i = 0; i < IGC_RETA_SIZE; i++)
  1274. if (rxfh->indir[i] >= num_queues)
  1275. return -EINVAL;
  1276. for (i = 0; i < IGC_RETA_SIZE; i++)
  1277. adapter->rss_indir_tbl[i] = rxfh->indir[i];
  1278. igc_write_rss_indir_tbl(adapter);
  1279. return 0;
  1280. }
  1281. static void igc_ethtool_get_channels(struct net_device *netdev,
  1282. struct ethtool_channels *ch)
  1283. {
  1284. struct igc_adapter *adapter = netdev_priv(netdev);
  1285. /* Report maximum channels */
  1286. ch->max_combined = igc_get_max_rss_queues(adapter);
  1287. /* Report info for other vector */
  1288. if (adapter->flags & IGC_FLAG_HAS_MSIX) {
  1289. ch->max_other = NON_Q_VECTORS;
  1290. ch->other_count = NON_Q_VECTORS;
  1291. }
  1292. ch->combined_count = adapter->rss_queues;
  1293. }
  1294. static int igc_ethtool_set_channels(struct net_device *netdev,
  1295. struct ethtool_channels *ch)
  1296. {
  1297. struct igc_adapter *adapter = netdev_priv(netdev);
  1298. unsigned int count = ch->combined_count;
  1299. unsigned int max_combined = 0;
  1300. /* Verify they are not requesting separate vectors */
  1301. if (!count || ch->rx_count || ch->tx_count)
  1302. return -EINVAL;
  1303. /* Verify other_count is valid and has not been changed */
  1304. if (ch->other_count != NON_Q_VECTORS)
  1305. return -EINVAL;
  1306. /* Do not allow channel reconfiguration when mqprio is enabled */
  1307. if (adapter->strict_priority_enable)
  1308. return -EINVAL;
  1309. /* Verify the number of channels doesn't exceed hw limits */
  1310. max_combined = igc_get_max_rss_queues(adapter);
  1311. if (count > max_combined)
  1312. return -EINVAL;
  1313. if (count != adapter->rss_queues) {
  1314. adapter->rss_queues = count;
  1315. igc_set_flag_queue_pairs(adapter, max_combined);
  1316. /* Hardware has to reinitialize queues and interrupts to
  1317. * match the new configuration.
  1318. */
  1319. return igc_reinit_queues(adapter);
  1320. }
  1321. return 0;
  1322. }
  1323. static int igc_ethtool_get_ts_info(struct net_device *dev,
  1324. struct kernel_ethtool_ts_info *info)
  1325. {
  1326. struct igc_adapter *adapter = netdev_priv(dev);
  1327. if (adapter->ptp_clock)
  1328. info->phc_index = ptp_clock_index(adapter->ptp_clock);
  1329. switch (adapter->hw.mac.type) {
  1330. case igc_i225:
  1331. info->so_timestamping =
  1332. SOF_TIMESTAMPING_TX_SOFTWARE |
  1333. SOF_TIMESTAMPING_TX_HARDWARE |
  1334. SOF_TIMESTAMPING_RX_HARDWARE |
  1335. SOF_TIMESTAMPING_RAW_HARDWARE;
  1336. info->tx_types =
  1337. BIT(HWTSTAMP_TX_OFF) |
  1338. BIT(HWTSTAMP_TX_ON);
  1339. info->rx_filters = BIT(HWTSTAMP_FILTER_NONE);
  1340. info->rx_filters |= BIT(HWTSTAMP_FILTER_ALL);
  1341. return 0;
  1342. default:
  1343. return -EOPNOTSUPP;
  1344. }
  1345. }
  1346. static u32 igc_ethtool_get_priv_flags(struct net_device *netdev)
  1347. {
  1348. struct igc_adapter *adapter = netdev_priv(netdev);
  1349. u32 priv_flags = 0;
  1350. if (adapter->flags & IGC_FLAG_RX_LEGACY)
  1351. priv_flags |= IGC_PRIV_FLAGS_LEGACY_RX;
  1352. return priv_flags;
  1353. }
  1354. static int igc_ethtool_set_priv_flags(struct net_device *netdev, u32 priv_flags)
  1355. {
  1356. struct igc_adapter *adapter = netdev_priv(netdev);
  1357. unsigned int flags = adapter->flags;
  1358. flags &= ~IGC_FLAG_RX_LEGACY;
  1359. if (priv_flags & IGC_PRIV_FLAGS_LEGACY_RX)
  1360. flags |= IGC_FLAG_RX_LEGACY;
  1361. if (flags != adapter->flags) {
  1362. adapter->flags = flags;
  1363. /* reset interface to repopulate queues */
  1364. if (netif_running(netdev))
  1365. igc_reinit_locked(adapter);
  1366. }
  1367. return 0;
  1368. }
  1369. static int igc_ethtool_get_eee(struct net_device *netdev,
  1370. struct ethtool_keee *edata)
  1371. {
  1372. struct igc_adapter *adapter = netdev_priv(netdev);
  1373. struct igc_hw *hw = &adapter->hw;
  1374. struct igc_phy_info *phy = &hw->phy;
  1375. u16 eee_advert, eee_lp_advert;
  1376. u32 eeer, ret_val;
  1377. /* EEE supported */
  1378. linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1379. edata->supported);
  1380. linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  1381. edata->supported);
  1382. linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
  1383. edata->supported);
  1384. /* EEE Advertisement 1 - reg 7.60 */
  1385. ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
  1386. MMD_DEVADDR_SHIFT) |
  1387. IGC_ANEG_EEE_AB1,
  1388. &eee_advert);
  1389. if (ret_val) {
  1390. netdev_err(adapter->netdev,
  1391. "Failed to read IEEE 7.60 register\n");
  1392. return -EINVAL;
  1393. }
  1394. if (eee_advert & IGC_EEE_1000BT_MASK)
  1395. linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  1396. edata->advertised);
  1397. if (eee_advert & IGC_EEE_100BT_MASK)
  1398. linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
  1399. edata->advertised);
  1400. /* EEE Advertisement 2 - reg 7.62 */
  1401. ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
  1402. MMD_DEVADDR_SHIFT) |
  1403. IGC_ANEG_EEE_AB2,
  1404. &eee_advert);
  1405. if (ret_val) {
  1406. netdev_err(adapter->netdev,
  1407. "Failed to read IEEE 7.62 register\n");
  1408. return -EINVAL;
  1409. }
  1410. if (eee_advert & IGC_EEE_2500BT_MASK)
  1411. linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1412. edata->advertised);
  1413. /* EEE Link-Partner Ability 1 - reg 7.61 */
  1414. ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
  1415. MMD_DEVADDR_SHIFT) |
  1416. IGC_ANEG_EEE_LP_AB1,
  1417. &eee_lp_advert);
  1418. if (ret_val) {
  1419. netdev_err(adapter->netdev,
  1420. "Failed to read IEEE 7.61 register\n");
  1421. return -EINVAL;
  1422. }
  1423. if (eee_lp_advert & IGC_LP_EEE_1000BT_MASK)
  1424. linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT,
  1425. edata->lp_advertised);
  1426. if (eee_lp_advert & IGC_LP_EEE_100BT_MASK)
  1427. linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT,
  1428. edata->lp_advertised);
  1429. /* EEE Link-Partner Ability 2 - reg 7.63 */
  1430. ret_val = phy->ops.read_reg(hw, (STANDARD_AN_REG_MASK <<
  1431. MMD_DEVADDR_SHIFT) |
  1432. IGC_ANEG_EEE_LP_AB2,
  1433. &eee_lp_advert);
  1434. if (ret_val) {
  1435. netdev_err(adapter->netdev,
  1436. "Failed to read IEEE 7.63 register\n");
  1437. return -EINVAL;
  1438. }
  1439. if (eee_lp_advert & IGC_LP_EEE_2500BT_MASK)
  1440. linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT,
  1441. edata->lp_advertised);
  1442. eeer = rd32(IGC_EEER);
  1443. /* EEE status on negotiated link */
  1444. if (eeer & IGC_EEER_EEE_NEG)
  1445. edata->eee_active = true;
  1446. if (eeer & IGC_EEER_TX_LPI_EN)
  1447. edata->tx_lpi_enabled = true;
  1448. edata->eee_enabled = hw->dev_spec._base.eee_enable;
  1449. /* Report correct negotiated EEE status for devices that
  1450. * wrongly report EEE at half-duplex
  1451. */
  1452. if (adapter->link_duplex == HALF_DUPLEX) {
  1453. edata->eee_enabled = false;
  1454. edata->eee_active = false;
  1455. edata->tx_lpi_enabled = false;
  1456. linkmode_zero(edata->advertised);
  1457. }
  1458. return 0;
  1459. }
  1460. static int igc_ethtool_set_eee(struct net_device *netdev,
  1461. struct ethtool_keee *edata)
  1462. {
  1463. struct igc_adapter *adapter = netdev_priv(netdev);
  1464. struct igc_hw *hw = &adapter->hw;
  1465. struct ethtool_keee eee_curr;
  1466. s32 ret_val;
  1467. memset(&eee_curr, 0, sizeof(struct ethtool_keee));
  1468. ret_val = igc_ethtool_get_eee(netdev, &eee_curr);
  1469. if (ret_val) {
  1470. netdev_err(netdev,
  1471. "Problem setting EEE advertisement options\n");
  1472. return -EINVAL;
  1473. }
  1474. if (eee_curr.eee_enabled) {
  1475. if (eee_curr.tx_lpi_enabled != edata->tx_lpi_enabled) {
  1476. netdev_err(netdev,
  1477. "Setting EEE tx-lpi is not supported\n");
  1478. return -EINVAL;
  1479. }
  1480. /* Tx LPI timer is not implemented currently */
  1481. if (edata->tx_lpi_timer) {
  1482. netdev_err(netdev,
  1483. "Setting EEE Tx LPI timer is not supported\n");
  1484. return -EINVAL;
  1485. }
  1486. } else if (!edata->eee_enabled) {
  1487. netdev_err(netdev,
  1488. "Setting EEE options are not supported with EEE disabled\n");
  1489. return -EINVAL;
  1490. }
  1491. if (hw->dev_spec._base.eee_enable != edata->eee_enabled) {
  1492. hw->dev_spec._base.eee_enable = edata->eee_enabled;
  1493. adapter->flags |= IGC_FLAG_EEE;
  1494. /* reset link */
  1495. if (netif_running(netdev))
  1496. igc_reinit_locked(adapter);
  1497. else
  1498. igc_reset(adapter);
  1499. }
  1500. return 0;
  1501. }
  1502. static int igc_ethtool_get_link_ksettings(struct net_device *netdev,
  1503. struct ethtool_link_ksettings *cmd)
  1504. {
  1505. struct igc_adapter *adapter = netdev_priv(netdev);
  1506. struct igc_hw *hw = &adapter->hw;
  1507. u32 status;
  1508. u32 speed;
  1509. ethtool_link_ksettings_zero_link_mode(cmd, supported);
  1510. ethtool_link_ksettings_zero_link_mode(cmd, advertising);
  1511. /* supported link modes */
  1512. ethtool_link_ksettings_add_link_mode(cmd, supported, 10baseT_Half);
  1513. ethtool_link_ksettings_add_link_mode(cmd, supported, 10baseT_Full);
  1514. ethtool_link_ksettings_add_link_mode(cmd, supported, 100baseT_Half);
  1515. ethtool_link_ksettings_add_link_mode(cmd, supported, 100baseT_Full);
  1516. ethtool_link_ksettings_add_link_mode(cmd, supported, 1000baseT_Full);
  1517. ethtool_link_ksettings_add_link_mode(cmd, supported, 2500baseT_Full);
  1518. /* twisted pair */
  1519. cmd->base.port = PORT_TP;
  1520. cmd->base.phy_address = hw->phy.addr;
  1521. ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
  1522. ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
  1523. /* advertising link modes */
  1524. if (hw->phy.autoneg_advertised & ADVERTISE_10_HALF)
  1525. ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Half);
  1526. if (hw->phy.autoneg_advertised & ADVERTISE_10_FULL)
  1527. ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Full);
  1528. if (hw->phy.autoneg_advertised & ADVERTISE_100_HALF)
  1529. ethtool_link_ksettings_add_link_mode(cmd, advertising, 100baseT_Half);
  1530. if (hw->phy.autoneg_advertised & ADVERTISE_100_FULL)
  1531. ethtool_link_ksettings_add_link_mode(cmd, advertising, 100baseT_Full);
  1532. if (hw->phy.autoneg_advertised & ADVERTISE_1000_FULL)
  1533. ethtool_link_ksettings_add_link_mode(cmd, advertising, 1000baseT_Full);
  1534. if (hw->phy.autoneg_advertised & ADVERTISE_2500_FULL)
  1535. ethtool_link_ksettings_add_link_mode(cmd, advertising, 2500baseT_Full);
  1536. /* set autoneg settings */
  1537. if (hw->mac.autoneg == 1) {
  1538. ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg);
  1539. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  1540. Autoneg);
  1541. }
  1542. /* Set pause flow control settings */
  1543. ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
  1544. switch (hw->fc.requested_mode) {
  1545. case igc_fc_full:
  1546. ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
  1547. break;
  1548. case igc_fc_rx_pause:
  1549. ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
  1550. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  1551. Asym_Pause);
  1552. break;
  1553. case igc_fc_tx_pause:
  1554. ethtool_link_ksettings_add_link_mode(cmd, advertising,
  1555. Asym_Pause);
  1556. break;
  1557. default:
  1558. break;
  1559. }
  1560. status = pm_runtime_suspended(&adapter->pdev->dev) ?
  1561. 0 : rd32(IGC_STATUS);
  1562. if (status & IGC_STATUS_LU) {
  1563. if (status & IGC_STATUS_SPEED_1000) {
  1564. /* For I225, STATUS will indicate 1G speed in both
  1565. * 1 Gbps and 2.5 Gbps link modes.
  1566. * An additional bit is used
  1567. * to differentiate between 1 Gbps and 2.5 Gbps.
  1568. */
  1569. if (hw->mac.type == igc_i225 &&
  1570. (status & IGC_STATUS_SPEED_2500)) {
  1571. speed = SPEED_2500;
  1572. } else {
  1573. speed = SPEED_1000;
  1574. }
  1575. } else if (status & IGC_STATUS_SPEED_100) {
  1576. speed = SPEED_100;
  1577. } else {
  1578. speed = SPEED_10;
  1579. }
  1580. if ((status & IGC_STATUS_FD) ||
  1581. hw->phy.media_type != igc_media_type_copper)
  1582. cmd->base.duplex = DUPLEX_FULL;
  1583. else
  1584. cmd->base.duplex = DUPLEX_HALF;
  1585. } else {
  1586. speed = SPEED_UNKNOWN;
  1587. cmd->base.duplex = DUPLEX_UNKNOWN;
  1588. }
  1589. cmd->base.speed = speed;
  1590. if (hw->mac.autoneg)
  1591. cmd->base.autoneg = AUTONEG_ENABLE;
  1592. else
  1593. cmd->base.autoneg = AUTONEG_DISABLE;
  1594. /* MDI-X => 2; MDI =>1; Invalid =>0 */
  1595. if (hw->phy.media_type == igc_media_type_copper)
  1596. cmd->base.eth_tp_mdix = hw->phy.is_mdix ? ETH_TP_MDI_X :
  1597. ETH_TP_MDI;
  1598. else
  1599. cmd->base.eth_tp_mdix = ETH_TP_MDI_INVALID;
  1600. if (hw->phy.mdix == AUTO_ALL_MODES)
  1601. cmd->base.eth_tp_mdix_ctrl = ETH_TP_MDI_AUTO;
  1602. else
  1603. cmd->base.eth_tp_mdix_ctrl = hw->phy.mdix;
  1604. return 0;
  1605. }
  1606. static int
  1607. igc_ethtool_set_link_ksettings(struct net_device *netdev,
  1608. const struct ethtool_link_ksettings *cmd)
  1609. {
  1610. struct igc_adapter *adapter = netdev_priv(netdev);
  1611. struct net_device *dev = adapter->netdev;
  1612. struct igc_hw *hw = &adapter->hw;
  1613. u16 advertised = 0;
  1614. /* When adapter in resetting mode, autoneg/speed/duplex
  1615. * cannot be changed
  1616. */
  1617. if (igc_check_reset_block(hw)) {
  1618. netdev_err(dev, "Cannot change link characteristics when reset is active\n");
  1619. return -EINVAL;
  1620. }
  1621. /* MDI setting is only allowed when autoneg enabled because
  1622. * some hardware doesn't allow MDI setting when speed or
  1623. * duplex is forced.
  1624. */
  1625. if (cmd->base.eth_tp_mdix_ctrl) {
  1626. if (cmd->base.eth_tp_mdix_ctrl != ETH_TP_MDI_AUTO &&
  1627. cmd->base.autoneg != AUTONEG_ENABLE) {
  1628. netdev_err(dev, "Forcing MDI/MDI-X state is not supported when link speed and/or duplex are forced\n");
  1629. return -EINVAL;
  1630. }
  1631. }
  1632. while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
  1633. usleep_range(1000, 2000);
  1634. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  1635. 2500baseT_Full))
  1636. advertised |= ADVERTISE_2500_FULL;
  1637. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  1638. 1000baseT_Full))
  1639. advertised |= ADVERTISE_1000_FULL;
  1640. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  1641. 100baseT_Full))
  1642. advertised |= ADVERTISE_100_FULL;
  1643. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  1644. 100baseT_Half))
  1645. advertised |= ADVERTISE_100_HALF;
  1646. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  1647. 10baseT_Full))
  1648. advertised |= ADVERTISE_10_FULL;
  1649. if (ethtool_link_ksettings_test_link_mode(cmd, advertising,
  1650. 10baseT_Half))
  1651. advertised |= ADVERTISE_10_HALF;
  1652. if (cmd->base.autoneg == AUTONEG_ENABLE) {
  1653. hw->mac.autoneg = 1;
  1654. hw->phy.autoneg_advertised = advertised;
  1655. if (adapter->fc_autoneg)
  1656. hw->fc.requested_mode = igc_fc_default;
  1657. } else {
  1658. netdev_info(dev, "Force mode currently not supported\n");
  1659. }
  1660. /* MDI-X => 2; MDI => 1; Auto => 3 */
  1661. if (cmd->base.eth_tp_mdix_ctrl) {
  1662. /* fix up the value for auto (3 => 0) as zero is mapped
  1663. * internally to auto
  1664. */
  1665. if (cmd->base.eth_tp_mdix_ctrl == ETH_TP_MDI_AUTO)
  1666. hw->phy.mdix = AUTO_ALL_MODES;
  1667. else
  1668. hw->phy.mdix = cmd->base.eth_tp_mdix_ctrl;
  1669. }
  1670. /* reset the link */
  1671. if (netif_running(adapter->netdev)) {
  1672. igc_down(adapter);
  1673. igc_up(adapter);
  1674. } else {
  1675. igc_reset(adapter);
  1676. }
  1677. clear_bit(__IGC_RESETTING, &adapter->state);
  1678. return 0;
  1679. }
  1680. static void igc_ethtool_diag_test(struct net_device *netdev,
  1681. struct ethtool_test *eth_test, u64 *data)
  1682. {
  1683. struct igc_adapter *adapter = netdev_priv(netdev);
  1684. bool if_running = netif_running(netdev);
  1685. if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
  1686. netdev_info(adapter->netdev, "Offline testing starting");
  1687. set_bit(__IGC_TESTING, &adapter->state);
  1688. /* Link test performed before hardware reset so autoneg doesn't
  1689. * interfere with test result
  1690. */
  1691. if (!igc_link_test(adapter, &data[TEST_LINK]))
  1692. eth_test->flags |= ETH_TEST_FL_FAILED;
  1693. if (if_running)
  1694. igc_close(netdev);
  1695. else
  1696. igc_reset(adapter);
  1697. netdev_info(adapter->netdev, "Register testing starting");
  1698. if (!igc_reg_test(adapter, &data[TEST_REG]))
  1699. eth_test->flags |= ETH_TEST_FL_FAILED;
  1700. igc_reset(adapter);
  1701. netdev_info(adapter->netdev, "EEPROM testing starting");
  1702. if (!igc_eeprom_test(adapter, &data[TEST_EEP]))
  1703. eth_test->flags |= ETH_TEST_FL_FAILED;
  1704. igc_reset(adapter);
  1705. /* loopback and interrupt tests
  1706. * will be implemented in the future
  1707. */
  1708. data[TEST_LOOP] = 0;
  1709. data[TEST_IRQ] = 0;
  1710. clear_bit(__IGC_TESTING, &adapter->state);
  1711. if (if_running)
  1712. igc_open(netdev);
  1713. } else {
  1714. netdev_info(adapter->netdev, "Online testing starting");
  1715. /* register, eeprom, intr and loopback tests not run online */
  1716. data[TEST_REG] = 0;
  1717. data[TEST_EEP] = 0;
  1718. data[TEST_IRQ] = 0;
  1719. data[TEST_LOOP] = 0;
  1720. if (!igc_link_test(adapter, &data[TEST_LINK]))
  1721. eth_test->flags |= ETH_TEST_FL_FAILED;
  1722. }
  1723. msleep_interruptible(4 * 1000);
  1724. }
  1725. static const struct ethtool_ops igc_ethtool_ops = {
  1726. .supported_coalesce_params = ETHTOOL_COALESCE_USECS,
  1727. .get_drvinfo = igc_ethtool_get_drvinfo,
  1728. .get_regs_len = igc_ethtool_get_regs_len,
  1729. .get_regs = igc_ethtool_get_regs,
  1730. .get_wol = igc_ethtool_get_wol,
  1731. .set_wol = igc_ethtool_set_wol,
  1732. .get_msglevel = igc_ethtool_get_msglevel,
  1733. .set_msglevel = igc_ethtool_set_msglevel,
  1734. .nway_reset = igc_ethtool_nway_reset,
  1735. .get_link = igc_ethtool_get_link,
  1736. .get_eeprom_len = igc_ethtool_get_eeprom_len,
  1737. .get_eeprom = igc_ethtool_get_eeprom,
  1738. .set_eeprom = igc_ethtool_set_eeprom,
  1739. .get_ringparam = igc_ethtool_get_ringparam,
  1740. .set_ringparam = igc_ethtool_set_ringparam,
  1741. .get_pauseparam = igc_ethtool_get_pauseparam,
  1742. .set_pauseparam = igc_ethtool_set_pauseparam,
  1743. .get_strings = igc_ethtool_get_strings,
  1744. .get_sset_count = igc_ethtool_get_sset_count,
  1745. .get_ethtool_stats = igc_ethtool_get_stats,
  1746. .get_coalesce = igc_ethtool_get_coalesce,
  1747. .set_coalesce = igc_ethtool_set_coalesce,
  1748. .get_rxnfc = igc_ethtool_get_rxnfc,
  1749. .set_rxnfc = igc_ethtool_set_rxnfc,
  1750. .get_rxfh_indir_size = igc_ethtool_get_rxfh_indir_size,
  1751. .get_rxfh = igc_ethtool_get_rxfh,
  1752. .set_rxfh = igc_ethtool_set_rxfh,
  1753. .get_ts_info = igc_ethtool_get_ts_info,
  1754. .get_channels = igc_ethtool_get_channels,
  1755. .set_channels = igc_ethtool_set_channels,
  1756. .get_priv_flags = igc_ethtool_get_priv_flags,
  1757. .set_priv_flags = igc_ethtool_set_priv_flags,
  1758. .get_eee = igc_ethtool_get_eee,
  1759. .set_eee = igc_ethtool_set_eee,
  1760. .get_link_ksettings = igc_ethtool_get_link_ksettings,
  1761. .set_link_ksettings = igc_ethtool_set_link_ksettings,
  1762. .self_test = igc_ethtool_diag_test,
  1763. };
  1764. void igc_ethtool_set_ops(struct net_device *netdev)
  1765. {
  1766. netdev->ethtool_ops = &igc_ethtool_ops;
  1767. }