hinic3_netdev_ops.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
  3. #include <linux/etherdevice.h>
  4. #include <linux/if_vlan.h>
  5. #include <linux/netdevice.h>
  6. #include <net/vxlan.h>
  7. #include "hinic3_hwif.h"
  8. #include "hinic3_nic_cfg.h"
  9. #include "hinic3_nic_dev.h"
  10. #include "hinic3_nic_io.h"
  11. #include "hinic3_rss.h"
  12. #include "hinic3_rx.h"
  13. #include "hinic3_tx.h"
  14. #define HINIC3_LRO_DEFAULT_COAL_PKT_SIZE 32
  15. #define HINIC3_LRO_DEFAULT_TIME_LIMIT 16
  16. #define VLAN_BITMAP_BITS_SIZE(nic_dev) (sizeof(*(nic_dev)->vlan_bitmap) * 8)
  17. #define VID_LINE(nic_dev, vid) \
  18. ((vid) / VLAN_BITMAP_BITS_SIZE(nic_dev))
  19. #define VID_COL(nic_dev, vid) \
  20. ((vid) & (VLAN_BITMAP_BITS_SIZE(nic_dev) - 1))
  21. /* try to modify the number of irq to the target number,
  22. * and return the actual number of irq.
  23. */
  24. static u16 hinic3_qp_irq_change(struct net_device *netdev,
  25. u16 dst_num_qp_irq)
  26. {
  27. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  28. struct msix_entry *qps_msix_entries;
  29. u16 resp_irq_num, irq_num_gap, i;
  30. u16 idx;
  31. int err;
  32. qps_msix_entries = nic_dev->qps_msix_entries;
  33. if (dst_num_qp_irq > nic_dev->num_qp_irq) {
  34. irq_num_gap = dst_num_qp_irq - nic_dev->num_qp_irq;
  35. err = hinic3_alloc_irqs(nic_dev->hwdev, irq_num_gap,
  36. &qps_msix_entries[nic_dev->num_qp_irq],
  37. &resp_irq_num);
  38. if (err) {
  39. netdev_err(netdev, "Failed to alloc irqs\n");
  40. return nic_dev->num_qp_irq;
  41. }
  42. nic_dev->num_qp_irq += resp_irq_num;
  43. } else if (dst_num_qp_irq < nic_dev->num_qp_irq) {
  44. irq_num_gap = nic_dev->num_qp_irq - dst_num_qp_irq;
  45. for (i = 0; i < irq_num_gap; i++) {
  46. idx = (nic_dev->num_qp_irq - i) - 1;
  47. hinic3_free_irq(nic_dev->hwdev,
  48. qps_msix_entries[idx].vector);
  49. qps_msix_entries[idx].vector = 0;
  50. qps_msix_entries[idx].entry = 0;
  51. }
  52. nic_dev->num_qp_irq = dst_num_qp_irq;
  53. }
  54. return nic_dev->num_qp_irq;
  55. }
  56. static void hinic3_config_num_qps(struct net_device *netdev,
  57. struct hinic3_dyna_txrxq_params *q_params)
  58. {
  59. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  60. u16 alloc_num_irq, cur_num_irq;
  61. u16 dst_num_irq;
  62. if (!test_bit(HINIC3_RSS_ENABLE, &nic_dev->flags))
  63. q_params->num_qps = 1;
  64. if (nic_dev->num_qp_irq >= q_params->num_qps)
  65. goto out;
  66. cur_num_irq = nic_dev->num_qp_irq;
  67. alloc_num_irq = hinic3_qp_irq_change(netdev, q_params->num_qps);
  68. if (alloc_num_irq < q_params->num_qps) {
  69. q_params->num_qps = alloc_num_irq;
  70. netdev_warn(netdev, "Can not get enough irqs, adjust num_qps to %u\n",
  71. q_params->num_qps);
  72. /* The current irq may be in use, we must keep it */
  73. dst_num_irq = max_t(u16, cur_num_irq, q_params->num_qps);
  74. hinic3_qp_irq_change(netdev, dst_num_irq);
  75. }
  76. out:
  77. netdev_dbg(netdev, "No need to change irqs, num_qps is %u\n",
  78. q_params->num_qps);
  79. }
  80. static int hinic3_setup_num_qps(struct net_device *netdev)
  81. {
  82. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  83. nic_dev->num_qp_irq = 0;
  84. nic_dev->qps_msix_entries = kzalloc_objs(struct msix_entry,
  85. nic_dev->max_qps);
  86. if (!nic_dev->qps_msix_entries)
  87. return -ENOMEM;
  88. hinic3_config_num_qps(netdev, &nic_dev->q_params);
  89. return 0;
  90. }
  91. static void hinic3_destroy_num_qps(struct net_device *netdev)
  92. {
  93. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  94. u16 i;
  95. for (i = 0; i < nic_dev->num_qp_irq; i++)
  96. hinic3_free_irq(nic_dev->hwdev,
  97. nic_dev->qps_msix_entries[i].vector);
  98. kfree(nic_dev->qps_msix_entries);
  99. }
  100. static int hinic3_alloc_txrxq_resources(struct net_device *netdev,
  101. struct hinic3_dyna_txrxq_params *q_params)
  102. {
  103. int err;
  104. q_params->txqs_res = kzalloc_objs(*q_params->txqs_res,
  105. q_params->num_qps);
  106. if (!q_params->txqs_res)
  107. return -ENOMEM;
  108. q_params->rxqs_res = kzalloc_objs(*q_params->rxqs_res,
  109. q_params->num_qps);
  110. if (!q_params->rxqs_res) {
  111. err = -ENOMEM;
  112. goto err_free_txqs_res_arr;
  113. }
  114. q_params->irq_cfg = kzalloc_objs(*q_params->irq_cfg, q_params->num_qps);
  115. if (!q_params->irq_cfg) {
  116. err = -ENOMEM;
  117. goto err_free_rxqs_res_arr;
  118. }
  119. err = hinic3_alloc_txqs_res(netdev, q_params->num_qps,
  120. q_params->sq_depth, q_params->txqs_res);
  121. if (err) {
  122. netdev_err(netdev, "Failed to alloc txqs resource\n");
  123. goto err_free_irq_cfg;
  124. }
  125. err = hinic3_alloc_rxqs_res(netdev, q_params->num_qps,
  126. q_params->rq_depth, q_params->rxqs_res);
  127. if (err) {
  128. netdev_err(netdev, "Failed to alloc rxqs resource\n");
  129. goto err_free_txqs_res;
  130. }
  131. return 0;
  132. err_free_txqs_res:
  133. hinic3_free_txqs_res(netdev, q_params->num_qps, q_params->sq_depth,
  134. q_params->txqs_res);
  135. err_free_irq_cfg:
  136. kfree(q_params->irq_cfg);
  137. q_params->irq_cfg = NULL;
  138. err_free_rxqs_res_arr:
  139. kfree(q_params->rxqs_res);
  140. q_params->rxqs_res = NULL;
  141. err_free_txqs_res_arr:
  142. kfree(q_params->txqs_res);
  143. q_params->txqs_res = NULL;
  144. return err;
  145. }
  146. static void hinic3_free_txrxq_resources(struct net_device *netdev,
  147. struct hinic3_dyna_txrxq_params *q_params)
  148. {
  149. hinic3_free_rxqs_res(netdev, q_params->num_qps, q_params->rq_depth,
  150. q_params->rxqs_res);
  151. hinic3_free_txqs_res(netdev, q_params->num_qps, q_params->sq_depth,
  152. q_params->txqs_res);
  153. kfree(q_params->irq_cfg);
  154. q_params->irq_cfg = NULL;
  155. kfree(q_params->rxqs_res);
  156. q_params->rxqs_res = NULL;
  157. kfree(q_params->txqs_res);
  158. q_params->txqs_res = NULL;
  159. }
  160. static int hinic3_configure_txrxqs(struct net_device *netdev,
  161. struct hinic3_dyna_txrxq_params *q_params)
  162. {
  163. int err;
  164. err = hinic3_configure_txqs(netdev, q_params->num_qps,
  165. q_params->sq_depth, q_params->txqs_res);
  166. if (err) {
  167. netdev_err(netdev, "Failed to configure txqs\n");
  168. return err;
  169. }
  170. err = hinic3_configure_rxqs(netdev, q_params->num_qps,
  171. q_params->rq_depth, q_params->rxqs_res);
  172. if (err) {
  173. netdev_err(netdev, "Failed to configure rxqs\n");
  174. return err;
  175. }
  176. return 0;
  177. }
  178. static int hinic3_configure(struct net_device *netdev)
  179. {
  180. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  181. int err;
  182. netdev->min_mtu = HINIC3_MIN_MTU_SIZE;
  183. netdev->max_mtu = HINIC3_MAX_JUMBO_FRAME_SIZE;
  184. err = hinic3_set_port_mtu(netdev, netdev->mtu);
  185. if (err) {
  186. netdev_err(netdev, "Failed to set mtu\n");
  187. return err;
  188. }
  189. /* Ensure DCB is disabled */
  190. hinic3_sync_dcb_state(nic_dev->hwdev, 1, 0);
  191. if (test_bit(HINIC3_RSS_ENABLE, &nic_dev->flags)) {
  192. err = hinic3_rss_init(netdev);
  193. if (err) {
  194. netdev_err(netdev, "Failed to init rss\n");
  195. return err;
  196. }
  197. }
  198. return 0;
  199. }
  200. static void hinic3_remove_configure(struct net_device *netdev)
  201. {
  202. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  203. if (test_bit(HINIC3_RSS_ENABLE, &nic_dev->flags))
  204. hinic3_rss_uninit(netdev);
  205. }
  206. static int hinic3_alloc_channel_resources(struct net_device *netdev,
  207. struct hinic3_dyna_qp_params *qp_params,
  208. struct hinic3_dyna_txrxq_params *trxq_params)
  209. {
  210. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  211. int err;
  212. qp_params->num_qps = trxq_params->num_qps;
  213. qp_params->sq_depth = trxq_params->sq_depth;
  214. qp_params->rq_depth = trxq_params->rq_depth;
  215. err = hinic3_alloc_qps(nic_dev, qp_params);
  216. if (err) {
  217. netdev_err(netdev, "Failed to alloc qps\n");
  218. return err;
  219. }
  220. err = hinic3_alloc_txrxq_resources(netdev, trxq_params);
  221. if (err) {
  222. netdev_err(netdev, "Failed to alloc txrxq resources\n");
  223. hinic3_free_qps(nic_dev, qp_params);
  224. return err;
  225. }
  226. return 0;
  227. }
  228. static void hinic3_free_channel_resources(struct net_device *netdev,
  229. struct hinic3_dyna_qp_params *qp_params,
  230. struct hinic3_dyna_txrxq_params *trxq_params)
  231. {
  232. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  233. hinic3_free_txrxq_resources(netdev, trxq_params);
  234. hinic3_free_qps(nic_dev, qp_params);
  235. }
  236. static int hinic3_open_channel(struct net_device *netdev)
  237. {
  238. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  239. int err;
  240. err = hinic3_init_qp_ctxts(nic_dev);
  241. if (err) {
  242. netdev_err(netdev, "Failed to init qps\n");
  243. return err;
  244. }
  245. err = hinic3_configure_txrxqs(netdev, &nic_dev->q_params);
  246. if (err) {
  247. netdev_err(netdev, "Failed to configure txrxqs\n");
  248. goto err_free_qp_ctxts;
  249. }
  250. err = hinic3_qps_irq_init(netdev);
  251. if (err) {
  252. netdev_err(netdev, "Failed to init txrxq irq\n");
  253. goto err_free_qp_ctxts;
  254. }
  255. err = hinic3_configure(netdev);
  256. if (err) {
  257. netdev_err(netdev, "Failed to configure device resources\n");
  258. goto err_uninit_qps_irq;
  259. }
  260. return 0;
  261. err_uninit_qps_irq:
  262. hinic3_qps_irq_uninit(netdev);
  263. err_free_qp_ctxts:
  264. hinic3_free_qp_ctxts(nic_dev);
  265. return err;
  266. }
  267. static void hinic3_close_channel(struct net_device *netdev)
  268. {
  269. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  270. hinic3_remove_configure(netdev);
  271. hinic3_qps_irq_uninit(netdev);
  272. hinic3_free_qp_ctxts(nic_dev);
  273. }
  274. static int hinic3_maybe_set_port_state(struct net_device *netdev, bool enable)
  275. {
  276. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  277. int err;
  278. mutex_lock(&nic_dev->port_state_mutex);
  279. err = hinic3_set_port_enable(nic_dev->hwdev, enable);
  280. mutex_unlock(&nic_dev->port_state_mutex);
  281. return err;
  282. }
  283. static void hinic3_print_link_message(struct net_device *netdev,
  284. bool link_status_up)
  285. {
  286. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  287. if (nic_dev->link_status_up == link_status_up)
  288. return;
  289. nic_dev->link_status_up = link_status_up;
  290. netdev_dbg(netdev, "Link is %s\n", str_up_down(link_status_up));
  291. }
  292. static int hinic3_vport_up(struct net_device *netdev)
  293. {
  294. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  295. bool link_status_up;
  296. u16 glb_func_id;
  297. int err;
  298. glb_func_id = hinic3_global_func_id(nic_dev->hwdev);
  299. err = hinic3_set_vport_enable(nic_dev->hwdev, glb_func_id, true);
  300. if (err) {
  301. netdev_err(netdev, "Failed to enable vport\n");
  302. goto err_flush_qps_res;
  303. }
  304. err = hinic3_maybe_set_port_state(netdev, true);
  305. if (err) {
  306. netdev_err(netdev, "Failed to enable port\n");
  307. goto err_disable_vport;
  308. }
  309. err = netif_set_real_num_queues(netdev, nic_dev->q_params.num_qps,
  310. nic_dev->q_params.num_qps);
  311. if (err) {
  312. netdev_err(netdev, "Failed to set real number of queues\n");
  313. goto err_disable_vport;
  314. }
  315. netif_tx_start_all_queues(netdev);
  316. err = hinic3_get_link_status(nic_dev->hwdev, &link_status_up);
  317. if (!err && link_status_up)
  318. netif_carrier_on(netdev);
  319. hinic3_print_link_message(netdev, link_status_up);
  320. return 0;
  321. err_disable_vport:
  322. hinic3_set_vport_enable(nic_dev->hwdev, glb_func_id, false);
  323. err_flush_qps_res:
  324. hinic3_flush_qps_res(nic_dev->hwdev);
  325. /* wait to guarantee that no packets will be sent to host */
  326. msleep(100);
  327. return err;
  328. }
  329. static void hinic3_vport_down(struct net_device *netdev)
  330. {
  331. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  332. u16 glb_func_id;
  333. netif_carrier_off(netdev);
  334. netif_tx_disable(netdev);
  335. glb_func_id = hinic3_global_func_id(nic_dev->hwdev);
  336. hinic3_set_vport_enable(nic_dev->hwdev, glb_func_id, false);
  337. hinic3_flush_txqs(netdev);
  338. /* wait to guarantee that no packets will be sent to host */
  339. msleep(100);
  340. hinic3_flush_qps_res(nic_dev->hwdev);
  341. }
  342. static int hinic3_open(struct net_device *netdev)
  343. {
  344. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  345. struct hinic3_dyna_qp_params qp_params;
  346. int err;
  347. if (test_bit(HINIC3_INTF_UP, &nic_dev->flags)) {
  348. netdev_dbg(netdev, "Netdev already open, do nothing\n");
  349. return 0;
  350. }
  351. err = hinic3_init_nicio_res(nic_dev);
  352. if (err) {
  353. netdev_err(netdev, "Failed to init nicio resources\n");
  354. return err;
  355. }
  356. err = hinic3_setup_num_qps(netdev);
  357. if (err) {
  358. netdev_err(netdev, "Failed to setup num_qps\n");
  359. goto err_free_nicio_res;
  360. }
  361. err = hinic3_alloc_channel_resources(netdev, &qp_params,
  362. &nic_dev->q_params);
  363. if (err)
  364. goto err_destroy_num_qps;
  365. hinic3_init_qps(nic_dev, &qp_params);
  366. err = hinic3_open_channel(netdev);
  367. if (err)
  368. goto err_uninit_qps;
  369. err = hinic3_vport_up(netdev);
  370. if (err)
  371. goto err_close_channel;
  372. set_bit(HINIC3_INTF_UP, &nic_dev->flags);
  373. return 0;
  374. err_close_channel:
  375. hinic3_close_channel(netdev);
  376. err_uninit_qps:
  377. hinic3_uninit_qps(nic_dev, &qp_params);
  378. hinic3_free_channel_resources(netdev, &qp_params, &nic_dev->q_params);
  379. err_destroy_num_qps:
  380. hinic3_destroy_num_qps(netdev);
  381. err_free_nicio_res:
  382. hinic3_free_nicio_res(nic_dev);
  383. return err;
  384. }
  385. static int hinic3_close(struct net_device *netdev)
  386. {
  387. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  388. struct hinic3_dyna_qp_params qp_params;
  389. if (!test_and_clear_bit(HINIC3_INTF_UP, &nic_dev->flags)) {
  390. netdev_dbg(netdev, "Netdev already close, do nothing\n");
  391. return 0;
  392. }
  393. hinic3_vport_down(netdev);
  394. hinic3_close_channel(netdev);
  395. hinic3_uninit_qps(nic_dev, &qp_params);
  396. hinic3_free_channel_resources(netdev, &qp_params, &nic_dev->q_params);
  397. return 0;
  398. }
  399. #define SET_FEATURES_OP_STR(op) ((op) ? "Enable" : "Disable")
  400. static int hinic3_set_feature_rx_csum(struct net_device *netdev,
  401. netdev_features_t wanted_features,
  402. netdev_features_t features,
  403. netdev_features_t *failed_features)
  404. {
  405. netdev_features_t changed = wanted_features ^ features;
  406. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  407. struct hinic3_hwdev *hwdev = nic_dev->hwdev;
  408. if (changed & NETIF_F_RXCSUM)
  409. dev_dbg(hwdev->dev, "%s rx csum success\n",
  410. SET_FEATURES_OP_STR(wanted_features & NETIF_F_RXCSUM));
  411. return 0;
  412. }
  413. static int hinic3_set_feature_tso(struct net_device *netdev,
  414. netdev_features_t wanted_features,
  415. netdev_features_t features,
  416. netdev_features_t *failed_features)
  417. {
  418. netdev_features_t changed = wanted_features ^ features;
  419. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  420. struct hinic3_hwdev *hwdev = nic_dev->hwdev;
  421. if (changed & NETIF_F_TSO)
  422. dev_dbg(hwdev->dev, "%s tso success\n",
  423. SET_FEATURES_OP_STR(wanted_features & NETIF_F_TSO));
  424. return 0;
  425. }
  426. static int hinic3_set_feature_lro(struct net_device *netdev,
  427. netdev_features_t wanted_features,
  428. netdev_features_t features,
  429. netdev_features_t *failed_features)
  430. {
  431. netdev_features_t changed = wanted_features ^ features;
  432. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  433. struct hinic3_hwdev *hwdev = nic_dev->hwdev;
  434. bool en = !!(wanted_features & NETIF_F_LRO);
  435. int err;
  436. if (!(changed & NETIF_F_LRO))
  437. return 0;
  438. err = hinic3_set_rx_lro_state(hwdev, en,
  439. HINIC3_LRO_DEFAULT_TIME_LIMIT,
  440. HINIC3_LRO_DEFAULT_COAL_PKT_SIZE);
  441. if (err) {
  442. dev_err(hwdev->dev, "%s lro failed\n", SET_FEATURES_OP_STR(en));
  443. *failed_features |= NETIF_F_LRO;
  444. }
  445. return err;
  446. }
  447. static int hinic3_set_feature_rx_cvlan(struct net_device *netdev,
  448. netdev_features_t wanted_features,
  449. netdev_features_t features,
  450. netdev_features_t *failed_features)
  451. {
  452. bool en = !!(wanted_features & NETIF_F_HW_VLAN_CTAG_RX);
  453. netdev_features_t changed = wanted_features ^ features;
  454. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  455. struct hinic3_hwdev *hwdev = nic_dev->hwdev;
  456. int err;
  457. if (!(changed & NETIF_F_HW_VLAN_CTAG_RX))
  458. return 0;
  459. err = hinic3_set_rx_vlan_offload(hwdev, en);
  460. if (err) {
  461. dev_err(hwdev->dev, "%s rx vlan offload failed\n",
  462. SET_FEATURES_OP_STR(en));
  463. *failed_features |= NETIF_F_HW_VLAN_CTAG_RX;
  464. }
  465. return err;
  466. }
  467. static int hinic3_set_feature_vlan_filter(struct net_device *netdev,
  468. netdev_features_t wanted_features,
  469. netdev_features_t features,
  470. netdev_features_t *failed_features)
  471. {
  472. bool en = !!(wanted_features & NETIF_F_HW_VLAN_CTAG_FILTER);
  473. netdev_features_t changed = wanted_features ^ features;
  474. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  475. struct hinic3_hwdev *hwdev = nic_dev->hwdev;
  476. int err;
  477. if (!(changed & NETIF_F_HW_VLAN_CTAG_FILTER))
  478. return 0;
  479. err = hinic3_set_vlan_filter(hwdev, en);
  480. if (err) {
  481. dev_err(hwdev->dev, "%s rx vlan filter failed\n",
  482. SET_FEATURES_OP_STR(en));
  483. *failed_features |= NETIF_F_HW_VLAN_CTAG_FILTER;
  484. }
  485. return err;
  486. }
  487. static int hinic3_set_features(struct net_device *netdev,
  488. netdev_features_t curr,
  489. netdev_features_t wanted)
  490. {
  491. netdev_features_t failed = 0;
  492. int err;
  493. err = hinic3_set_feature_rx_csum(netdev, wanted, curr, &failed) |
  494. hinic3_set_feature_tso(netdev, wanted, curr, &failed) |
  495. hinic3_set_feature_lro(netdev, wanted, curr, &failed) |
  496. hinic3_set_feature_rx_cvlan(netdev, wanted, curr, &failed) |
  497. hinic3_set_feature_vlan_filter(netdev, wanted, curr, &failed);
  498. if (err) {
  499. netdev->features = wanted ^ failed;
  500. return err;
  501. }
  502. return 0;
  503. }
  504. static int hinic3_ndo_set_features(struct net_device *netdev,
  505. netdev_features_t features)
  506. {
  507. return hinic3_set_features(netdev, netdev->features, features);
  508. }
  509. static netdev_features_t hinic3_fix_features(struct net_device *netdev,
  510. netdev_features_t features)
  511. {
  512. netdev_features_t features_tmp = features;
  513. /* If Rx checksum is disabled, then LRO should also be disabled */
  514. if (!(features_tmp & NETIF_F_RXCSUM))
  515. features_tmp &= ~NETIF_F_LRO;
  516. return features_tmp;
  517. }
  518. static netdev_features_t hinic3_features_check(struct sk_buff *skb,
  519. struct net_device *dev,
  520. netdev_features_t features)
  521. {
  522. features = vlan_features_check(skb, features);
  523. features = vxlan_features_check(skb, features);
  524. return features;
  525. }
  526. int hinic3_set_hw_features(struct net_device *netdev)
  527. {
  528. netdev_features_t wanted, curr;
  529. wanted = netdev->features;
  530. /* fake current features so all wanted are enabled */
  531. curr = ~wanted;
  532. return hinic3_set_features(netdev, curr, wanted);
  533. }
  534. static int hinic3_change_mtu(struct net_device *netdev, int new_mtu)
  535. {
  536. int err;
  537. err = hinic3_set_port_mtu(netdev, new_mtu);
  538. if (err) {
  539. netdev_err(netdev, "Failed to change port mtu to %d\n",
  540. new_mtu);
  541. return err;
  542. }
  543. netdev_dbg(netdev, "Change mtu from %u to %d\n", netdev->mtu, new_mtu);
  544. WRITE_ONCE(netdev->mtu, new_mtu);
  545. return 0;
  546. }
  547. static int hinic3_set_mac_addr(struct net_device *netdev, void *addr)
  548. {
  549. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  550. struct sockaddr *saddr = addr;
  551. int err;
  552. if (!is_valid_ether_addr(saddr->sa_data))
  553. return -EADDRNOTAVAIL;
  554. if (ether_addr_equal(netdev->dev_addr, saddr->sa_data))
  555. return 0;
  556. err = hinic3_update_mac(nic_dev->hwdev, netdev->dev_addr,
  557. saddr->sa_data, 0,
  558. hinic3_global_func_id(nic_dev->hwdev));
  559. if (err)
  560. return err;
  561. eth_hw_addr_set(netdev, saddr->sa_data);
  562. return 0;
  563. }
  564. static int hinic3_vlan_rx_add_vid(struct net_device *netdev,
  565. __be16 proto, u16 vid)
  566. {
  567. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  568. unsigned long *vlan_bitmap = nic_dev->vlan_bitmap;
  569. u32 column, row;
  570. u16 func_id;
  571. int err;
  572. column = VID_COL(nic_dev, vid);
  573. row = VID_LINE(nic_dev, vid);
  574. func_id = hinic3_global_func_id(nic_dev->hwdev);
  575. err = hinic3_add_vlan(nic_dev->hwdev, vid, func_id);
  576. if (err) {
  577. netdev_err(netdev, "Failed to add vlan %u\n", vid);
  578. goto out;
  579. }
  580. set_bit(column, &vlan_bitmap[row]);
  581. netdev_dbg(netdev, "Add vlan %u\n", vid);
  582. out:
  583. return err;
  584. }
  585. static int hinic3_vlan_rx_kill_vid(struct net_device *netdev,
  586. __be16 proto, u16 vid)
  587. {
  588. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  589. unsigned long *vlan_bitmap = nic_dev->vlan_bitmap;
  590. u32 column, row;
  591. u16 func_id;
  592. int err;
  593. column = VID_COL(nic_dev, vid);
  594. row = VID_LINE(nic_dev, vid);
  595. func_id = hinic3_global_func_id(nic_dev->hwdev);
  596. err = hinic3_del_vlan(nic_dev->hwdev, vid, func_id);
  597. if (err) {
  598. netdev_err(netdev, "Failed to delete vlan %u\n", vid);
  599. goto out;
  600. }
  601. clear_bit(column, &vlan_bitmap[row]);
  602. netdev_dbg(netdev, "Remove vlan %u\n", vid);
  603. out:
  604. return err;
  605. }
  606. static void hinic3_tx_timeout(struct net_device *netdev, unsigned int txqueue)
  607. {
  608. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  609. struct hinic3_io_queue *sq;
  610. u16 sw_pi, hw_ci;
  611. sq = nic_dev->txqs[txqueue].sq;
  612. sw_pi = hinic3_get_sq_local_pi(sq);
  613. hw_ci = hinic3_get_sq_hw_ci(sq);
  614. netdev_dbg(netdev,
  615. "txq%u: sw_pi: %u, hw_ci: %u, sw_ci: %u, napi->state: 0x%lx.\n",
  616. txqueue, sw_pi, hw_ci, hinic3_get_sq_local_ci(sq),
  617. nic_dev->q_params.irq_cfg[txqueue].napi.state);
  618. if (sw_pi != hw_ci)
  619. set_bit(HINIC3_EVENT_WORK_TX_TIMEOUT, &nic_dev->event_flag);
  620. }
  621. static void hinic3_get_stats64(struct net_device *netdev,
  622. struct rtnl_link_stats64 *stats)
  623. {
  624. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  625. u64 bytes, packets, dropped, errors;
  626. struct hinic3_txq_stats *txq_stats;
  627. struct hinic3_rxq_stats *rxq_stats;
  628. struct hinic3_txq *txq;
  629. struct hinic3_rxq *rxq;
  630. unsigned int start;
  631. int i;
  632. bytes = 0;
  633. packets = 0;
  634. dropped = 0;
  635. for (i = 0; i < nic_dev->max_qps; i++) {
  636. if (!nic_dev->txqs)
  637. break;
  638. txq = &nic_dev->txqs[i];
  639. txq_stats = &txq->txq_stats;
  640. do {
  641. start = u64_stats_fetch_begin(&txq_stats->syncp);
  642. bytes += txq_stats->bytes;
  643. packets += txq_stats->packets;
  644. dropped += txq_stats->dropped;
  645. } while (u64_stats_fetch_retry(&txq_stats->syncp, start));
  646. }
  647. stats->tx_packets = packets;
  648. stats->tx_bytes = bytes;
  649. stats->tx_dropped = dropped;
  650. bytes = 0;
  651. packets = 0;
  652. errors = 0;
  653. dropped = 0;
  654. for (i = 0; i < nic_dev->max_qps; i++) {
  655. if (!nic_dev->rxqs)
  656. break;
  657. rxq = &nic_dev->rxqs[i];
  658. rxq_stats = &rxq->rxq_stats;
  659. do {
  660. start = u64_stats_fetch_begin(&rxq_stats->syncp);
  661. bytes += rxq_stats->bytes;
  662. packets += rxq_stats->packets;
  663. errors += rxq_stats->csum_errors +
  664. rxq_stats->other_errors;
  665. dropped += rxq_stats->dropped;
  666. } while (u64_stats_fetch_retry(&rxq_stats->syncp, start));
  667. }
  668. stats->rx_packets = packets;
  669. stats->rx_bytes = bytes;
  670. stats->rx_errors = errors;
  671. stats->rx_dropped = dropped;
  672. }
  673. static void hinic3_nic_set_rx_mode(struct net_device *netdev)
  674. {
  675. struct hinic3_nic_dev *nic_dev = netdev_priv(netdev);
  676. if (netdev_uc_count(netdev) != nic_dev->netdev_uc_cnt ||
  677. netdev_mc_count(netdev) != nic_dev->netdev_mc_cnt) {
  678. set_bit(HINIC3_UPDATE_MAC_FILTER, &nic_dev->flags);
  679. nic_dev->netdev_uc_cnt = netdev_uc_count(netdev);
  680. nic_dev->netdev_mc_cnt = netdev_mc_count(netdev);
  681. }
  682. queue_work(nic_dev->workq, &nic_dev->rx_mode_work);
  683. }
  684. static const struct net_device_ops hinic3_netdev_ops = {
  685. .ndo_open = hinic3_open,
  686. .ndo_stop = hinic3_close,
  687. .ndo_set_features = hinic3_ndo_set_features,
  688. .ndo_fix_features = hinic3_fix_features,
  689. .ndo_features_check = hinic3_features_check,
  690. .ndo_change_mtu = hinic3_change_mtu,
  691. .ndo_set_mac_address = hinic3_set_mac_addr,
  692. .ndo_validate_addr = eth_validate_addr,
  693. .ndo_vlan_rx_add_vid = hinic3_vlan_rx_add_vid,
  694. .ndo_vlan_rx_kill_vid = hinic3_vlan_rx_kill_vid,
  695. .ndo_tx_timeout = hinic3_tx_timeout,
  696. .ndo_get_stats64 = hinic3_get_stats64,
  697. .ndo_set_rx_mode = hinic3_nic_set_rx_mode,
  698. .ndo_start_xmit = hinic3_xmit_frame,
  699. };
  700. void hinic3_set_netdev_ops(struct net_device *netdev)
  701. {
  702. netdev->netdev_ops = &hinic3_netdev_ops;
  703. }