vmxnet3_ethtool.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341
  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 net_device *netdev,
  718. struct ethtool_rxfh_fields *info)
  719. {
  720. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  721. enum Vmxnet3_RSSField rss_fields;
  722. if (!VMXNET3_VERSION_GE_4(adapter))
  723. return -EOPNOTSUPP;
  724. #ifdef VMXNET3_RSS
  725. if (!adapter->rss)
  726. return -EOPNOTSUPP;
  727. #endif
  728. if (netif_running(adapter->netdev)) {
  729. unsigned long flags;
  730. spin_lock_irqsave(&adapter->cmd_lock, flags);
  731. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  732. VMXNET3_CMD_GET_RSS_FIELDS);
  733. rss_fields = VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  734. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  735. } else {
  736. rss_fields = adapter->rss_fields;
  737. }
  738. info->data = 0;
  739. /* Report default options for RSS on vmxnet3 */
  740. switch (info->flow_type) {
  741. case TCP_V4_FLOW:
  742. case TCP_V6_FLOW:
  743. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3 |
  744. RXH_IP_SRC | RXH_IP_DST;
  745. break;
  746. case UDP_V4_FLOW:
  747. if (rss_fields & VMXNET3_RSS_FIELDS_UDPIP4)
  748. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  749. info->data |= RXH_IP_SRC | RXH_IP_DST;
  750. break;
  751. case AH_ESP_V4_FLOW:
  752. case AH_V4_FLOW:
  753. case ESP_V4_FLOW:
  754. if (rss_fields & VMXNET3_RSS_FIELDS_ESPIP4)
  755. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  756. fallthrough;
  757. case SCTP_V4_FLOW:
  758. case IPV4_FLOW:
  759. info->data |= RXH_IP_SRC | RXH_IP_DST;
  760. break;
  761. case UDP_V6_FLOW:
  762. if (rss_fields & VMXNET3_RSS_FIELDS_UDPIP6)
  763. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  764. info->data |= RXH_IP_SRC | RXH_IP_DST;
  765. break;
  766. case AH_ESP_V6_FLOW:
  767. case AH_V6_FLOW:
  768. case ESP_V6_FLOW:
  769. if (VMXNET3_VERSION_GE_6(adapter) &&
  770. (rss_fields & VMXNET3_RSS_FIELDS_ESPIP6))
  771. info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
  772. fallthrough;
  773. case SCTP_V6_FLOW:
  774. case IPV6_FLOW:
  775. info->data |= RXH_IP_SRC | RXH_IP_DST;
  776. break;
  777. default:
  778. return -EINVAL;
  779. }
  780. return 0;
  781. }
  782. static int
  783. vmxnet3_set_rss_hash_opt(struct net_device *netdev,
  784. const struct ethtool_rxfh_fields *nfc,
  785. struct netlink_ext_ack *extack)
  786. {
  787. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  788. enum Vmxnet3_RSSField rss_fields;
  789. if (!VMXNET3_VERSION_GE_4(adapter))
  790. return -EOPNOTSUPP;
  791. #ifdef VMXNET3_RSS
  792. if (!adapter->rss)
  793. return -EOPNOTSUPP;
  794. #endif
  795. rss_fields = adapter->rss_fields;
  796. /* RSS does not support anything other than hashing
  797. * to queues on src and dst IPs and ports
  798. */
  799. if (nfc->data & ~(RXH_IP_SRC | RXH_IP_DST |
  800. RXH_L4_B_0_1 | RXH_L4_B_2_3))
  801. return -EINVAL;
  802. switch (nfc->flow_type) {
  803. case TCP_V4_FLOW:
  804. case TCP_V6_FLOW:
  805. if (!(nfc->data & RXH_IP_SRC) ||
  806. !(nfc->data & RXH_IP_DST) ||
  807. !(nfc->data & RXH_L4_B_0_1) ||
  808. !(nfc->data & RXH_L4_B_2_3))
  809. return -EINVAL;
  810. break;
  811. case UDP_V4_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_UDPIP4;
  818. break;
  819. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  820. rss_fields |= VMXNET3_RSS_FIELDS_UDPIP4;
  821. break;
  822. default:
  823. return -EINVAL;
  824. }
  825. break;
  826. case UDP_V6_FLOW:
  827. if (!(nfc->data & RXH_IP_SRC) ||
  828. !(nfc->data & RXH_IP_DST))
  829. return -EINVAL;
  830. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  831. case 0:
  832. rss_fields &= ~VMXNET3_RSS_FIELDS_UDPIP6;
  833. break;
  834. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  835. rss_fields |= VMXNET3_RSS_FIELDS_UDPIP6;
  836. break;
  837. default:
  838. return -EINVAL;
  839. }
  840. break;
  841. case ESP_V4_FLOW:
  842. case AH_V4_FLOW:
  843. case AH_ESP_V4_FLOW:
  844. if (!(nfc->data & RXH_IP_SRC) ||
  845. !(nfc->data & RXH_IP_DST))
  846. return -EINVAL;
  847. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  848. case 0:
  849. rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP4;
  850. break;
  851. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  852. rss_fields |= VMXNET3_RSS_FIELDS_ESPIP4;
  853. break;
  854. default:
  855. return -EINVAL;
  856. }
  857. break;
  858. case ESP_V6_FLOW:
  859. case AH_V6_FLOW:
  860. case AH_ESP_V6_FLOW:
  861. if (!VMXNET3_VERSION_GE_6(adapter))
  862. return -EOPNOTSUPP;
  863. if (!(nfc->data & RXH_IP_SRC) ||
  864. !(nfc->data & RXH_IP_DST))
  865. return -EINVAL;
  866. switch (nfc->data & (RXH_L4_B_0_1 | RXH_L4_B_2_3)) {
  867. case 0:
  868. rss_fields &= ~VMXNET3_RSS_FIELDS_ESPIP6;
  869. break;
  870. case (RXH_L4_B_0_1 | RXH_L4_B_2_3):
  871. rss_fields |= VMXNET3_RSS_FIELDS_ESPIP6;
  872. break;
  873. default:
  874. return -EINVAL;
  875. }
  876. break;
  877. case SCTP_V4_FLOW:
  878. case SCTP_V6_FLOW:
  879. if (!(nfc->data & RXH_IP_SRC) ||
  880. !(nfc->data & RXH_IP_DST) ||
  881. (nfc->data & RXH_L4_B_0_1) ||
  882. (nfc->data & RXH_L4_B_2_3))
  883. return -EINVAL;
  884. break;
  885. default:
  886. return -EINVAL;
  887. }
  888. /* if we changed something we need to update flags */
  889. if (rss_fields != adapter->rss_fields) {
  890. adapter->default_rss_fields = false;
  891. if (netif_running(netdev)) {
  892. struct Vmxnet3_DriverShared *shared = adapter->shared;
  893. union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;
  894. unsigned long flags;
  895. if (VMXNET3_VERSION_GE_7(adapter)) {
  896. if ((rss_fields & VMXNET3_RSS_FIELDS_UDPIP4 ||
  897. rss_fields & VMXNET3_RSS_FIELDS_UDPIP6) &&
  898. vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  899. VMXNET3_CAP_UDP_RSS)) {
  900. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_UDP_RSS;
  901. } else {
  902. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_UDP_RSS);
  903. }
  904. if ((rss_fields & VMXNET3_RSS_FIELDS_ESPIP4) &&
  905. vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  906. VMXNET3_CAP_ESP_RSS_IPV4)) {
  907. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_ESP_RSS_IPV4;
  908. } else {
  909. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_ESP_RSS_IPV4);
  910. }
  911. if ((rss_fields & VMXNET3_RSS_FIELDS_ESPIP6) &&
  912. vmxnet3_check_ptcapability(adapter->ptcap_supported[0],
  913. VMXNET3_CAP_ESP_RSS_IPV6)) {
  914. adapter->dev_caps[0] |= 1UL << VMXNET3_CAP_ESP_RSS_IPV6;
  915. } else {
  916. adapter->dev_caps[0] &= ~(1UL << VMXNET3_CAP_ESP_RSS_IPV6);
  917. }
  918. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_DCR,
  919. adapter->dev_caps[0]);
  920. spin_lock_irqsave(&adapter->cmd_lock, flags);
  921. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  922. VMXNET3_CMD_GET_DCR0_REG);
  923. adapter->dev_caps[0] = VMXNET3_READ_BAR1_REG(adapter,
  924. VMXNET3_REG_CMD);
  925. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  926. }
  927. spin_lock_irqsave(&adapter->cmd_lock, flags);
  928. cmdInfo->setRssFields = rss_fields;
  929. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  930. VMXNET3_CMD_SET_RSS_FIELDS);
  931. /* Not all requested RSS may get applied, so get and
  932. * cache what was actually applied.
  933. */
  934. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  935. VMXNET3_CMD_GET_RSS_FIELDS);
  936. adapter->rss_fields =
  937. VMXNET3_READ_BAR1_REG(adapter, VMXNET3_REG_CMD);
  938. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  939. } else {
  940. /* When the device is activated, we will try to apply
  941. * these rules and cache the applied value later.
  942. */
  943. adapter->rss_fields = rss_fields;
  944. }
  945. }
  946. return 0;
  947. }
  948. static u32 vmxnet3_get_rx_ring_count(struct net_device *netdev)
  949. {
  950. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  951. return adapter->num_rx_queues;
  952. }
  953. #ifdef VMXNET3_RSS
  954. static u32
  955. vmxnet3_get_rss_indir_size(struct net_device *netdev)
  956. {
  957. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  958. struct UPT1_RSSConf *rssConf = adapter->rss_conf;
  959. return rssConf->indTableSize;
  960. }
  961. static int
  962. vmxnet3_get_rss(struct net_device *netdev, struct ethtool_rxfh_param *rxfh)
  963. {
  964. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  965. struct UPT1_RSSConf *rssConf = adapter->rss_conf;
  966. unsigned int n = rssConf->indTableSize;
  967. rxfh->hfunc = ETH_RSS_HASH_TOP;
  968. if (!rxfh->indir)
  969. return 0;
  970. if (n > UPT1_RSS_MAX_IND_TABLE_SIZE)
  971. return 0;
  972. while (n--)
  973. rxfh->indir[n] = rssConf->indTable[n];
  974. return 0;
  975. }
  976. static int
  977. vmxnet3_set_rss(struct net_device *netdev, struct ethtool_rxfh_param *rxfh,
  978. struct netlink_ext_ack *extack)
  979. {
  980. unsigned int i;
  981. unsigned long flags;
  982. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  983. struct UPT1_RSSConf *rssConf = adapter->rss_conf;
  984. /* We do not allow change in unsupported parameters */
  985. if (rxfh->key ||
  986. (rxfh->hfunc != ETH_RSS_HASH_NO_CHANGE &&
  987. rxfh->hfunc != ETH_RSS_HASH_TOP))
  988. return -EOPNOTSUPP;
  989. if (!rxfh->indir)
  990. return 0;
  991. for (i = 0; i < rssConf->indTableSize; i++)
  992. rssConf->indTable[i] = rxfh->indir[i];
  993. spin_lock_irqsave(&adapter->cmd_lock, flags);
  994. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  995. VMXNET3_CMD_UPDATE_RSSIDT);
  996. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  997. return 0;
  998. }
  999. #endif
  1000. static int vmxnet3_get_coalesce(struct net_device *netdev,
  1001. struct ethtool_coalesce *ec,
  1002. struct kernel_ethtool_coalesce *kernel_coal,
  1003. struct netlink_ext_ack *extack)
  1004. {
  1005. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1006. if (!VMXNET3_VERSION_GE_3(adapter))
  1007. return -EOPNOTSUPP;
  1008. switch (adapter->coal_conf->coalMode) {
  1009. case VMXNET3_COALESCE_DISABLED:
  1010. /* struct ethtool_coalesce is already initialized to 0 */
  1011. break;
  1012. case VMXNET3_COALESCE_ADAPT:
  1013. ec->use_adaptive_rx_coalesce = true;
  1014. break;
  1015. case VMXNET3_COALESCE_STATIC:
  1016. ec->tx_max_coalesced_frames =
  1017. adapter->coal_conf->coalPara.coalStatic.tx_comp_depth;
  1018. ec->rx_max_coalesced_frames =
  1019. adapter->coal_conf->coalPara.coalStatic.rx_depth;
  1020. break;
  1021. case VMXNET3_COALESCE_RBC: {
  1022. u32 rbc_rate;
  1023. rbc_rate = adapter->coal_conf->coalPara.coalRbc.rbc_rate;
  1024. ec->rx_coalesce_usecs = VMXNET3_COAL_RBC_USECS(rbc_rate);
  1025. }
  1026. break;
  1027. default:
  1028. return -EOPNOTSUPP;
  1029. }
  1030. return 0;
  1031. }
  1032. static int vmxnet3_set_coalesce(struct net_device *netdev,
  1033. struct ethtool_coalesce *ec,
  1034. struct kernel_ethtool_coalesce *kernel_coal,
  1035. struct netlink_ext_ack *extack)
  1036. {
  1037. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1038. struct Vmxnet3_DriverShared *shared = adapter->shared;
  1039. union Vmxnet3_CmdInfo *cmdInfo = &shared->cu.cmdInfo;
  1040. unsigned long flags;
  1041. if (!VMXNET3_VERSION_GE_3(adapter))
  1042. return -EOPNOTSUPP;
  1043. if ((ec->rx_coalesce_usecs == 0) &&
  1044. (ec->use_adaptive_rx_coalesce == 0) &&
  1045. (ec->tx_max_coalesced_frames == 0) &&
  1046. (ec->rx_max_coalesced_frames == 0)) {
  1047. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1048. adapter->coal_conf->coalMode = VMXNET3_COALESCE_DISABLED;
  1049. goto done;
  1050. }
  1051. if (ec->rx_coalesce_usecs != 0) {
  1052. u32 rbc_rate;
  1053. if ((ec->use_adaptive_rx_coalesce != 0) ||
  1054. (ec->tx_max_coalesced_frames != 0) ||
  1055. (ec->rx_max_coalesced_frames != 0)) {
  1056. return -EINVAL;
  1057. }
  1058. rbc_rate = VMXNET3_COAL_RBC_RATE(ec->rx_coalesce_usecs);
  1059. if (rbc_rate < VMXNET3_COAL_RBC_MIN_RATE ||
  1060. rbc_rate > VMXNET3_COAL_RBC_MAX_RATE) {
  1061. return -EINVAL;
  1062. }
  1063. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1064. adapter->coal_conf->coalMode = VMXNET3_COALESCE_RBC;
  1065. adapter->coal_conf->coalPara.coalRbc.rbc_rate = rbc_rate;
  1066. goto done;
  1067. }
  1068. if (ec->use_adaptive_rx_coalesce != 0) {
  1069. if (ec->tx_max_coalesced_frames != 0 ||
  1070. ec->rx_max_coalesced_frames != 0) {
  1071. return -EINVAL;
  1072. }
  1073. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1074. adapter->coal_conf->coalMode = VMXNET3_COALESCE_ADAPT;
  1075. goto done;
  1076. }
  1077. if ((ec->tx_max_coalesced_frames != 0) ||
  1078. (ec->rx_max_coalesced_frames != 0)) {
  1079. if ((ec->tx_max_coalesced_frames >
  1080. VMXNET3_COAL_STATIC_MAX_DEPTH) ||
  1081. (ec->rx_max_coalesced_frames >
  1082. VMXNET3_COAL_STATIC_MAX_DEPTH)) {
  1083. return -EINVAL;
  1084. }
  1085. memset(adapter->coal_conf, 0, sizeof(*adapter->coal_conf));
  1086. adapter->coal_conf->coalMode = VMXNET3_COALESCE_STATIC;
  1087. adapter->coal_conf->coalPara.coalStatic.tx_comp_depth =
  1088. (ec->tx_max_coalesced_frames ?
  1089. ec->tx_max_coalesced_frames :
  1090. VMXNET3_COAL_STATIC_DEFAULT_DEPTH);
  1091. adapter->coal_conf->coalPara.coalStatic.rx_depth =
  1092. (ec->rx_max_coalesced_frames ?
  1093. ec->rx_max_coalesced_frames :
  1094. VMXNET3_COAL_STATIC_DEFAULT_DEPTH);
  1095. adapter->coal_conf->coalPara.coalStatic.tx_depth =
  1096. VMXNET3_COAL_STATIC_DEFAULT_DEPTH;
  1097. goto done;
  1098. }
  1099. done:
  1100. adapter->default_coal_mode = false;
  1101. if (netif_running(netdev)) {
  1102. spin_lock_irqsave(&adapter->cmd_lock, flags);
  1103. cmdInfo->varConf.confVer = 1;
  1104. cmdInfo->varConf.confLen =
  1105. cpu_to_le32(sizeof(*adapter->coal_conf));
  1106. cmdInfo->varConf.confPA = cpu_to_le64(adapter->coal_conf_pa);
  1107. VMXNET3_WRITE_BAR1_REG(adapter, VMXNET3_REG_CMD,
  1108. VMXNET3_CMD_SET_COALESCE);
  1109. spin_unlock_irqrestore(&adapter->cmd_lock, flags);
  1110. }
  1111. return 0;
  1112. }
  1113. static void vmxnet3_get_channels(struct net_device *netdev,
  1114. struct ethtool_channels *ec)
  1115. {
  1116. struct vmxnet3_adapter *adapter = netdev_priv(netdev);
  1117. if (IS_ENABLED(CONFIG_PCI_MSI) && adapter->intr.type == VMXNET3_IT_MSIX) {
  1118. if (adapter->share_intr == VMXNET3_INTR_BUDDYSHARE) {
  1119. ec->combined_count = adapter->num_tx_queues;
  1120. } else {
  1121. ec->rx_count = adapter->num_rx_queues;
  1122. ec->tx_count =
  1123. adapter->share_intr == VMXNET3_INTR_TXSHARE ?
  1124. 1 : adapter->num_tx_queues;
  1125. }
  1126. } else {
  1127. ec->combined_count = 1;
  1128. }
  1129. ec->other_count = 1;
  1130. /* Number of interrupts cannot be changed on the fly */
  1131. /* Just set maximums to actual values */
  1132. ec->max_rx = ec->rx_count;
  1133. ec->max_tx = ec->tx_count;
  1134. ec->max_combined = ec->combined_count;
  1135. ec->max_other = ec->other_count;
  1136. }
  1137. static const struct ethtool_ops vmxnet3_ethtool_ops = {
  1138. .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS |
  1139. ETHTOOL_COALESCE_MAX_FRAMES |
  1140. ETHTOOL_COALESCE_USE_ADAPTIVE_RX,
  1141. .get_drvinfo = vmxnet3_get_drvinfo,
  1142. .get_regs_len = vmxnet3_get_regs_len,
  1143. .get_regs = vmxnet3_get_regs,
  1144. .get_wol = vmxnet3_get_wol,
  1145. .set_wol = vmxnet3_set_wol,
  1146. .get_link = ethtool_op_get_link,
  1147. .get_coalesce = vmxnet3_get_coalesce,
  1148. .set_coalesce = vmxnet3_set_coalesce,
  1149. .get_strings = vmxnet3_get_strings,
  1150. .get_sset_count = vmxnet3_get_sset_count,
  1151. .get_ethtool_stats = vmxnet3_get_ethtool_stats,
  1152. .get_ringparam = vmxnet3_get_ringparam,
  1153. .set_ringparam = vmxnet3_set_ringparam,
  1154. .get_rx_ring_count = vmxnet3_get_rx_ring_count,
  1155. #ifdef VMXNET3_RSS
  1156. .get_rxfh_indir_size = vmxnet3_get_rss_indir_size,
  1157. .get_rxfh = vmxnet3_get_rss,
  1158. .set_rxfh = vmxnet3_set_rss,
  1159. #endif
  1160. .get_rxfh_fields = vmxnet3_get_rss_hash_opts,
  1161. .set_rxfh_fields = vmxnet3_set_rss_hash_opt,
  1162. .get_link_ksettings = vmxnet3_get_link_ksettings,
  1163. .get_channels = vmxnet3_get_channels,
  1164. };
  1165. void vmxnet3_set_ethtool_ops(struct net_device *netdev)
  1166. {
  1167. netdev->ethtool_ops = &vmxnet3_ethtool_ops;
  1168. }