nfp_net_main.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835
  1. // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
  2. /* Copyright (C) 2015-2018 Netronome Systems, Inc. */
  3. /*
  4. * nfp_net_main.c
  5. * Netronome network device driver: Main entry point
  6. * Authors: Jakub Kicinski <jakub.kicinski@netronome.com>
  7. * Alejandro Lucero <alejandro.lucero@netronome.com>
  8. * Jason McMullan <jason.mcmullan@netronome.com>
  9. * Rolf Neugebauer <rolf.neugebauer@netronome.com>
  10. */
  11. #include <linux/etherdevice.h>
  12. #include <linux/kernel.h>
  13. #include <linux/init.h>
  14. #include <linux/lockdep.h>
  15. #include <linux/pci.h>
  16. #include <linux/pci_regs.h>
  17. #include <linux/random.h>
  18. #include <linux/rtnetlink.h>
  19. #include "nfpcore/nfp.h"
  20. #include "nfpcore/nfp_cpp.h"
  21. #include "nfpcore/nfp_dev.h"
  22. #include "nfpcore/nfp_nffw.h"
  23. #include "nfpcore/nfp_nsp.h"
  24. #include "nfpcore/nfp6000_pcie.h"
  25. #include "nfp_app.h"
  26. #include "nfp_net_ctrl.h"
  27. #include "nfp_net_sriov.h"
  28. #include "nfp_net.h"
  29. #include "nfp_main.h"
  30. #include "nfp_port.h"
  31. #define NFP_PF_CSR_SLICE_SIZE (32 * 1024)
  32. /**
  33. * nfp_net_get_mac_addr() - Get the MAC address.
  34. * @pf: NFP PF handle
  35. * @netdev: net_device to set MAC address on
  36. * @port: NFP port structure
  37. *
  38. * First try to get the MAC address from NSP ETH table. If that
  39. * fails generate a random address.
  40. */
  41. void
  42. nfp_net_get_mac_addr(struct nfp_pf *pf, struct net_device *netdev,
  43. struct nfp_port *port)
  44. {
  45. struct nfp_eth_table_port *eth_port;
  46. eth_port = __nfp_port_get_eth_port(port);
  47. if (!eth_port) {
  48. eth_hw_addr_random(netdev);
  49. return;
  50. }
  51. eth_hw_addr_set(netdev, eth_port->mac_addr);
  52. ether_addr_copy(netdev->perm_addr, eth_port->mac_addr);
  53. }
  54. static struct nfp_eth_table_port *
  55. nfp_net_find_port(struct nfp_eth_table *eth_tbl, unsigned int index)
  56. {
  57. int i;
  58. for (i = 0; eth_tbl && i < eth_tbl->count; i++)
  59. if (eth_tbl->ports[i].index == index)
  60. return &eth_tbl->ports[i];
  61. return NULL;
  62. }
  63. static int nfp_net_pf_get_num_ports(struct nfp_pf *pf)
  64. {
  65. return nfp_pf_rtsym_read_optional(pf, "nfd_cfg_pf%u_num_ports", 1);
  66. }
  67. static void nfp_net_pf_free_vnic(struct nfp_pf *pf, struct nfp_net *nn)
  68. {
  69. if (nfp_net_is_data_vnic(nn))
  70. nfp_app_vnic_free(pf->app, nn);
  71. nfp_port_free(nn->port);
  72. list_del(&nn->vnic_list);
  73. pf->num_vnics--;
  74. nfp_net_free(nn);
  75. }
  76. static void nfp_net_pf_free_vnics(struct nfp_pf *pf)
  77. {
  78. struct nfp_net *nn, *next;
  79. list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list)
  80. if (nfp_net_is_data_vnic(nn))
  81. nfp_net_pf_free_vnic(pf, nn);
  82. }
  83. static struct nfp_net *
  84. nfp_net_pf_alloc_vnic(struct nfp_pf *pf, bool needs_netdev,
  85. void __iomem *ctrl_bar, void __iomem *qc_bar,
  86. int stride, unsigned int id)
  87. {
  88. u32 tx_base, rx_base, n_tx_rings, n_rx_rings;
  89. struct nfp_net *nn;
  90. int err;
  91. tx_base = readl(ctrl_bar + NFP_NET_CFG_START_TXQ);
  92. rx_base = readl(ctrl_bar + NFP_NET_CFG_START_RXQ);
  93. n_tx_rings = readl(ctrl_bar + NFP_NET_CFG_MAX_TXRINGS);
  94. n_rx_rings = readl(ctrl_bar + NFP_NET_CFG_MAX_RXRINGS);
  95. /* Allocate and initialise the vNIC */
  96. nn = nfp_net_alloc(pf->pdev, pf->dev_info, ctrl_bar, needs_netdev,
  97. n_tx_rings, n_rx_rings);
  98. if (IS_ERR(nn))
  99. return nn;
  100. nn->app = pf->app;
  101. nn->tx_bar = qc_bar + tx_base * NFP_QCP_QUEUE_ADDR_SZ;
  102. nn->rx_bar = qc_bar + rx_base * NFP_QCP_QUEUE_ADDR_SZ;
  103. nn->dp.is_vf = 0;
  104. nn->stride_rx = stride;
  105. nn->stride_tx = stride;
  106. if (needs_netdev) {
  107. err = nfp_app_vnic_alloc(pf->app, nn, id);
  108. if (err) {
  109. nfp_net_free(nn);
  110. return ERR_PTR(err);
  111. }
  112. }
  113. pf->num_vnics++;
  114. list_add_tail(&nn->vnic_list, &pf->vnics);
  115. return nn;
  116. }
  117. static int
  118. nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id)
  119. {
  120. int err;
  121. nn->id = id;
  122. if (nn->port) {
  123. err = nfp_devlink_port_register(pf->app, nn->port);
  124. if (err)
  125. return err;
  126. }
  127. err = nfp_net_init(nn);
  128. if (err)
  129. goto err_devlink_port_clean;
  130. nfp_net_debugfs_vnic_add(nn, pf->ddir);
  131. nfp_net_info(nn);
  132. if (nfp_net_is_data_vnic(nn)) {
  133. err = nfp_app_vnic_init(pf->app, nn);
  134. if (err)
  135. goto err_debugfs_vnic_clean;
  136. }
  137. return 0;
  138. err_debugfs_vnic_clean:
  139. nfp_net_debugfs_dir_clean(&nn->debugfs_dir);
  140. nfp_net_clean(nn);
  141. err_devlink_port_clean:
  142. if (nn->port)
  143. nfp_devlink_port_unregister(nn->port);
  144. return err;
  145. }
  146. static int
  147. nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar,
  148. void __iomem *qc_bar, int stride)
  149. {
  150. struct nfp_net *nn;
  151. unsigned int i;
  152. int err;
  153. for (i = 0; i < pf->max_data_vnics; i++) {
  154. nn = nfp_net_pf_alloc_vnic(pf, true, ctrl_bar, qc_bar,
  155. stride, i);
  156. if (IS_ERR(nn)) {
  157. err = PTR_ERR(nn);
  158. goto err_free_prev;
  159. }
  160. if (nn->port)
  161. nn->port->link_cb = nfp_net_refresh_port_table;
  162. ctrl_bar += NFP_PF_CSR_SLICE_SIZE;
  163. /* Kill the vNIC if app init marked it as invalid */
  164. if (nn->port && nn->port->type == NFP_PORT_INVALID)
  165. nfp_net_pf_free_vnic(pf, nn);
  166. }
  167. if (list_empty(&pf->vnics))
  168. return -ENODEV;
  169. return 0;
  170. err_free_prev:
  171. nfp_net_pf_free_vnics(pf);
  172. return err;
  173. }
  174. static void nfp_net_pf_clean_vnic(struct nfp_pf *pf, struct nfp_net *nn)
  175. {
  176. if (nfp_net_is_data_vnic(nn))
  177. nfp_app_vnic_clean(pf->app, nn);
  178. nfp_net_debugfs_dir_clean(&nn->debugfs_dir);
  179. nfp_net_clean(nn);
  180. if (nn->port)
  181. nfp_devlink_port_unregister(nn->port);
  182. }
  183. static int nfp_net_pf_alloc_irqs(struct nfp_pf *pf)
  184. {
  185. unsigned int wanted_irqs, num_irqs, vnics_left, irqs_left;
  186. struct nfp_net *nn;
  187. /* Get MSI-X vectors */
  188. wanted_irqs = 0;
  189. list_for_each_entry(nn, &pf->vnics, vnic_list)
  190. wanted_irqs += NFP_NET_NON_Q_VECTORS + nn->dp.num_r_vecs;
  191. pf->irq_entries = kcalloc(wanted_irqs, sizeof(*pf->irq_entries),
  192. GFP_KERNEL);
  193. if (!pf->irq_entries)
  194. return -ENOMEM;
  195. num_irqs = nfp_net_irqs_alloc(pf->pdev, pf->irq_entries,
  196. NFP_NET_MIN_VNIC_IRQS * pf->num_vnics,
  197. wanted_irqs);
  198. if (!num_irqs) {
  199. nfp_warn(pf->cpp, "Unable to allocate MSI-X vectors\n");
  200. kfree(pf->irq_entries);
  201. return -ENOMEM;
  202. }
  203. /* Distribute IRQs to vNICs */
  204. irqs_left = num_irqs;
  205. vnics_left = pf->num_vnics;
  206. list_for_each_entry(nn, &pf->vnics, vnic_list) {
  207. unsigned int n;
  208. n = min(NFP_NET_NON_Q_VECTORS + nn->dp.num_r_vecs,
  209. DIV_ROUND_UP(irqs_left, vnics_left));
  210. nfp_net_irqs_assign(nn, &pf->irq_entries[num_irqs - irqs_left],
  211. n);
  212. irqs_left -= n;
  213. vnics_left--;
  214. }
  215. return 0;
  216. }
  217. static void nfp_net_pf_free_irqs(struct nfp_pf *pf)
  218. {
  219. nfp_net_irqs_disable(pf->pdev);
  220. kfree(pf->irq_entries);
  221. }
  222. static int nfp_net_pf_init_vnics(struct nfp_pf *pf)
  223. {
  224. struct nfp_net *nn;
  225. unsigned int id;
  226. int err;
  227. /* Finish vNIC init and register */
  228. id = 0;
  229. list_for_each_entry(nn, &pf->vnics, vnic_list) {
  230. if (!nfp_net_is_data_vnic(nn))
  231. continue;
  232. err = nfp_net_pf_init_vnic(pf, nn, id);
  233. if (err)
  234. goto err_prev_deinit;
  235. id++;
  236. }
  237. return 0;
  238. err_prev_deinit:
  239. list_for_each_entry_continue_reverse(nn, &pf->vnics, vnic_list)
  240. if (nfp_net_is_data_vnic(nn))
  241. nfp_net_pf_clean_vnic(pf, nn);
  242. return err;
  243. }
  244. static int
  245. nfp_net_pf_app_init(struct nfp_pf *pf, u8 __iomem *qc_bar, unsigned int stride)
  246. {
  247. struct devlink *devlink = priv_to_devlink(pf);
  248. u8 __iomem *ctrl_bar;
  249. int err;
  250. pf->app = nfp_app_alloc(pf, nfp_net_pf_get_app_id(pf));
  251. if (IS_ERR(pf->app))
  252. return PTR_ERR(pf->app);
  253. devl_lock(devlink);
  254. err = nfp_app_init(pf->app);
  255. devl_unlock(devlink);
  256. if (err)
  257. goto err_free;
  258. if (!nfp_app_needs_ctrl_vnic(pf->app))
  259. return 0;
  260. ctrl_bar = nfp_pf_map_rtsym(pf, "net.ctrl", "_pf%u_net_ctrl_bar",
  261. NFP_PF_CSR_SLICE_SIZE, &pf->ctrl_vnic_bar);
  262. if (IS_ERR(ctrl_bar)) {
  263. nfp_err(pf->cpp, "Failed to find ctrl vNIC memory symbol\n");
  264. err = PTR_ERR(ctrl_bar);
  265. goto err_app_clean;
  266. }
  267. pf->ctrl_vnic = nfp_net_pf_alloc_vnic(pf, false, ctrl_bar, qc_bar,
  268. stride, 0);
  269. if (IS_ERR(pf->ctrl_vnic)) {
  270. err = PTR_ERR(pf->ctrl_vnic);
  271. goto err_unmap;
  272. }
  273. return 0;
  274. err_unmap:
  275. nfp_cpp_area_release_free(pf->ctrl_vnic_bar);
  276. err_app_clean:
  277. devl_lock(devlink);
  278. nfp_app_clean(pf->app);
  279. devl_unlock(devlink);
  280. err_free:
  281. nfp_app_free(pf->app);
  282. pf->app = NULL;
  283. return err;
  284. }
  285. static void nfp_net_pf_app_clean(struct nfp_pf *pf)
  286. {
  287. struct devlink *devlink = priv_to_devlink(pf);
  288. if (pf->ctrl_vnic) {
  289. nfp_net_pf_free_vnic(pf, pf->ctrl_vnic);
  290. nfp_cpp_area_release_free(pf->ctrl_vnic_bar);
  291. }
  292. devl_lock(devlink);
  293. nfp_app_clean(pf->app);
  294. devl_unlock(devlink);
  295. nfp_app_free(pf->app);
  296. pf->app = NULL;
  297. }
  298. static int nfp_net_pf_app_start_ctrl(struct nfp_pf *pf)
  299. {
  300. int err;
  301. if (!pf->ctrl_vnic)
  302. return 0;
  303. err = nfp_net_pf_init_vnic(pf, pf->ctrl_vnic, 0);
  304. if (err)
  305. return err;
  306. err = nfp_ctrl_open(pf->ctrl_vnic);
  307. if (err)
  308. goto err_clean_ctrl;
  309. return 0;
  310. err_clean_ctrl:
  311. nfp_net_pf_clean_vnic(pf, pf->ctrl_vnic);
  312. return err;
  313. }
  314. static void nfp_net_pf_app_stop_ctrl(struct nfp_pf *pf)
  315. {
  316. if (!pf->ctrl_vnic)
  317. return;
  318. nfp_ctrl_close(pf->ctrl_vnic);
  319. nfp_net_pf_clean_vnic(pf, pf->ctrl_vnic);
  320. }
  321. static int nfp_net_pf_app_start(struct nfp_pf *pf)
  322. {
  323. int err;
  324. err = nfp_net_pf_app_start_ctrl(pf);
  325. if (err)
  326. return err;
  327. err = nfp_app_start(pf->app, pf->ctrl_vnic);
  328. if (err)
  329. goto err_ctrl_stop;
  330. if (pf->num_vfs) {
  331. err = nfp_app_sriov_enable(pf->app, pf->num_vfs);
  332. if (err)
  333. goto err_app_stop;
  334. }
  335. return 0;
  336. err_app_stop:
  337. nfp_app_stop(pf->app);
  338. err_ctrl_stop:
  339. nfp_net_pf_app_stop_ctrl(pf);
  340. return err;
  341. }
  342. static void nfp_net_pf_app_stop(struct nfp_pf *pf)
  343. {
  344. if (pf->num_vfs)
  345. nfp_app_sriov_disable(pf->app);
  346. nfp_app_stop(pf->app);
  347. nfp_net_pf_app_stop_ctrl(pf);
  348. }
  349. static void nfp_net_pci_unmap_mem(struct nfp_pf *pf)
  350. {
  351. if (pf->vfcfg_tbl2_area)
  352. nfp_cpp_area_release_free(pf->vfcfg_tbl2_area);
  353. if (pf->vf_cfg_bar)
  354. nfp_cpp_area_release_free(pf->vf_cfg_bar);
  355. if (pf->mac_stats_bar)
  356. nfp_cpp_area_release_free(pf->mac_stats_bar);
  357. nfp_cpp_area_release_free(pf->qc_area);
  358. nfp_cpp_area_release_free(pf->data_vnic_bar);
  359. }
  360. static int nfp_net_pci_map_mem(struct nfp_pf *pf)
  361. {
  362. u32 min_size, cpp_id;
  363. u8 __iomem *mem;
  364. int err;
  365. min_size = pf->max_data_vnics * NFP_PF_CSR_SLICE_SIZE;
  366. mem = nfp_pf_map_rtsym(pf, "net.bar0", "_pf%d_net_bar0",
  367. min_size, &pf->data_vnic_bar);
  368. if (IS_ERR(mem)) {
  369. nfp_err(pf->cpp, "Failed to find data vNIC memory symbol\n");
  370. return PTR_ERR(mem);
  371. }
  372. if (pf->eth_tbl) {
  373. min_size = NFP_MAC_STATS_SIZE * (pf->eth_tbl->max_index + 1);
  374. pf->mac_stats_mem = nfp_rtsym_map(pf->rtbl, "_mac_stats",
  375. "net.macstats", min_size,
  376. &pf->mac_stats_bar);
  377. if (IS_ERR(pf->mac_stats_mem)) {
  378. if (PTR_ERR(pf->mac_stats_mem) != -ENOENT) {
  379. err = PTR_ERR(pf->mac_stats_mem);
  380. goto err_unmap_ctrl;
  381. }
  382. pf->mac_stats_mem = NULL;
  383. }
  384. }
  385. pf->vf_cfg_mem = nfp_pf_map_rtsym(pf, "net.vfcfg", "_pf%d_net_vf_bar",
  386. NFP_NET_CFG_BAR_SZ * pf->limit_vfs,
  387. &pf->vf_cfg_bar);
  388. if (IS_ERR(pf->vf_cfg_mem)) {
  389. if (PTR_ERR(pf->vf_cfg_mem) != -ENOENT) {
  390. err = PTR_ERR(pf->vf_cfg_mem);
  391. goto err_unmap_mac_stats;
  392. }
  393. pf->vf_cfg_mem = NULL;
  394. }
  395. min_size = NFP_NET_VF_CFG_SZ * pf->limit_vfs + NFP_NET_VF_CFG_MB_SZ;
  396. pf->vfcfg_tbl2 = nfp_pf_map_rtsym(pf, "net.vfcfg_tbl2",
  397. "_pf%d_net_vf_cfg2",
  398. min_size, &pf->vfcfg_tbl2_area);
  399. if (IS_ERR(pf->vfcfg_tbl2)) {
  400. if (PTR_ERR(pf->vfcfg_tbl2) != -ENOENT) {
  401. err = PTR_ERR(pf->vfcfg_tbl2);
  402. goto err_unmap_vf_cfg;
  403. }
  404. pf->vfcfg_tbl2 = NULL;
  405. }
  406. cpp_id = NFP_CPP_ISLAND_ID(0, NFP_CPP_ACTION_RW, 0, 0);
  407. mem = nfp_cpp_map_area(pf->cpp, "net.qc", cpp_id,
  408. nfp_qcp_queue_offset(pf->dev_info, 0),
  409. pf->dev_info->qc_area_sz, &pf->qc_area);
  410. if (IS_ERR(mem)) {
  411. nfp_err(pf->cpp, "Failed to map Queue Controller area.\n");
  412. err = PTR_ERR(mem);
  413. goto err_unmap_vfcfg_tbl2;
  414. }
  415. return 0;
  416. err_unmap_vfcfg_tbl2:
  417. if (pf->vfcfg_tbl2_area)
  418. nfp_cpp_area_release_free(pf->vfcfg_tbl2_area);
  419. err_unmap_vf_cfg:
  420. if (pf->vf_cfg_bar)
  421. nfp_cpp_area_release_free(pf->vf_cfg_bar);
  422. err_unmap_mac_stats:
  423. if (pf->mac_stats_bar)
  424. nfp_cpp_area_release_free(pf->mac_stats_bar);
  425. err_unmap_ctrl:
  426. nfp_cpp_area_release_free(pf->data_vnic_bar);
  427. return err;
  428. }
  429. static const unsigned int lr_to_speed[] = {
  430. [NFP_NET_CFG_STS_LINK_RATE_UNSUPPORTED] = 0,
  431. [NFP_NET_CFG_STS_LINK_RATE_UNKNOWN] = SPEED_UNKNOWN,
  432. [NFP_NET_CFG_STS_LINK_RATE_1G] = SPEED_1000,
  433. [NFP_NET_CFG_STS_LINK_RATE_10G] = SPEED_10000,
  434. [NFP_NET_CFG_STS_LINK_RATE_25G] = SPEED_25000,
  435. [NFP_NET_CFG_STS_LINK_RATE_40G] = SPEED_40000,
  436. [NFP_NET_CFG_STS_LINK_RATE_50G] = SPEED_50000,
  437. [NFP_NET_CFG_STS_LINK_RATE_100G] = SPEED_100000,
  438. };
  439. unsigned int nfp_net_lr2speed(unsigned int linkrate)
  440. {
  441. if (linkrate < ARRAY_SIZE(lr_to_speed))
  442. return lr_to_speed[linkrate];
  443. return SPEED_UNKNOWN;
  444. }
  445. unsigned int nfp_net_speed2lr(unsigned int speed)
  446. {
  447. int i;
  448. for (i = 0; i < ARRAY_SIZE(lr_to_speed); i++) {
  449. if (speed == lr_to_speed[i])
  450. return i;
  451. }
  452. return NFP_NET_CFG_STS_LINK_RATE_UNKNOWN;
  453. }
  454. static void nfp_net_notify_port_speed(struct nfp_port *port)
  455. {
  456. struct net_device *netdev = port->netdev;
  457. struct nfp_net *nn;
  458. u16 sts;
  459. if (!nfp_netdev_is_nfp_net(netdev))
  460. return;
  461. nn = netdev_priv(netdev);
  462. sts = nn_readw(nn, NFP_NET_CFG_STS);
  463. if (!(sts & NFP_NET_CFG_STS_LINK)) {
  464. nn_writew(nn, NFP_NET_CFG_STS_NSP_LINK_RATE, NFP_NET_CFG_STS_LINK_RATE_UNKNOWN);
  465. return;
  466. }
  467. nn_writew(nn, NFP_NET_CFG_STS_NSP_LINK_RATE, nfp_net_speed2lr(port->eth_port->speed));
  468. }
  469. static int
  470. nfp_net_eth_port_update(struct nfp_cpp *cpp, struct nfp_port *port,
  471. struct nfp_eth_table *eth_table)
  472. {
  473. struct nfp_eth_table_port *eth_port;
  474. ASSERT_RTNL();
  475. eth_port = nfp_net_find_port(eth_table, port->eth_id);
  476. if (!eth_port) {
  477. set_bit(NFP_PORT_CHANGED, &port->flags);
  478. nfp_warn(cpp, "Warning: port #%d not present after reconfig\n",
  479. port->eth_id);
  480. return -EIO;
  481. }
  482. if (eth_port->override_changed) {
  483. nfp_warn(cpp, "Port #%d config changed, unregistering. Driver reload required before port will be operational again.\n", port->eth_id);
  484. port->type = NFP_PORT_INVALID;
  485. }
  486. memcpy(port->eth_port, eth_port, sizeof(*eth_port));
  487. nfp_net_notify_port_speed(port);
  488. return 0;
  489. }
  490. int nfp_net_refresh_port_table_sync(struct nfp_pf *pf)
  491. {
  492. struct devlink *devlink = priv_to_devlink(pf);
  493. struct nfp_eth_table *eth_table;
  494. struct nfp_net *nn, *next;
  495. struct nfp_port *port;
  496. int err;
  497. devl_assert_locked(devlink);
  498. /* Check for nfp_net_pci_remove() racing against us */
  499. if (list_empty(&pf->vnics))
  500. return 0;
  501. /* Update state of all ports */
  502. rtnl_lock();
  503. list_for_each_entry(port, &pf->ports, port_list)
  504. clear_bit(NFP_PORT_CHANGED, &port->flags);
  505. eth_table = nfp_eth_read_ports(pf->cpp);
  506. if (!eth_table) {
  507. list_for_each_entry(port, &pf->ports, port_list)
  508. if (__nfp_port_get_eth_port(port))
  509. set_bit(NFP_PORT_CHANGED, &port->flags);
  510. rtnl_unlock();
  511. nfp_err(pf->cpp, "Error refreshing port config!\n");
  512. return -EIO;
  513. }
  514. list_for_each_entry(port, &pf->ports, port_list)
  515. if (__nfp_port_get_eth_port(port))
  516. nfp_net_eth_port_update(pf->cpp, port, eth_table);
  517. rtnl_unlock();
  518. kfree(eth_table);
  519. /* Resync repr state. This may cause reprs to be removed. */
  520. err = nfp_reprs_resync_phys_ports(pf->app);
  521. if (err)
  522. return err;
  523. /* Shoot off the ports which became invalid */
  524. list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list) {
  525. if (!nn->port || nn->port->type != NFP_PORT_INVALID)
  526. continue;
  527. nfp_net_pf_clean_vnic(pf, nn);
  528. nfp_net_pf_free_vnic(pf, nn);
  529. }
  530. return 0;
  531. }
  532. static void nfp_net_refresh_vnics(struct work_struct *work)
  533. {
  534. struct nfp_pf *pf = container_of(work, struct nfp_pf,
  535. port_refresh_work);
  536. struct devlink *devlink = priv_to_devlink(pf);
  537. devl_lock(devlink);
  538. nfp_net_refresh_port_table_sync(pf);
  539. devl_unlock(devlink);
  540. }
  541. void nfp_net_refresh_port_table(struct nfp_port *port)
  542. {
  543. struct nfp_pf *pf = port->app->pf;
  544. set_bit(NFP_PORT_CHANGED, &port->flags);
  545. queue_work(pf->wq, &pf->port_refresh_work);
  546. }
  547. int nfp_net_refresh_eth_port(struct nfp_port *port)
  548. {
  549. struct nfp_cpp *cpp = port->app->cpp;
  550. struct nfp_eth_table *eth_table;
  551. int ret;
  552. clear_bit(NFP_PORT_CHANGED, &port->flags);
  553. eth_table = nfp_eth_read_ports(cpp);
  554. if (!eth_table) {
  555. set_bit(NFP_PORT_CHANGED, &port->flags);
  556. nfp_err(cpp, "Error refreshing port state table!\n");
  557. return -EIO;
  558. }
  559. ret = nfp_net_eth_port_update(cpp, port, eth_table);
  560. kfree(eth_table);
  561. return ret;
  562. }
  563. /*
  564. * PCI device functions
  565. */
  566. int nfp_net_pci_probe(struct nfp_pf *pf)
  567. {
  568. struct devlink *devlink = priv_to_devlink(pf);
  569. struct nfp_net_fw_version fw_ver;
  570. u8 __iomem *ctrl_bar, *qc_bar;
  571. int stride;
  572. int err;
  573. INIT_WORK(&pf->port_refresh_work, nfp_net_refresh_vnics);
  574. if (!pf->rtbl) {
  575. nfp_err(pf->cpp, "No %s, giving up.\n",
  576. pf->fw_loaded ? "symbol table" : "firmware found");
  577. return -EINVAL;
  578. }
  579. pf->max_data_vnics = nfp_net_pf_get_num_ports(pf);
  580. if ((int)pf->max_data_vnics < 0)
  581. return pf->max_data_vnics;
  582. err = nfp_net_pci_map_mem(pf);
  583. if (err)
  584. return err;
  585. ctrl_bar = nfp_cpp_area_iomem(pf->data_vnic_bar);
  586. qc_bar = nfp_cpp_area_iomem(pf->qc_area);
  587. if (!ctrl_bar || !qc_bar) {
  588. err = -EIO;
  589. goto err_unmap;
  590. }
  591. nfp_net_get_fw_version(&fw_ver, ctrl_bar);
  592. if (fw_ver.extend & NFP_NET_CFG_VERSION_RESERVED_MASK ||
  593. fw_ver.class != NFP_NET_CFG_VERSION_CLASS_GENERIC) {
  594. nfp_err(pf->cpp, "Unknown Firmware ABI %d.%d.%d.%d\n",
  595. fw_ver.extend, fw_ver.class,
  596. fw_ver.major, fw_ver.minor);
  597. err = -EINVAL;
  598. goto err_unmap;
  599. }
  600. /* Determine stride */
  601. if (nfp_net_fw_ver_eq(&fw_ver, 0, 0, 0, 1)) {
  602. stride = 2;
  603. nfp_warn(pf->cpp, "OBSOLETE Firmware detected - VF isolation not available\n");
  604. } else {
  605. switch (fw_ver.major) {
  606. case 1 ... 5:
  607. stride = 4;
  608. break;
  609. default:
  610. nfp_err(pf->cpp, "Unsupported Firmware ABI %d.%d.%d.%d\n",
  611. fw_ver.extend, fw_ver.class,
  612. fw_ver.major, fw_ver.minor);
  613. err = -EINVAL;
  614. goto err_unmap;
  615. }
  616. }
  617. err = nfp_net_pf_app_init(pf, qc_bar, stride);
  618. if (err)
  619. goto err_unmap;
  620. err = nfp_shared_buf_register(pf);
  621. if (err)
  622. goto err_devlink_unreg;
  623. devl_lock(devlink);
  624. err = nfp_devlink_params_register(pf);
  625. if (err)
  626. goto err_shared_buf_unreg;
  627. pf->ddir = nfp_net_debugfs_device_add(pf->pdev);
  628. /* Allocate the vnics and do basic init */
  629. err = nfp_net_pf_alloc_vnics(pf, ctrl_bar, qc_bar, stride);
  630. if (err)
  631. goto err_clean_ddir;
  632. err = nfp_net_pf_alloc_irqs(pf);
  633. if (err)
  634. goto err_free_vnics;
  635. err = nfp_net_pf_app_start(pf);
  636. if (err)
  637. goto err_free_irqs;
  638. err = nfp_net_pf_init_vnics(pf);
  639. if (err)
  640. goto err_stop_app;
  641. devl_unlock(devlink);
  642. devlink_register(devlink);
  643. return 0;
  644. err_stop_app:
  645. nfp_net_pf_app_stop(pf);
  646. err_free_irqs:
  647. nfp_net_pf_free_irqs(pf);
  648. err_free_vnics:
  649. nfp_net_pf_free_vnics(pf);
  650. err_clean_ddir:
  651. nfp_net_debugfs_dir_clean(&pf->ddir);
  652. nfp_devlink_params_unregister(pf);
  653. err_shared_buf_unreg:
  654. devl_unlock(devlink);
  655. nfp_shared_buf_unregister(pf);
  656. err_devlink_unreg:
  657. cancel_work_sync(&pf->port_refresh_work);
  658. nfp_net_pf_app_clean(pf);
  659. err_unmap:
  660. nfp_net_pci_unmap_mem(pf);
  661. return err;
  662. }
  663. void nfp_net_pci_remove(struct nfp_pf *pf)
  664. {
  665. struct devlink *devlink = priv_to_devlink(pf);
  666. struct nfp_net *nn, *next;
  667. devlink_unregister(priv_to_devlink(pf));
  668. devl_lock(devlink);
  669. list_for_each_entry_safe(nn, next, &pf->vnics, vnic_list) {
  670. if (!nfp_net_is_data_vnic(nn))
  671. continue;
  672. nfp_net_pf_clean_vnic(pf, nn);
  673. nfp_net_pf_free_vnic(pf, nn);
  674. }
  675. nfp_net_pf_app_stop(pf);
  676. /* stop app first, to avoid double free of ctrl vNIC's ddir */
  677. nfp_net_debugfs_dir_clean(&pf->ddir);
  678. nfp_devlink_params_unregister(pf);
  679. devl_unlock(devlink);
  680. nfp_shared_buf_unregister(pf);
  681. nfp_net_pf_free_irqs(pf);
  682. nfp_net_pf_app_clean(pf);
  683. nfp_net_pci_unmap_mem(pf);
  684. cancel_work_sync(&pf->port_refresh_work);
  685. }