Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright(C) 2021 Marvell.
3 : : */
4 : : #include <stdint.h>
5 : :
6 : : #include <rte_cycles.h>
7 : : #include <rte_log.h>
8 : : #include <rte_malloc.h>
9 : : #include <rte_rawdev.h>
10 : :
11 : : #include "cnxk_bphy_cgx.h"
12 : : #include "rte_pmd_bphy.h"
13 : :
14 : : static int
15 : 0 : cnxk_bphy_cgx_link_cond(uint16_t dev_id, unsigned int queue, int cond)
16 : : {
17 : : struct cnxk_bphy_cgx_msg_link_info link_info;
18 : : int tries = 10, ret;
19 : :
20 : : do {
21 : 0 : ret = rte_pmd_bphy_cgx_get_link_info(dev_id, queue, &link_info);
22 : : if (ret)
23 : 0 : return ret;
24 : :
25 [ # # ]: 0 : if (link_info.link_up == cond)
26 : : break;
27 : :
28 : : rte_delay_ms(500);
29 [ # # ]: 0 : } while (--tries);
30 : :
31 [ # # ]: 0 : if (tries)
32 : 0 : return !!cond;
33 : :
34 : : return -ETIMEDOUT;
35 : : }
36 : :
37 : : int
38 : 0 : cnxk_bphy_cgx_dev_selftest(uint16_t dev_id)
39 : : {
40 : : unsigned int queues, i;
41 : : int ret;
42 : :
43 : 0 : queues = rte_rawdev_queue_count(dev_id);
44 [ # # ]: 0 : if (queues == 0)
45 : : return -ENODEV;
46 : :
47 : 0 : ret = rte_rawdev_start(dev_id);
48 [ # # ]: 0 : if (ret)
49 : : return ret;
50 : :
51 [ # # ]: 0 : for (i = 0; i < queues; i++) {
52 : : enum cnxk_bphy_cgx_eth_link_fec fec;
53 : : unsigned int descs;
54 : :
55 : 0 : ret = rte_rawdev_queue_conf_get(dev_id, i, &descs,
56 : : sizeof(descs));
57 [ # # ]: 0 : if (ret)
58 : : break;
59 [ # # ]: 0 : if (descs != 1) {
60 : 0 : RTE_LOG(ERR, PMD, "Wrong number of descs reported\n");
61 : : ret = -ENODEV;
62 : 0 : break;
63 : : }
64 : :
65 : 0 : RTE_LOG(INFO, PMD, "Testing queue %d\n", i);
66 : :
67 : : ret = rte_pmd_bphy_cgx_stop_rxtx(dev_id, i);
68 : : if (ret) {
69 : 0 : RTE_LOG(ERR, PMD, "Failed to stop rx/tx\n");
70 : 0 : break;
71 : : }
72 : :
73 : : ret = rte_pmd_bphy_cgx_start_rxtx(dev_id, i);
74 : : if (ret) {
75 : 0 : RTE_LOG(ERR, PMD, "Failed to start rx/tx\n");
76 : 0 : break;
77 : : }
78 : :
79 : : ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, false);
80 : : if (ret) {
81 : 0 : RTE_LOG(ERR, PMD, "Failed to set link down\n");
82 : 0 : break;
83 : : }
84 : :
85 : 0 : ret = cnxk_bphy_cgx_link_cond(dev_id, i, 0);
86 [ # # ]: 0 : if (ret != 0)
87 : 0 : RTE_LOG(ERR, PMD,
88 : : "Timed out waiting for a link down\n");
89 : :
90 : : ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, true);
91 : : if (ret) {
92 : 0 : RTE_LOG(ERR, PMD, "Failed to set link up\n");
93 : 0 : break;
94 : : }
95 : :
96 : 0 : ret = cnxk_bphy_cgx_link_cond(dev_id, i, 1);
97 [ # # ]: 0 : if (ret != 1)
98 : 0 : RTE_LOG(ERR, PMD, "Timed out waiting for a link up\n");
99 : :
100 : : ret = rte_pmd_bphy_cgx_intlbk_enable(dev_id, i);
101 : : if (ret) {
102 : 0 : RTE_LOG(ERR, PMD, "Failed to enable internal lbk\n");
103 : 0 : break;
104 : : }
105 : :
106 : : ret = rte_pmd_bphy_cgx_intlbk_disable(dev_id, i);
107 : : if (ret) {
108 : 0 : RTE_LOG(ERR, PMD, "Failed to disable internal lbk\n");
109 : 0 : break;
110 : : }
111 : :
112 : : ret = rte_pmd_bphy_cgx_ptp_rx_enable(dev_id, i);
113 : : /* ptp not available on RPM */
114 [ # # ]: 0 : if (ret < 0 && ret != -ENOTSUP) {
115 : 0 : RTE_LOG(ERR, PMD, "Failed to enable ptp\n");
116 : 0 : break;
117 : : }
118 : : ret = 0;
119 : :
120 : : ret = rte_pmd_bphy_cgx_ptp_rx_disable(dev_id, i);
121 : : /* ptp not available on RPM */
122 [ # # ]: 0 : if (ret < 0 && ret != -ENOTSUP) {
123 : 0 : RTE_LOG(ERR, PMD, "Failed to disable ptp\n");
124 : 0 : break;
125 : : }
126 : : ret = 0;
127 : :
128 : : ret = rte_pmd_bphy_cgx_get_supported_fec(dev_id, i, &fec);
129 : : if (ret) {
130 : 0 : RTE_LOG(ERR, PMD, "Failed to get supported FEC\n");
131 : 0 : break;
132 : : }
133 : :
134 : 0 : ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec);
135 : : if (ret) {
136 : 0 : RTE_LOG(ERR, PMD, "Failed to set FEC to %d\n", fec);
137 : 0 : break;
138 : : }
139 : :
140 : 0 : fec = CNXK_BPHY_CGX_ETH_LINK_FEC_NONE;
141 : 0 : ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec);
142 : : if (ret) {
143 : 0 : RTE_LOG(ERR, PMD, "Failed to disable FEC\n");
144 : 0 : break;
145 : : }
146 : : }
147 : :
148 : 0 : rte_rawdev_stop(dev_id);
149 : :
150 : 0 : return ret;
151 : : }
|