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 : 0 : struct cnxk_bphy_cgx_msg_set_link_state link_state = { };
41 : : unsigned int queues, i;
42 : : int ret;
43 : :
44 : 0 : queues = rte_rawdev_queue_count(dev_id);
45 [ # # ]: 0 : if (queues == 0)
46 : : return -ENODEV;
47 : :
48 : 0 : ret = rte_rawdev_start(dev_id);
49 [ # # ]: 0 : if (ret)
50 : : return ret;
51 : :
52 [ # # ]: 0 : for (i = 0; i < queues; i++) {
53 : : enum cnxk_bphy_cgx_eth_link_fec fec;
54 : : unsigned int descs;
55 : :
56 : 0 : ret = rte_rawdev_queue_conf_get(dev_id, i, &descs,
57 : : sizeof(descs));
58 [ # # ]: 0 : if (ret)
59 : : break;
60 [ # # ]: 0 : if (descs != 1) {
61 : 0 : CNXK_BPHY_LOG(ERR, "Wrong number of descs reported");
62 : : ret = -ENODEV;
63 : 0 : break;
64 : : }
65 : :
66 : 0 : CNXK_BPHY_LOG(INFO, "Testing queue %d", i);
67 : :
68 : : ret = rte_pmd_bphy_cgx_stop_rxtx(dev_id, i);
69 : : if (ret) {
70 : 0 : CNXK_BPHY_LOG(ERR, "Failed to stop rx/tx");
71 : 0 : break;
72 : : }
73 : :
74 : : ret = rte_pmd_bphy_cgx_start_rxtx(dev_id, i);
75 : : if (ret) {
76 : 0 : CNXK_BPHY_LOG(ERR, "Failed to start rx/tx");
77 : 0 : break;
78 : : }
79 : :
80 : 0 : link_state.state = false;
81 : : ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, &link_state);
82 : : if (ret) {
83 : 0 : CNXK_BPHY_LOG(ERR, "Failed to set link down");
84 : 0 : break;
85 : : }
86 : :
87 : 0 : ret = cnxk_bphy_cgx_link_cond(dev_id, i, 0);
88 [ # # ]: 0 : if (ret != 0)
89 : 0 : CNXK_BPHY_LOG(ERR, "Timed out waiting for a link down");
90 : :
91 : 0 : link_state.state = true;
92 : 0 : link_state.timeout = 1500;
93 : 0 : link_state.rx_tx_dis = true;
94 : : ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, &link_state);
95 : : if (ret) {
96 : 0 : CNXK_BPHY_LOG(ERR, "Failed to set link up");
97 : 0 : break;
98 : : }
99 : :
100 : 0 : ret = cnxk_bphy_cgx_link_cond(dev_id, i, 1);
101 [ # # ]: 0 : if (ret != 1)
102 : 0 : CNXK_BPHY_LOG(ERR, "Timed out waiting for a link up");
103 : :
104 : : ret = rte_pmd_bphy_cgx_intlbk_enable(dev_id, i);
105 : : if (ret) {
106 : 0 : CNXK_BPHY_LOG(ERR, "Failed to enable internal lbk");
107 : 0 : break;
108 : : }
109 : :
110 : : ret = rte_pmd_bphy_cgx_intlbk_disable(dev_id, i);
111 : : if (ret) {
112 : 0 : CNXK_BPHY_LOG(ERR, "Failed to disable internal lbk");
113 : 0 : break;
114 : : }
115 : :
116 : : ret = rte_pmd_bphy_cgx_ptp_rx_enable(dev_id, i);
117 : : /* ptp not available on RPM */
118 [ # # ]: 0 : if (ret < 0 && ret != -ENOTSUP) {
119 : 0 : CNXK_BPHY_LOG(ERR, "Failed to enable ptp");
120 : 0 : break;
121 : : }
122 : : ret = 0;
123 : :
124 : : ret = rte_pmd_bphy_cgx_ptp_rx_disable(dev_id, i);
125 : : /* ptp not available on RPM */
126 [ # # ]: 0 : if (ret < 0 && ret != -ENOTSUP) {
127 : 0 : CNXK_BPHY_LOG(ERR, "Failed to disable ptp");
128 : 0 : break;
129 : : }
130 : : ret = 0;
131 : :
132 : : ret = rte_pmd_bphy_cgx_get_supported_fec(dev_id, i, &fec);
133 : : if (ret) {
134 : 0 : CNXK_BPHY_LOG(ERR, "Failed to get supported FEC");
135 : 0 : break;
136 : : }
137 : :
138 : 0 : ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec);
139 : : if (ret) {
140 : 0 : CNXK_BPHY_LOG(ERR, "Failed to set FEC to %d", fec);
141 : 0 : break;
142 : : }
143 : :
144 : 0 : fec = CNXK_BPHY_CGX_ETH_LINK_FEC_NONE;
145 : 0 : ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec);
146 : : if (ret) {
147 : 0 : CNXK_BPHY_LOG(ERR, "Failed to disable FEC");
148 : 0 : break;
149 : : }
150 : : }
151 : :
152 : 0 : rte_rawdev_stop(dev_id);
153 : :
154 : 0 : return ret;
155 : : }
|