net/hns3: refactor multi-process initialization
[dpdk.git] / drivers / raw / cnxk_bphy / cnxk_bphy_cgx_test.c
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 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                 ret = rte_pmd_bphy_cgx_get_link_info(dev_id, queue, &link_info);
22                 if (ret)
23                         return ret;
24
25                 if (link_info.link_up == cond)
26                         break;
27
28                 rte_delay_ms(500);
29         } while (--tries);
30
31         if (tries)
32                 return !!cond;
33
34         return -ETIMEDOUT;
35 }
36
37 int
38 cnxk_bphy_cgx_dev_selftest(uint16_t dev_id)
39 {
40         unsigned int queues, i;
41         int ret;
42
43         queues = rte_rawdev_queue_count(dev_id);
44         if (queues == 0)
45                 return -ENODEV;
46
47         ret = rte_rawdev_start(dev_id);
48         if (ret)
49                 return ret;
50
51         for (i = 0; i < queues; i++) {
52                 enum cnxk_bphy_cgx_eth_link_fec fec;
53                 unsigned int descs;
54
55                 ret = rte_rawdev_queue_conf_get(dev_id, i, &descs,
56                                                 sizeof(descs));
57                 if (ret)
58                         break;
59                 if (descs != 1) {
60                         RTE_LOG(ERR, PMD, "Wrong number of descs reported\n");
61                         ret = -ENODEV;
62                         break;
63                 }
64
65                 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                         RTE_LOG(ERR, PMD, "Failed to stop rx/tx\n");
70                         break;
71                 }
72
73                 ret = rte_pmd_bphy_cgx_start_rxtx(dev_id, i);
74                 if (ret) {
75                         RTE_LOG(ERR, PMD, "Failed to start rx/tx\n");
76                         break;
77                 }
78
79                 ret = rte_pmd_bphy_cgx_set_link_state(dev_id, i, false);
80                 if (ret) {
81                         RTE_LOG(ERR, PMD, "Failed to set link down\n");
82                         break;
83                 }
84
85                 ret = cnxk_bphy_cgx_link_cond(dev_id, i, 0);
86                 if (ret != 0)
87                         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                         RTE_LOG(ERR, PMD, "Failed to set link up\n");
93                         break;
94                 }
95
96                 ret = cnxk_bphy_cgx_link_cond(dev_id, i, 1);
97                 if (ret != 1)
98                         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                         RTE_LOG(ERR, PMD, "Failed to enable internal lbk\n");
103                         break;
104                 }
105
106                 ret = rte_pmd_bphy_cgx_intlbk_disable(dev_id, i);
107                 if (ret) {
108                         RTE_LOG(ERR, PMD, "Failed to disable internal lbk\n");
109                         break;
110                 }
111
112                 ret = rte_pmd_bphy_cgx_ptp_rx_enable(dev_id, i);
113                 /* ptp not available on RPM */
114                 if (ret < 0 && ret != -ENOTSUP) {
115                         RTE_LOG(ERR, PMD, "Failed to enable ptp\n");
116                         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                 if (ret < 0 && ret != -ENOTSUP) {
123                         RTE_LOG(ERR, PMD, "Failed to disable ptp\n");
124                         break;
125                 }
126                 ret = 0;
127
128                 ret = rte_pmd_bphy_cgx_get_supported_fec(dev_id, i, &fec);
129                 if (ret) {
130                         RTE_LOG(ERR, PMD, "Failed to get supported FEC\n");
131                         break;
132                 }
133
134                 ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec);
135                 if (ret) {
136                         RTE_LOG(ERR, PMD, "Failed to set FEC to %d\n", fec);
137                         break;
138                 }
139
140                 fec = CNXK_BPHY_CGX_ETH_LINK_FEC_NONE;
141                 ret = rte_pmd_bphy_cgx_set_fec(dev_id, i, fec);
142                 if (ret) {
143                         RTE_LOG(ERR, PMD, "Failed to disable FEC\n");
144                         break;
145                 }
146         }
147
148         rte_rawdev_stop(dev_id);
149
150         return ret;
151 }