vmxnet3_ethtool.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377
  1. /*
  2. * Linux driver for VMware's vmxnet3 ethernet NIC.
  3. *
  4. * Copyright (C) 2008-2024, VMware, Inc. All Rights Reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the
  8. * Free Software Foundation; version 2 of the License and no later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
  13. * NON INFRINGEMENT. See the GNU General Public License for more
  14. * details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19. *
  20. * The full GNU General Public License is included in this distribution in
  21. * the file called "COPYING".
  22. *
  23. * Maintained by: pv-drivers@vmware.com
  24. *
  25. */
  26. #include "vmxnet3_int.h"
  27. #include <net/vxlan.h>
  28. #include <net/geneve.h>
  29. #include "vmxnet3_xdp.h"
  30. #define VXLAN_UDP_PORT 8472
  31. struct vmxnet3_stat_desc {
  32. char desc[ETH_GSTRING_LEN];
  33. int offset;
  34. };
  35. /* per tq stats maintained by the device */
  36. static const struct vmxnet3_stat_desc
  37. vmxnet3_tq_dev_stats[] = {
  38. /* description, offset */
  39. { "Tx Queue#", 0 },
  40. { " TSO pkts tx", offsetof(struct UPT1_TxStats, TSOPktsTxOK) },
  41. { " TSO bytes tx", offsetof(struct UPT1_TxStats, TSOBytesTxOK) },
  42. { " ucast pkts tx", offsetof(struct UPT1_TxStats, ucastPktsTxOK) },
  43. { " ucast bytes tx", offsetof(struct UPT1_TxStats, ucastBytesTxOK) },
  44. { " mcast pkts tx", offsetof(struct UPT1_TxStats, mcastPktsTxOK) },
  45. { " mcast bytes tx", offsetof(struct UPT1_TxStats, mcastBytesTxOK) },
  46. { " bcast pkts tx", offsetof(struct UPT1_TxStats, bcastPktsTxOK) },
  47. { " bcast bytes tx", offsetof(struct UPT1_TxStats, bcastBytesTxOK) },
  48. { " pkts tx err", offsetof(struct UPT1_TxStats, pktsTxError) },
  49. { " pkts tx discard", offsetof(struct UPT1_TxStats, pktsTxDiscard) },
  50. };
  51. /* per tq stats maintained by the driver */
  52. static const struct vmxnet3_stat_desc
  53. vmxnet3_tq_driver_stats[] = {
  54. /* description, offset */
  55. {" drv dropped tx total", offsetof(struct vmxnet3_tq_driver_stats,
  56. drop_total) },
  57. { " too many frags", offsetof(struct vmxnet3_tq_driver_stats,
  58. drop_too_many_frags) },
  59. { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats,
  60. drop_oversized_hdr) },
  61. { " hdr err", offsetof(struct vmxnet3_tq_driver_stats,
  62. drop_hdr_inspect_err) },
  63. { " tso", offsetof(struct vmxnet3_tq_driver_stats,
  64. drop_tso) },
  65. { " ring full", offsetof(struct vmxnet3_tq_driver_stats,
  66. tx_ring_full) },
  67. { " pkts linearized", offsetof(struct vmxnet3_tq_driver_stats,
  68. linearized) },
  69. { " hdr cloned", offsetof(struct vmxnet3_tq_driver_stats,
  70. copy_skb_header) },
  71. { " giant hdr", offsetof(struct vmxnet3_tq_driver_stats,
  72. oversized_hdr) },
  73. { " xdp xmit", offsetof(struct vmxnet3_tq_driver_stats,
  74. xdp_xmit) },
  75. { " xdp xmit err", offsetof(struct vmxnet3_tq_driver_stats,
  76. xdp_xmit_err) },
  77. };
  78. /* per rq stats maintained by the device */
  79. static const struct vmxnet3_stat_desc
  80. vmxnet3_rq_dev_stats[] = {
  81. { "Rx Queue#", 0 },
  82. { " LRO pkts rx", offsetof(struct UPT1_RxStats, LROPktsRxOK) },
  83. { " LRO byte rx", offsetof(struct UPT1_RxStats, LROBytesRxOK) },
  84. { " ucast pkts rx", offsetof(struct UPT1_RxStats, ucastPktsRxOK) },
  85. { " ucast bytes rx", offsetof(struct UPT1_RxStats, ucastBytesRxOK) },
  86. { " mcast pkts rx", offsetof(struct UPT1_RxStats, mcastPktsRxOK) },
  87. { " mcast bytes rx", offsetof(struct UPT1_RxStats, mcastBytesRxOK) },
  88. { " bcast pkts rx", offsetof(struct UPT1_RxStats, bcastPktsRxOK) },
  89. { " bcast bytes rx", offsetof(struct UPT1_RxStats, bcastBytesRxOK) },
  90. { " pkts rx OOB", offsetof(struct UPT1_RxStats, pktsRxOutOfBuf) },
  91. { " pkts rx err", offsetof(struct UPT1_RxStats, pktsRxError) },
  92. };
  93. /* per rq stats maintained by the driver */
  94. static const struct vmxnet3_stat_desc
  95. vmxnet3_rq_driver_stats[] = {
  96. /* description, offset */
  97. { " drv dropped rx total", offsetof(struct vmxnet3_rq_driver_stats,
  98. drop_total) },
  99. { " err", offsetof(struct vmxnet3_rq_driver_stats,
  100. drop_err) },
  101. { " fcs", offsetof(struct vmxnet3_rq_driver_stats,
  102. drop_fcs) },
  103. { " rx buf alloc fail", offsetof(struct vmxnet3_rq_driver_stats,
  104. rx_buf_alloc_failure) },
  105. { " xdp packets", offsetof(struct vmxnet3_rq_driver_stats,
  106. xdp_packets) },
  107. { " xdp tx", offsetof(struct vmxnet3_rq_driver_stats,
  108. xdp_tx) },
  109. { " xdp redirects", offsetof(struct vmxnet3_rq_driver_stats,
  110. xdp_redirects) },
  111. { " xdp drops", offsetof(struct vmxnet3_rq_driver_stats,
  112. xdp_drops) },
  113. { " xdp aborted", offsetof(struct vmxnet3_rq_driver_stats,
  114. xdp_aborted) },
  115. };
  116. /* global stats maintained by the driver */
  117. static const struct vmxnet3_stat_desc
  118. vmxnet3_global_stats[] = {
  119. /* description, offset */
  120. { "tx timeout count", offsetof(struct vmxnet3_adapter,
  121. tx_timeout_count) }
  122. };
  123. void
  124. vmxnet3_get_stats64(struct net_device *netdev,
  125. struct rtnl_link_stats64 *stats)
  126. {
  127. struct vmxnet3_adapter *adapter;
  128. struct vmxnet3_tq_driver_stats *drvTxStats;
  129. struct vmxnet3_rq_driver_stats *drvRxStats;
  130. struct UPT1_TxStats *devTxStats;
  131. struct UPT1_RxStats *devRxStats;
  132. unsigned long flags;
  133. int i;
  134. adapter = netdev_priv(netdev);
  135. /* Collect the dev stats into the shared area */
  136. spin_lock_irqsave(&adapter->cmd_lock, flags);
  137. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS);
  138. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  139. for (i = 0; i < adapter->num_tx_queues; i++) {
  140. devTxStats = &adapter->tqd_start[i].stats;
  141. drvTxStats = &adapter->tx_queue[i].stats;
  142. stats->tx_packets += devTxStats->ucastPktsTxOK +
  143. devTxStats->mcastPktsTxOK +
  144. devTxStats->bcastPktsTxOK;
  145. stats->tx_bytes += devTxStats->ucastBytesTxOK +
  146. devTxStats->mcastBytesTxOK +
  147. devTxStats->bcastBytesTxOK;
  148. stats->tx_errors += devTxStats->pktsTxError;
  149. stats->tx_dropped += drvTxStats->drop_total;
  150. }
  151. for (i = 0; i < adapter->num_rx_queues; i++) {
  152. devRxStats = &adapter->rqd_start[i].stats;
  153. drvRxStats = &adapter->rx_queue[i].stats;
  154. stats->rx_packets += devRxStats->ucastPktsRxOK +
  155. devRxStats->mcastPktsRxOK +
  156. devRxStats->bcastPktsRxOK;
  157. stats->rx_bytes += devRxStats->ucastBytesRxOK +
  158. devRxStats->mcastBytesRxOK +
  159. devRxStats->bcastBytesRxOK;
  160. stats->rx_errors += devRxStats->pktsRxError;
  161. stats->rx_dropped += drvRxStats->drop_total;
  162. stats->multicast += devRxStats->mcastPktsRxOK;
  163. }
  164. }
  165. static int
  166. vmxnet3_get_sset_count(struct net_device *netdev, int sset)
  167. {
  168. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  169. switch (sset) {
  170. case ETH_SS_STATS:
  171. return (ARRAY_SIZE(vmxnet3_tq_dev_stats) +
  172. ARRAY_SIZE(vmxnet3_tq_driver_stats)) *
  173. adapter->num_tx_queues +
  174. (ARRAY_SIZE(vmxnet3_rq_dev_stats) +
  175. ARRAY_SIZE(vmxnet3_rq_driver_stats)) *
  176. adapter->num_rx_queues +
  177. ARRAY_SIZE(vmxnet3_global_stats);
  178. default:
  179. return -EOPNOTSUPP;
  180. }
  181. }
  182. /* This is a version 2 of the vmxnet3 ethtool_regs which goes hand in hand with
  183. * the version 2 of the vmxnet3 support for ethtool(8) --register-dump.
  184. * Therefore, if any registers are added, removed or modified, then a version
  185. * bump and a corresponding change in the vmxnet3 support for ethtool(8)
  186. * --register-dump would be required.
  187. */
  188. static int
  189. vmxnet3_get_regs_len(struct net_device *netdev)
  190. {
  191. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  192. return ((9 /* BAR1 registers */ +
  193. (1 + adapter->intr.num_intrs) +
  194. (1 + adapter->num_tx_queues * 17 /* Tx queue registers */) +
  195. (1 + adapter->num_rx_queues * 23 /* Rx queue registers */)) *
  196. sizeof(u32));
  197. }
  198. static void
  199. vmxnet3_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo)
  200. {
  201. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  202. strscpy(drvinfo->driver, vmxnet3_driver_name, sizeof(drvinfo->driver));
  203. strscpy(drvinfo->version, VMXNET3_DRIVER_VERSION_REPORT,
  204. sizeof(drvinfo->version));
  205. strscpy(drvinfo->bus_info, pci_name(adapter->pdev),
  206. sizeof(drvinfo->bus_info));
  207. }
  208. static void
  209. vmxnet3_get_strings(struct net_device *netdev, u32 stringset, u8 *buf)
  210. {
  211. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  212. int i, j;
  213. if (stringset != ETH_SS_STATS)
  214. return;
  215. for (j = 0; j < adapter->num_tx_queues; j++) {
  216. for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++)
  217. ethtool_puts(&buf, vmxnet3_tq_dev_stats[i].desc);
  218. for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++)
  219. ethtool_puts(&buf, vmxnet3_tq_driver_stats[i].desc);
  220. }
  221. for (j = 0; j < adapter->num_rx_queues; j++) {
  222. for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++)
  223. ethtool_puts(&buf, vmxnet3_rq_dev_stats[i].desc);
  224. for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++)
  225. ethtool_puts(&buf, vmxnet3_rq_driver_stats[i].desc);
  226. }
  227. for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++)
  228. ethtool_puts(&buf, vmxnet3_global_stats[i].desc);
  229. }
  230. netdev_features_t vmxnet3_fix_features(struct net_device *netdev,
  231. netdev_features_t features)
  232. {
  233. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  234. /* If Rx checksum is disabled, then LRO should also be disabled */
  235. if (!(features & NETIF_F_RXCSUM))
  236. features &= ~NETIF_F_LRO;
  237. /* If XDP is enabled, then LRO should not be enabled */
  238. if (vmxnet3_xdp_enabled(adapter) && (features & NETIF_F_LRO)) {
  239. netdev_err(netdev, "LRO is not supported with XDP");
  240. features &= ~NETIF_F_LRO;
  241. }
  242. return features;
  243. }
  244. netdev_features_t vmxnet3_features_check(struct sk_buff *skb,
  245. struct net_device *netdev,
  246. netdev_features_t features)
  247. {
  248. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  249. /* Validate if the tunneled packet is being offloaded by the device */
  250. if (VMXNET3_VERSION_GE_4(adapter) &&
  251. skb->encapsulation && skb->ip_summed == CHECKSUM_PARTIAL) {
  252. u8 l4_proto = 0;
  253. u16 port;
  254. struct udphdr *udph;
  255. switch (vlan_get_protocol(skb)) {
  256. case htons(ETH_P_IP):
  257. l4_proto = ip_hdr(skb)->protocol;
  258. break;
  259. case htons(ETH_P_IPV6):
  260. l4_proto = ipv6_hdr(skb)->nexthdr;
  261. break;
  262. default:
  263. return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
  264. }
  265. switch (l4_proto) {
  266. case IPPROTO_UDP:
  267. udph = udp_hdr(skb);
  268. port = be16_to_cpu(udph->dest);
  269. /* Check if offloaded port is supported */
  270. if (port != GENEVE_UDP_PORT &&
  271. port != IANA_VXLAN_UDP_PORT &&
  272. port != VXLAN_UDP_PORT) {
  273. return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
  274. }
  275. break;
  276. default:
  277. return features & ~(NETIF_F_CSUM_MASK | NETIF_F_GSO_MASK);
  278. }
  279. }
  280. return features;
  281. }
  282. static void vmxnet3_enable_encap_offloads(struct net_device *netdev, netdev_features_t features)
  283. {
  284. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  285. if (VMXNET3_VERSION_GE_4(adapter)) {
  286. netdev->hw_enc_features |= NETIF_F_SG | NETIF_F_RXCSUM |
  287. NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_TX |
  288. NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_TSO | NETIF_F_TSO6 |
  289. NETIF_F_LRO;
  290. if (features & NETIF_F_GSO_UDP_TUNNEL)
  291. netdev->hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL;
  292. if (features & NETIF_F_GSO_UDP_TUNNEL_CSUM)
  293. netdev->hw_enc_features |= NETIF_F_GSO_UDP_TUNNEL_CSUM;
  294. }
  295. if (VMXNET3_VERSION_GE_7(adapter)) {
  296. unsigned long flags;
  297. if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  298. VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD)) {
  299. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD;
  300. }
  301. if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  302. VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD)) {
  303. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD;
  304. }
  305. if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  306. VMXNET3_CAP_GENEVE_TSO)) {
  307. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_GENEVE_TSO;
  308. }
  309. if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  310. VMXNET3_CAP_VXLAN_TSO)) {
  311. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_VXLAN_TSO;
  312. }
  313. if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  314. VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD)) {
  315. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD;
  316. }
  317. if (vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  318. VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD)) {
  319. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD;
  320. }
  321. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR, adapter->dev_caps[0]);
  322. spin_lock_irqsave(&adapter->cmd_lock, flags);
  323. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_DCR0_REG);
  324. adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  325. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  326. if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD)) &&
  327. !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD)) &&
  328. !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_TSO)) &&
  329. !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_TSO))) {
  330. netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL;
  331. }
  332. if (!(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD)) &&
  333. !(adapter->dev_caps[0] & (1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD))) {
  334. netdev->hw_enc_features &= ~NETIF_F_GSO_UDP_TUNNEL_CSUM;
  335. }
  336. }
  337. }
  338. static void vmxnet3_disable_encap_offloads(struct net_device *netdev)
  339. {
  340. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  341. if (VMXNET3_VERSION_GE_4(adapter)) {
  342. netdev->hw_enc_features &= ~(NETIF_F_SG | NETIF_F_RXCSUM |
  343. NETIF_F_HW_CSUM | NETIF_F_HW_VLAN_CTAG_TX |
  344. NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_TSO | NETIF_F_TSO6 |
  345. NETIF_F_LRO | NETIF_F_GSO_UDP_TUNNEL |
  346. NETIF_F_GSO_UDP_TUNNEL_CSUM);
  347. }
  348. if (VMXNET3_VERSION_GE_7(adapter)) {
  349. unsigned long flags;
  350. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_GENEVE_CHECKSUM_OFFLOAD |
  351. 1UL << VMXNET3_CAP_VXLAN_CHECKSUM_OFFLOAD |
  352. 1UL << VMXNET3_CAP_GENEVE_TSO |
  353. 1UL << VMXNET3_CAP_VXLAN_TSO |
  354. 1UL << VMXNET3_CAP_GENEVE_OUTER_CHECKSUM_OFFLOAD |
  355. 1UL << VMXNET3_CAP_VXLAN_OUTER_CHECKSUM_OFFLOAD);
  356. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR, adapter->dev_caps[0]);
  357. spin_lock_irqsave(&adapter->cmd_lock, flags);
  358. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_DCR0_REG);
  359. adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  360. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  361. }
  362. }
  363. int vmxnet3_set_features(struct net_device *netdev, netdev_features_t features)
  364. {
  365. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  366. unsigned long flags;
  367. netdev_features_t changed = features ^ netdev->features;
  368. netdev_features_t tun_offload_mask = NETIF_F_GSO_UDP_TUNNEL |
  369. NETIF_F_GSO_UDP_TUNNEL_CSUM;
  370. u8 udp_tun_enabled = (netdev->features & tun_offload_mask) != 0;
  371. if (changed & (NETIF_F_RXCSUM | NETIF_F_LRO |
  372. NETIF_F_HW_VLAN_CTAG_RX | tun_offload_mask)) {
  373. if (features & NETIF_F_RXCSUM)
  374. adapter->shared->devRead.misc.uptFeatures |=
  375. UPT1_F_RXCSUM;
  376. else
  377. adapter->shared->devRead.misc.uptFeatures &=
  378. ~UPT1_F_RXCSUM;
  379. /* update hardware LRO capability accordingly */
  380. if (features & NETIF_F_LRO)
  381. adapter->shared->devRead.misc.uptFeatures |=
  382. UPT1_F_LRO;
  383. else
  384. adapter->shared->devRead.misc.uptFeatures &=
  385. ~UPT1_F_LRO;
  386. if (features & NETIF_F_HW_VLAN_CTAG_RX)
  387. adapter->shared->devRead.misc.uptFeatures |=
  388. UPT1_F_RXVLAN;
  389. else
  390. adapter->shared->devRead.misc.uptFeatures &=
  391. ~UPT1_F_RXVLAN;
  392. if ((features & tun_offload_mask) != 0) {
  393. vmxnet3_enable_encap_offloads(netdev, features);
  394. adapter->shared->devRead.misc.uptFeatures |=
  395. UPT1_F_RXINNEROFLD;
  396. } else if ((features & tun_offload_mask) == 0 &&
  397. udp_tun_enabled) {
  398. vmxnet3_disable_encap_offloads(netdev);
  399. adapter->shared->devRead.misc.uptFeatures &=
  400. ~UPT1_F_RXINNEROFLD;
  401. }
  402. spin_lock_irqsave(&adapter->cmd_lock, flags);
  403. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  404. VMXNET3_CMD_UPDATE_FEATURE);
  405. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  406. }
  407. return 0;
  408. }
  409. static void
  410. vmxnet3_get_ethtool_stats(struct net_device *netdev,
  411. struct ethtool_stats *stats, u64 *buf)
  412. {
  413. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  414. unsigned long flags;
  415. u8 *base;
  416. int i;
  417. int j = 0;
  418. spin_lock_irqsave(&adapter->cmd_lock, flags);
  419. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD, VMXNET3_CMD_GET_STATS);
  420. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  421. /* this does assume each counter is 64-bit wide */
  422. for (j = 0; j < adapter->num_tx_queues; j++) {
  423. base = (u8 *)&adapter->tqd_start[j].stats;
  424. *buf++ = (u64)j;
  425. for (i = 1; i < ARRAY_SIZE(vmxnet3_tq_dev_stats); i++)
  426. *buf++ = *(u64 *)(base +
  427. vmxnet3_tq_dev_stats[i].offset);
  428. base = (u8 *)&adapter->tx_queue[j].stats;
  429. for (i = 0; i < ARRAY_SIZE(vmxnet3_tq_driver_stats); i++)
  430. *buf++ = *(u64 *)(base +
  431. vmxnet3_tq_driver_stats[i].offset);
  432. }
  433. for (j = 0; j < adapter->num_rx_queues; j++) {
  434. base = (u8 *)&adapter->rqd_start[j].stats;
  435. *buf++ = (u64) j;
  436. for (i = 1; i < ARRAY_SIZE(vmxnet3_rq_dev_stats); i++)
  437. *buf++ = *(u64 *)(base +
  438. vmxnet3_rq_dev_stats[i].offset);
  439. base = (u8 *)&adapter->rx_queue[j].stats;
  440. for (i = 0; i < ARRAY_SIZE(vmxnet3_rq_driver_stats); i++)
  441. *buf++ = *(u64 *)(base +
  442. vmxnet3_rq_driver_stats[i].offset);
  443. }
  444. base = (u8 *)adapter;
  445. for (i = 0; i < ARRAY_SIZE(vmxnet3_global_stats); i++)
  446. *buf++ = *(u64 *)(base + vmxnet3_global_stats[i].offset);
  447. }
  448. /* This is a version 2 of the vmxnet3 ethtool_regs which goes hand in hand with
  449. * the version 2 of the vmxnet3 support for ethtool(8) --register-dump.
  450. * Therefore, if any registers are added, removed or modified, then a version
  451. * bump and a corresponding change in the vmxnet3 support for ethtool(8)
  452. * --register-dump would be required.
  453. */
  454. static void
  455. vmxnet3_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *p)
  456. {
  457. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  458. u32 *buf = p;
  459. int i = 0, j = 0;
  460. memset(p, 0, vmxnet3_get_regs_len(netdev));
  461. regs->version = 2;
  462. /* Update vmxnet3_get_regs_len if we want to dump more registers */
  463. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_VRRS);
  464. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_UVRS);
  465. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_DSAL);
  466. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_DSAH);
  467. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  468. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_MACL);
  469. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_MACH);
  470. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_ICR);
  471. buf[j++] = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_ECR);
  472. buf[j++] = adapter->intr.num_intrs;
  473. for (i = 0; i < adapter->intr.num_intrs; i++) {
  474. buf[j++] = VMXNET3_READ_BAR0_REG(adapter, VMXNET3_REG_IMR
  475. + i * VMXNET3_REG_ALIGN);
  476. }
  477. buf[j++] = adapter->num_tx_queues;
  478. for (i = 0; i < adapter->num_tx_queues; i++) {
  479. struct vmxnet3_tx_queue *tq = &adapter->tx_queue[i];
  480. buf[j++] = VMXNET3_READ_BAR0_REG(adapter, adapter->tx_prod_offset +
  481. i * VMXNET3_REG_ALIGN);
  482. buf[j++] = VMXNET3_GET_ADDR_LO(tq->tx_ring.basePA);
  483. buf[j++] = VMXNET3_GET_ADDR_HI(tq->tx_ring.basePA);
  484. buf[j++] = tq->tx_ring.size;
  485. buf[j++] = tq->tx_ring.next2fill;
  486. buf[j++] = tq->tx_ring.next2comp;
  487. buf[j++] = tq->tx_ring.gen;
  488. buf[j++] = VMXNET3_GET_ADDR_LO(tq->data_ring.basePA);
  489. buf[j++] = VMXNET3_GET_ADDR_HI(tq->data_ring.basePA);
  490. buf[j++] = tq->data_ring.size;
  491. buf[j++] = tq->txdata_desc_size;
  492. buf[j++] = VMXNET3_GET_ADDR_LO(tq->comp_ring.basePA);
  493. buf[j++] = VMXNET3_GET_ADDR_HI(tq->comp_ring.basePA);
  494. buf[j++] = tq->comp_ring.size;
  495. buf[j++] = tq->comp_ring.next2proc;
  496. buf[j++] = tq->comp_ring.gen;
  497. buf[j++] = tq->stopped;
  498. }
  499. buf[j++] = adapter->num_rx_queues;
  500. for (i = 0; i < adapter->num_rx_queues; i++) {
  501. struct vmxnet3_rx_queue *rq = &adapter->rx_queue[i];
  502. buf[j++] = VMXNET3_READ_BAR0_REG(adapter, adapter->rx_prod_offset +
  503. i * VMXNET3_REG_ALIGN);
  504. buf[j++] = VMXNET3_READ_BAR0_REG(adapter, adapter->rx_prod2_offset +
  505. i * VMXNET3_REG_ALIGN);
  506. buf[j++] = VMXNET3_GET_ADDR_LO(rq->rx_ring[0].basePA);
  507. buf[j++] = VMXNET3_GET_ADDR_HI(rq->rx_ring[0].basePA);
  508. buf[j++] = rq->rx_ring[0].size;
  509. buf[j++] = rq->rx_ring[0].next2fill;
  510. buf[j++] = rq->rx_ring[0].next2comp;
  511. buf[j++] = rq->rx_ring[0].gen;
  512. buf[j++] = VMXNET3_GET_ADDR_LO(rq->rx_ring[1].basePA);
  513. buf[j++] = VMXNET3_GET_ADDR_HI(rq->rx_ring[1].basePA);
  514. buf[j++] = rq->rx_ring[1].size;
  515. buf[j++] = rq->rx_ring[1].next2fill;
  516. buf[j++] = rq->rx_ring[1].next2comp;
  517. buf[j++] = rq->rx_ring[1].gen;
  518. buf[j++] = VMXNET3_GET_ADDR_LO(rq->data_ring.basePA);
  519. buf[j++] = VMXNET3_GET_ADDR_HI(rq->data_ring.basePA);
  520. buf[j++] = rq->rx_ring[0].size;
  521. buf[j++] = rq->data_ring.desc_size;
  522. buf[j++] = VMXNET3_GET_ADDR_LO(rq->comp_ring.basePA);
  523. buf[j++] = VMXNET3_GET_ADDR_HI(rq->comp_ring.basePA);
  524. buf[j++] = rq->comp_ring.size;
  525. buf[j++] = rq->comp_ring.next2proc;
  526. buf[j++] = rq->comp_ring.gen;
  527. }
  528. }
  529. static void
  530. vmxnet3_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
  531. {
  532. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  533. wol->supported = WAKE_UCAST | WAKE_ARP | WAKE_MAGIC;
  534. wol->wolopts = adapter->wol;
  535. }
  536. static int
  537. vmxnet3_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
  538. {
  539. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  540. if (wol->wolopts & (WAKE_PHY | WAKE_MCAST | WAKE_BCAST |
  541. WAKE_MAGICSECURE)) {
  542. return -EOPNOTSUPP;
  543. }
  544. adapter->wol = wol->wolopts;
  545. device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
  546. return 0;
  547. }
  548. static int
  549. vmxnet3_get_link_ksettings(struct net_device *netdev,
  550. struct ethtool_link_ksettings *ecmd)
  551. {
  552. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  553. ethtool_link_ksettings_zero_link_mode(ecmd, supported);
  554. ethtool_link_ksettings_add_link_mode(ecmd, supported, 10000baseT_Full);
  555. ethtool_link_ksettings_add_link_mode(ecmd, supported, 1000baseT_Full);
  556. ethtool_link_ksettings_add_link_mode(ecmd, supported, TP);
  557. ethtool_link_ksettings_zero_link_mode(ecmd, advertising);
  558. ethtool_link_ksettings_add_link_mode(ecmd, advertising, TP);
  559. ecmd->base.port = PORT_TP;
  560. if (adapter->link_speed) {
  561. ecmd->base.speed = adapter->link_speed;
  562. ecmd->base.duplex = DUPLEX_FULL;
  563. } else {
  564. ecmd->base.speed = SPEED_UNKNOWN;
  565. ecmd->base.duplex = DUPLEX_UNKNOWN;
  566. }
  567. return 0;
  568. }
  569. static void
  570. vmxnet3_get_ringparam(struct net_device *netdev,
  571. struct ethtool_ringparam *param,
  572. struct kernel_ethtool_ringparam *kernel_param,
  573. struct netlink_ext_ack *extack)
  574. {
  575. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  576. param->rx_max_pending = VMXNET3_RX_RING_MAX_SIZE;
  577. param->tx_max_pending = VMXNET3_TX_RING_MAX_SIZE;
  578. param->rx_mini_max_pending = VMXNET3_VERSION_GE_3(adapter) ?
  579. VMXNET3_RXDATA_DESC_MAX_SIZE : 0;
  580. param->rx_jumbo_max_pending = VMXNET3_RX_RING2_MAX_SIZE;
  581. param->rx_pending = adapter->rx_ring_size;
  582. param->tx_pending = adapter->tx_ring_size;
  583. param->rx_mini_pending = VMXNET3_VERSION_GE_3(adapter) ?
  584. adapter->rxdata_desc_size : 0;
  585. param->rx_jumbo_pending = adapter->rx_ring2_size;
  586. }
  587. static int
  588. vmxnet3_set_ringparam(struct net_device *netdev,
  589. struct ethtool_ringparam *param,
  590. struct kernel_ethtool_ringparam *kernel_param,
  591. struct netlink_ext_ack *extack)
  592. {
  593. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  594. u32 new_tx_ring_size, new_rx_ring_size, new_rx_ring2_size;
  595. u16 new_rxdata_desc_size;
  596. u32 sz;
  597. int err = 0;
  598. if (param->tx_pending == 0 || param->tx_pending >
  599. VMXNET3_TX_RING_MAX_SIZE)
  600. return -EINVAL;
  601. if (param->rx_pending == 0 || param->rx_pending >
  602. VMXNET3_RX_RING_MAX_SIZE)
  603. return -EINVAL;
  604. if (param->rx_jumbo_pending == 0 ||
  605. param->rx_jumbo_pending > VMXNET3_RX_RING2_MAX_SIZE)
  606. return -EINVAL;
  607. /* if adapter not yet initialized, do nothing */
  608. if (adapter->rx_buf_per_pkt == 0) {
  609. netdev_err(netdev, "adapter not completely initialized, "
  610. "ring size cannot be changed yet\n");
  611. return -EOPNOTSUPP;
  612. }
  613. if (VMXNET3_VERSION_GE_3(adapter)) {
  614. if (param->rx_mini_pending > VMXNET3_RXDATA_DESC_MAX_SIZE)
  615. return -EINVAL;
  616. } else if (param->rx_mini_pending != 0) {
  617. return -EINVAL;
  618. }
  619. /* round it up to a multiple of VMXNET3_RING_SIZE_ALIGN */
  620. new_tx_ring_size = (param->tx_pending + VMXNET3_RING_SIZE_MASK) &
  621. ~VMXNET3_RING_SIZE_MASK;
  622. new_tx_ring_size = min_t(u32, new_tx_ring_size,
  623. VMXNET3_TX_RING_MAX_SIZE);
  624. if (new_tx_ring_size > VMXNET3_TX_RING_MAX_SIZE || (new_tx_ring_size %
  625. VMXNET3_RING_SIZE_ALIGN) != 0)
  626. return -EINVAL;
  627. /* ring0 has to be a multiple of
  628. * rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN
  629. */
  630. sz = adapter->rx_buf_per_pkt * VMXNET3_RING_SIZE_ALIGN;
  631. new_rx_ring_size = (param->rx_pending + sz - 1) / sz * sz;
  632. new_rx_ring_size = min_t(u32, new_rx_ring_size,
  633. VMXNET3_RX_RING_MAX_SIZE / sz * sz);
  634. if (new_rx_ring_size > VMXNET3_RX_RING_MAX_SIZE || (new_rx_ring_size %
  635. sz) != 0)
  636. return -EINVAL;
  637. /* ring2 has to be a multiple of VMXNET3_RING_SIZE_ALIGN */
  638. new_rx_ring2_size = (param->rx_jumbo_pending + VMXNET3_RING_SIZE_MASK) &
  639. ~VMXNET3_RING_SIZE_MASK;
  640. new_rx_ring2_size = min_t(u32, new_rx_ring2_size,
  641. VMXNET3_RX_RING2_MAX_SIZE);
  642. /* For v7 and later, keep ring size power of 2 for UPT */
  643. if (VMXNET3_VERSION_GE_7(adapter)) {
  644. new_tx_ring_size = rounddown_pow_of_two(new_tx_ring_size);
  645. new_rx_ring_size = rounddown_pow_of_two(new_rx_ring_size);
  646. new_rx_ring2_size = rounddown_pow_of_two(new_rx_ring2_size);
  647. }
  648. /* rx data ring buffer size has to be a multiple of
  649. * VMXNET3_RXDATA_DESC_SIZE_ALIGN
  650. */
  651. new_rxdata_desc_size =
  652. (param->rx_mini_pending + VMXNET3_RXDATA_DESC_SIZE_MASK) &
  653. ~VMXNET3_RXDATA_DESC_SIZE_MASK;
  654. new_rxdata_desc_size = min_t(u16, new_rxdata_desc_size,
  655. VMXNET3_RXDATA_DESC_MAX_SIZE);
  656. if (new_tx_ring_size == adapter->tx_ring_size &&
  657. new_rx_ring_size == adapter->rx_ring_size &&
  658. new_rx_ring2_size == adapter->rx_ring2_size &&
  659. new_rxdata_desc_size == adapter->rxdata_desc_size) {
  660. return 0;
  661. }
  662. /*
  663. * Reset_work may be in the middle of resetting the device, wait for its
  664. * completion.
  665. */
  666. while (test_and_set_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state))
  667. usleep_range(1000, 2000);
  668. if (netif_running(netdev)) {
  669. vmxnet3_quiesce_dev(adapter);
  670. vmxnet3_reset_dev(adapter);
  671. /* recreate the rx queue and the tx queue based on the
  672. * new sizes */
  673. vmxnet3_tq_destroy_all(adapter);
  674. vmxnet3_rq_destroy_all(adapter);
  675. err = vmxnet3_create_queues(adapter, new_tx_ring_size,
  676. new_rx_ring_size, new_rx_ring2_size,
  677. adapter->txdata_desc_size,
  678. new_rxdata_desc_size);
  679. if (err) {
  680. /* failed, most likely because of OOM, try default
  681. * size */
  682. netdev_err(netdev, "failed to apply new sizes, "
  683. "try the default ones\n");
  684. new_rx_ring_size = VMXNET3_DEF_RX_RING_SIZE;
  685. new_rx_ring2_size = VMXNET3_DEF_RX_RING2_SIZE;
  686. new_tx_ring_size = VMXNET3_DEF_TX_RING_SIZE;
  687. new_rxdata_desc_size = VMXNET3_VERSION_GE_3(adapter) ?
  688. VMXNET3_DEF_RXDATA_DESC_SIZE : 0;
  689. err = vmxnet3_create_queues(adapter,
  690. new_tx_ring_size,
  691. new_rx_ring_size,
  692. new_rx_ring2_size,
  693. adapter->txdata_desc_size,
  694. new_rxdata_desc_size);
  695. if (err) {
  696. netdev_err(netdev, "failed to create queues "
  697. "with default sizes. Closing it\n");
  698. goto out;
  699. }
  700. }
  701. err = vmxnet3_activate_dev(adapter);
  702. if (err)
  703. netdev_err(netdev, "failed to re-activate, error %d."
  704. " Closing it\n", err);
  705. }
  706. adapter->tx_ring_size = new_tx_ring_size;
  707. adapter->rx_ring_size = new_rx_ring_size;
  708. adapter->rx_ring2_size = new_rx_ring2_size;
  709. adapter->rxdata_desc_size = new_rxdata_desc_size;
  710. out:
  711. clear_bit(VMXNET3_STATE_BIT_RESETTING, &adapter->state);
  712. if (err)
  713. vmxnet3_force_close(adapter);
  714. return err;
  715. }
  716. static int
  717. vmxnet3_get_rss_hash_opts(struct vmxnet3_adapter *adapter,
  718. struct ethtool_rxnfc *info)
  719. {
  720. enum Vmxnet3_RSSField rss_fields;
  721. if (netif_running(adapter->netdev)) {
  722. unsigned long flags;
  723. spin_lock_irqsave(&adapter->cmd_lock, flags);
  724. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  725. VMXNET3_CMD_GET_RSS_FIELDS);
  726. rss_fields = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  727. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  728. } else {
  729. rss_fields = adapter->rss_fields;
  730. }
  731. info->data = 0;
  732. /* Report default options for RSS on vmxnet3 */
  733. switch (info->flow_type) {
  734. case TCP_V4_FLOW:
  735. case TCP_V6_FLOW:
  736. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3 |
  737. RXH_IP_SRC | RXH_IP_DST;
  738. break;
  739. case UDP_V4_FLOW:
  740. if (rss_fields & VMXNET3_RSS_FIELDS_UDPIP4)
  741. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  742. info->data |= RXH_IP_SRC | RXH_IP_DST;
  743. break;
  744. case AH_ESP_V4_FLOW:
  745. case AH_V4_FLOW:
  746. case ESP_V4_FLOW:
  747. if (rss_fields & VMXNET3_RSS_FIELDS_ESPIP4)
  748. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  749. fallthrough;
  750. case SCTP_V4_FLOW:
  751. case IPV4_FLOW:
  752. info->data |= RXH_IP_SRC | RXH_IP_DST;
  753. break;
  754. case UDP_V6_FLOW:
  755. if (rss_fields & VMXNET3_RSS_FIELDS_UDPIP6)
  756. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  757. info->data |= RXH_IP_SRC | RXH_IP_DST;
  758. break;
  759. case AH_ESP_V6_FLOW:
  760. case AH_V6_FLOW:
  761. case ESP_V6_FLOW:
  762. if (VMXNET3_VERSION_GE_6(adapter) &&
  763. (rss_fields & VMXNET3_RSS_FIELDS_ESPIP6))
  764. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  765. fallthrough;
  766. case SCTP_V6_FLOW:
  767. case IPV6_FLOW:
  768. info->data |= RXH_IP_SRC | RXH_IP_DST;
  769. break;
  770. default:
  771. return -EINVAL;
  772. }
  773. return 0;
  774. }
  775. static int
  776. vmxnet3_set_rss_hash_opt(struct net_device *netdev,
  777. struct vmxnet3_adapter *adapter,
  778. struct ethtool_rxnfc *nfc)
  779. {
  780. enum Vmxnet3_RSSField rss_fields = adapter->rss_fields;
  781. /* RSS does not support anything other than hashing
  782. * to queues on src and dst IPs and ports
  783. */
  784. if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
  785. RXH_L4_B_0_1 | RXH_L4_B_2_3))
  786. return -EINVAL;
  787. switch (nfc->flow_type) {
  788. case TCP_V4_FLOW:
  789. case TCP_V6_FLOW:
  790. if (!(nfc->data & RXH_IP_SRC) ||
  791. !(nfc->data & RXH_IP_DST) ||
  792. !(nfc->data & RXH_L4_B_0_1) ||
  793. !(nfc->data & RXH_L4_B_2_3))
  794. return -EINVAL;
  795. break;
  796. case UDP_V4_FLOW:
  797. if (!(nfc->data & RXH_IP_SRC) ||
  798. !(nfc->data & RXH_IP_DST))
  799. return -EINVAL;
  800. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  801. case 0:
  802. rss_fields &= ~VMXNET3_RSS_FIELDS_UDPIP4;
  803. break;
  804. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  805. rss_fields |= VMXNET3_RSS_FIELDS_UDPIP4;
  806. break;
  807. default:
  808. return -EINVAL;
  809. }
  810. break;
  811. case UDP_V6_FLOW:
  812. if (!(nfc->data & RXH_IP_SRC) ||
  813. !(nfc->data & RXH_IP_DST))
  814. return -EINVAL;
  815. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  816. case 0:
  817. rss_fields &= ~VMXNET3_RSS_FIELDS_UDPIP6;
  818. break;
  819. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  820. rss_fields |= VMXNET3_RSS_FIELDS_UDPIP6;
  821. break;
  822. default:
  823. return -EINVAL;
  824. }
  825. break;
  826. case ESP_V4_FLOW:
  827. case AH_V4_FLOW:
  828. case AH_ESP_V4_FLOW:
  829. if (!(nfc->data & RXH_IP_SRC) ||
  830. !(nfc->data & RXH_IP_DST))
  831. return -EINVAL;
  832. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  833. case 0:
  834. rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP4;
  835. break;
  836. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  837. rss_fields |= VMXNET3_RSS_FIELDS_ESPIP4;
  838. break;
  839. default:
  840. return -EINVAL;
  841. }
  842. break;
  843. case ESP_V6_FLOW:
  844. case AH_V6_FLOW:
  845. case AH_ESP_V6_FLOW:
  846. if (!VMXNET3_VERSION_GE_6(adapter))
  847. return -EOPNOTSUPP;
  848. if (!(nfc->data & RXH_IP_SRC) ||
  849. !(nfc->data & RXH_IP_DST))
  850. return -EINVAL;
  851. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  852. case 0:
  853. rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP6;
  854. break;
  855. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  856. rss_fields |= VMXNET3_RSS_FIELDS_ESPIP6;
  857. break;
  858. default:
  859. return -EINVAL;
  860. }
  861. break;
  862. case SCTP_V4_FLOW:
  863. case SCTP_V6_FLOW:
  864. if (!(nfc->data & RXH_IP_SRC) ||
  865. !(nfc->data & RXH_IP_DST) ||
  866. (nfc->data & RXH_L4_B_0_1) ||
  867. (nfc->data & RXH_L4_B_2_3))
  868. return -EINVAL;
  869. break;
  870. default:
  871. return -EINVAL;
  872. }
  873. /* if we changed something we need to update flags */
  874. if (rss_fields != adapter->rss_fields) {
  875. adapter->default_rss_fields = false;
  876. if (netif_running(netdev)) {
  877. struct Vmxnet3_DriverShared *shared = adapter->shared;
  878. union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;
  879. unsigned long flags;
  880. if (VMXNET3_VERSION_GE_7(adapter)) {
  881. if ((rss_fields & VMXNET3_RSS_FIELDS_UDPIP4 ||
  882. rss_fields & VMXNET3_RSS_FIELDS_UDPIP6) &&
  883. vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  884. VMXNET3_CAP_UDP_RSS)) {
  885. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_UDP_RSS;
  886. } else {
  887. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_UDP_RSS);
  888. }
  889. if ((rss_fields & VMXNET3_RSS_FIELDS_ESPIP4) &&
  890. vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  891. VMXNET3_CAP_ESP_RSS_IPV4)) {
  892. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_ESP_RSS_IPV4;
  893. } else {
  894. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_ESP_RSS_IPV4);
  895. }
  896. if ((rss_fields & VMXNET3_RSS_FIELDS_ESPIP6) &&
  897. vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  898. VMXNET3_CAP_ESP_RSS_IPV6)) {
  899. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_ESP_RSS_IPV6;
  900. } else {
  901. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_ESP_RSS_IPV6);
  902. }
  903. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR,
  904. adapter->dev_caps[0]);
  905. spin_lock_irqsave(&adapter->cmd_lock, flags);
  906. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  907. VMXNET3_CMD_GET_DCR0_REG);
  908. adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter,
  909. VMXNET3_REG_CMD);
  910. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  911. }
  912. spin_lock_irqsave(&adapter->cmd_lock, flags);
  913. cmdInfo->setRssFields = rss_fields;
  914. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  915. VMXNET3_CMD_SET_RSS_FIELDS);
  916. /* Not all requested RSS may get applied, so get and
  917. * cache what was actually applied.
  918. */
  919. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  920. VMXNET3_CMD_GET_RSS_FIELDS);
  921. adapter->rss_fields =
  922. VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  923. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  924. } else {
  925. /* When the device is activated, we will try to apply
  926. * these rules and cache the applied value later.
  927. */
  928. adapter->rss_fields = rss_fields;
  929. }
  930. }
  931. return 0;
  932. }
  933. static int
  934. vmxnet3_get_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *info,
  935. u32 *rules)
  936. {
  937. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  938. int err = 0;
  939. switch (info->cmd) {
  940. case ETHTOOL_GRXRINGS:
  941. info->data = adapter->num_rx_queues;
  942. break;
  943. case ETHTOOL_GRXFH:
  944. if (!VMXNET3_VERSION_GE_4(adapter)) {
  945. err = -EOPNOTSUPP;
  946. break;
  947. }
  948. #ifdef VMXNET3_RSS
  949. if (!adapter->rss) {
  950. err = -EOPNOTSUPP;
  951. break;
  952. }
  953. #endif
  954. err = vmxnet3_get_rss_hash_opts(adapter, info);
  955. break;
  956. default:
  957. err = -EOPNOTSUPP;
  958. break;
  959. }
  960. return err;
  961. }
  962. static int
  963. vmxnet3_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *info)
  964. {
  965. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  966. int err = 0;
  967. if (!VMXNET3_VERSION_GE_4(adapter)) {
  968. err = -EOPNOTSUPP;
  969. goto done;
  970. }
  971. #ifdef VMXNET3_RSS
  972. if (!adapter->rss) {
  973. err = -EOPNOTSUPP;
  974. goto done;
  975. }
  976. #endif
  977. switch (info->cmd) {
  978. case ETHTOOL_SRXFH:
  979. err = vmxnet3_set_rss_hash_opt(netdev, adapter, info);
  980. break;
  981. default:
  982. err = -EOPNOTSUPP;
  983. break;
  984. }
  985. done:
  986. return err;
  987. }
  988. #ifdef VMXNET3_RSS
  989. static u32
  990. vmxnet3_get_rss_indir_size(struct net_device *netdev)
  991. {
  992. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  993. struct UPT1_RSSConf *rssConf = adapter->rss_conf;
  994. return rssConf->indTableSize;
  995. }
  996. static int
  997. vmxnet3_get_rss(struct net_device *netdev, struct ethtool_rxfh_param *rxfh)
  998. {
  999. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1000. struct UPT1_RSSConf *rssConf = adapter->rss_conf;
  1001. unsigned int n = rssConf->indTableSize;
  1002. rxfh->hfunc = ETH_RSS_HASH_TOP;
  1003. if (!rxfh->indir)
  1004. return 0;
  1005. if (n > UPT1_RSS_MAX_IND_TABLE_SIZE)
  1006. return 0;
  1007. while (n--)
  1008. rxfh->indir[n] = rssConf->indTable[n];
  1009. return 0;
  1010. }
  1011. static int
  1012. vmxnet3_set_rss(struct net_device *netdev, struct ethtool_rxfh_param *rxfh,
  1013. struct netlink_ext_ack *extack)
  1014. {
  1015. unsigned int i;
  1016. unsigned long flags;
  1017. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1018. struct UPT1_RSSConf *rssConf = adapter->rss_conf;
  1019. /* We do not allow change in unsupported parameters */
  1020. if (rxfh->key ||
  1021. (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
  1022. rxfh->hfunc != ETH_RSS_HASH_TOP))
  1023. return -EOPNOTSUPP;
  1024. if (!rxfh->indir)
  1025. return 0;
  1026. for (i = 0; i < rssConf->indTableSize; i++)
  1027. rssConf->indTable[i] = rxfh->indir[i];
  1028. spin_lock_irqsave(&adapter->cmd_lock, flags);
  1029. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  1030. VMXNET3_CMD_UPDATE_RSSIDT);
  1031. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  1032. return 0;
  1033. }
  1034. #endif
  1035. static int vmxnet3_get_coalesce(struct net_device *netdev,
  1036. struct ethtool_coalesce *ec,
  1037. struct kernel_ethtool_coalesce *kernel_coal,
  1038. struct netlink_ext_ack *extack)
  1039. {
  1040. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1041. if (!VMXNET3_VERSION_GE_3(adapter))
  1042. return -EOPNOTSUPP;
  1043. switch (adapter->coal_conf->coalMode) {
  1044. case VMXNET3_COALESCE_DISABLED:
  1045. /* struct ethtool_coalesce is already initialized to 0 */
  1046. break;
  1047. case VMXNET3_COALESCE_ADAPT:
  1048. ec->use_adaptive_rx_coalesce = true;
  1049. break;
  1050. case VMXNET3_COALESCE_STATIC:
  1051. ec->tx_max_coalesced_frames =
  1052. adapter->coal_conf->coalPara.coalStatic.tx_comp_depth;
  1053. ec->rx_max_coalesced_frames =
  1054. adapter->coal_conf->coalPara.coalStatic.rx_depth;
  1055. break;
  1056. case VMXNET3_COALESCE_RBC: {
  1057. u32 rbc_rate;
  1058. rbc_rate = adapter->coal_conf->coalPara.coalRbc.rbc_rate;
  1059. ec->rx_coalesce_usecs = VMXNET3_COAL_RBC_USECS(rbc_rate);
  1060. }
  1061. break;
  1062. default:
  1063. return -EOPNOTSUPP;
  1064. }
  1065. return 0;
  1066. }
  1067. static int vmxnet3_set_coalesce(struct net_device *netdev,
  1068. struct ethtool_coalesce *ec,
  1069. struct kernel_ethtool_coalesce *kernel_coal,
  1070. struct netlink_ext_ack *extack)
  1071. {
  1072. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1073. struct Vmxnet3_DriverShared *shared = adapter->shared;
  1074. union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;
  1075. unsigned long flags;
  1076. if (!VMXNET3_VERSION_GE_3(adapter))
  1077. return -EOPNOTSUPP;
  1078. if ((ec->rx_coalesce_usecs == 0) &&
  1079. (ec->use_adaptive_rx_coalesce == 0) &&
  1080. (ec->tx_max_coalesced_frames == 0) &&
  1081. (ec->rx_max_coalesced_frames == 0)) {
  1082. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1083. adapter->coal_conf->coalMode = VMXNET3_COALESCE_DISABLED;
  1084. goto done;
  1085. }
  1086. if (ec->rx_coalesce_usecs != 0) {
  1087. u32 rbc_rate;
  1088. if ((ec->use_adaptive_rx_coalesce != 0) ||
  1089. (ec->tx_max_coalesced_frames != 0) ||
  1090. (ec->rx_max_coalesced_frames != 0)) {
  1091. return -EINVAL;
  1092. }
  1093. rbc_rate = VMXNET3_COAL_RBC_RATE(ec->rx_coalesce_usecs);
  1094. if (rbc_rate < VMXNET3_COAL_RBC_MIN_RATE ||
  1095. rbc_rate > VMXNET3_COAL_RBC_MAX_RATE) {
  1096. return -EINVAL;
  1097. }
  1098. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1099. adapter->coal_conf->coalMode = VMXNET3_COALESCE_RBC;
  1100. adapter->coal_conf->coalPara.coalRbc.rbc_rate = rbc_rate;
  1101. goto done;
  1102. }
  1103. if (ec->use_adaptive_rx_coalesce != 0) {
  1104. if (ec->tx_max_coalesced_frames != 0 ||
  1105. ec->rx_max_coalesced_frames != 0) {
  1106. return -EINVAL;
  1107. }
  1108. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1109. adapter->coal_conf->coalMode = VMXNET3_COALESCE_ADAPT;
  1110. goto done;
  1111. }
  1112. if ((ec->tx_max_coalesced_frames != 0) ||
  1113. (ec->rx_max_coalesced_frames != 0)) {
  1114. if ((ec->tx_max_coalesced_frames >
  1115. VMXNET3_COAL_STATIC_MAX_DEPTH) ||
  1116. (ec->rx_max_coalesced_frames >
  1117. VMXNET3_COAL_STATIC_MAX_DEPTH)) {
  1118. return -EINVAL;
  1119. }
  1120. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1121. adapter->coal_conf->coalMode = VMXNET3_COALESCE_STATIC;
  1122. adapter->coal_conf->coalPara.coalStatic.tx_comp_depth =
  1123. (ec->tx_max_coalesced_frames ?
  1124. ec->tx_max_coalesced_frames :
  1125. VMXNET3_COAL_STATIC_DEFAULT_DEPTH);
  1126. adapter->coal_conf->coalPara.coalStatic.rx_depth =
  1127. (ec->rx_max_coalesced_frames ?
  1128. ec->rx_max_coalesced_frames :
  1129. VMXNET3_COAL_STATIC_DEFAULT_DEPTH);
  1130. adapter->coal_conf->coalPara.coalStatic.tx_depth =
  1131. VMXNET3_COAL_STATIC_DEFAULT_DEPTH;
  1132. goto done;
  1133. }
  1134. done:
  1135. adapter->default_coal_mode = false;
  1136. if (netif_running(netdev)) {
  1137. spin_lock_irqsave(&adapter->cmd_lock, flags);
  1138. cmdInfo->varConf.confVer = 1;
  1139. cmdInfo->varConf.confLen =
  1140. cpu_to_le32(sizeof(*adapter->coal_conf));
  1141. cmdInfo->varConf.confPA = cpu_to_le64(adapter->coal_conf_pa);
  1142. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  1143. VMXNET3_CMD_SET_COALESCE);
  1144. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  1145. }
  1146. return 0;
  1147. }
  1148. static void vmxnet3_get_channels(struct net_device *netdev,
  1149. struct ethtool_channels *ec)
  1150. {
  1151. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1152. if (IS_ENABLED(CONFIG_PCI_MSI) && adapter->intr.type == VMXNET3_IT_MSIX) {
  1153. if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE) {
  1154. ec->combined_count = adapter->num_tx_queues;
  1155. } else {
  1156. ec->rx_count = adapter->num_rx_queues;
  1157. ec->tx_count =
  1158. adapter->share_intr == VMXNET3_INTR_TXSHARE ?
  1159. 1 : adapter->num_tx_queues;
  1160. }
  1161. } else {
  1162. ec->combined_count = 1;
  1163. }
  1164. ec->other_count = 1;
  1165. /* Number of interrupts cannot be changed on the fly */
  1166. /* Just set maximums to actual values */
  1167. ec->max_rx = ec->rx_count;
  1168. ec->max_tx = ec->tx_count;
  1169. ec->max_combined = ec->combined_count;
  1170. ec->max_other = ec->other_count;
  1171. }
  1172. static const struct ethtool_ops vmxnet3_ethtool_ops = {
  1173. .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS |
  1174. ETHTOOL_COALESCE_MAX_FRAMES |
  1175. ETHTOOL_COALESCE_USE_ADAPTIVE_RX,
  1176. .get_drvinfo = vmxnet3_get_drvinfo,
  1177. .get_regs_len = vmxnet3_get_regs_len,
  1178. .get_regs = vmxnet3_get_regs,
  1179. .get_wol = vmxnet3_get_wol,
  1180. .set_wol = vmxnet3_set_wol,
  1181. .get_link = ethtool_op_get_link,
  1182. .get_coalesce = vmxnet3_get_coalesce,
  1183. .set_coalesce = vmxnet3_set_coalesce,
  1184. .get_strings = vmxnet3_get_strings,
  1185. .get_sset_count = vmxnet3_get_sset_count,
  1186. .get_ethtool_stats = vmxnet3_get_ethtool_stats,
  1187. .get_ringparam = vmxnet3_get_ringparam,
  1188. .set_ringparam = vmxnet3_set_ringparam,
  1189. .get_rxnfc = vmxnet3_get_rxnfc,
  1190. .set_rxnfc = vmxnet3_set_rxnfc,
  1191. #ifdef VMXNET3_RSS
  1192. .get_rxfh_indir_size = vmxnet3_get_rss_indir_size,
  1193. .get_rxfh = vmxnet3_get_rss,
  1194. .set_rxfh = vmxnet3_set_rss,
  1195. #endif
  1196. .get_link_ksettings = vmxnet3_get_link_ksettings,
  1197. .get_channels = vmxnet3_get_channels,
  1198. };
  1199. void vmxnet3_set_ethtool_ops(struct net_device *netdev)
  1200. {
  1201. netdev->ethtool_ops = &vmxnet3_ethtool_ops;
  1202. }