net/hns3: fix queue state when concurrent with reset
[dpdk.git] / drivers / net / dpaa / fmlib / fm_vsp.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2019-2020 NXP
3  */
4
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <fcntl.h>
9 #include <errno.h>
10 #include <unistd.h>
11 #include <termios.h>
12 #include <sys/ioctl.h>
13 #include <stdbool.h>
14
15 #include <rte_common.h>
16 #include "fm_ext.h"
17 #include "fm_pcd_ext.h"
18 #include "fm_port_ext.h"
19 #include "fm_vsp_ext.h"
20 #include <dpaa_ethdev.h>
21
22 uint32_t
23 fm_port_vsp_alloc(t_handle h_fm_port,
24                   t_fm_port_vspalloc_params *p_params)
25 {
26         t_device *p_dev = (t_device *)h_fm_port;
27         ioc_fm_port_vsp_alloc_params_t params;
28
29         _fml_dbg("Calling...\n");
30         memset(&params, 0, sizeof(ioc_fm_port_vsp_alloc_params_t));
31         memcpy(&params.params, p_params, sizeof(t_fm_port_vspalloc_params));
32
33         if (ioctl(p_dev->fd, FM_PORT_IOC_VSP_ALLOC, &params))
34                 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
35
36         _fml_dbg("Called.\n");
37
38         return E_OK;
39 }
40
41 t_handle
42 fm_vsp_config(t_fm_vsp_params *p_fm_vsp_params)
43 {
44         t_device *p_dev = NULL;
45         t_device *p_vsp_dev = NULL;
46         ioc_fm_vsp_params_t param;
47
48         p_dev = p_fm_vsp_params->h_fm;
49
50         _fml_dbg("Performing VSP Configuration...\n");
51
52         memset(&param, 0, sizeof(ioc_fm_vsp_params_t));
53         memcpy(&param, p_fm_vsp_params, sizeof(t_fm_vsp_params));
54         param.vsp_params.h_fm = UINT_TO_PTR(p_dev->id);
55         param.id = NULL;
56
57         if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG, &param)) {
58                 DPAA_PMD_ERR("%s ioctl error\n", __func__);
59                 return NULL;
60         }
61
62         p_vsp_dev = (t_device *)malloc(sizeof(t_device));
63         if (!p_vsp_dev) {
64                 DPAA_PMD_ERR("FM VSP Params!\n");
65                 return NULL;
66         }
67         memset(p_vsp_dev, 0, sizeof(t_device));
68         p_vsp_dev->h_user_priv = (t_handle)p_dev;
69         p_dev->owners++;
70         p_vsp_dev->id = PTR_TO_UINT(param.id);
71
72         _fml_dbg("VSP Configuration completed\n");
73
74         return (t_handle)p_vsp_dev;
75 }
76
77 uint32_t
78 fm_vsp_init(t_handle h_fm_vsp)
79 {
80         t_device *p_dev = NULL;
81         t_device *p_vsp_dev = (t_device *)h_fm_vsp;
82         ioc_fm_obj_t id;
83
84         _fml_dbg("Calling...\n");
85
86         p_dev = (t_device *)p_vsp_dev->h_user_priv;
87         id.obj = UINT_TO_PTR(p_vsp_dev->id);
88
89         if (ioctl(p_dev->fd, FM_IOC_VSP_INIT, &id)) {
90                 DPAA_PMD_ERR("%s ioctl error\n", __func__);
91                 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
92         }
93
94         _fml_dbg("Called.\n");
95
96         return E_OK;
97 }
98
99 uint32_t
100 fm_vsp_free(t_handle h_fm_vsp)
101 {
102         t_device *p_dev = NULL;
103         t_device *p_vsp_dev = (t_device *)h_fm_vsp;
104         ioc_fm_obj_t id;
105
106         _fml_dbg("Calling...\n");
107
108         p_dev = (t_device *)p_vsp_dev->h_user_priv;
109         id.obj = UINT_TO_PTR(p_vsp_dev->id);
110
111         if (ioctl(p_dev->fd, FM_IOC_VSP_FREE, &id)) {
112                 DPAA_PMD_ERR("%s ioctl error\n", __func__);
113                 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
114         }
115
116         p_dev->owners--;
117         free(p_vsp_dev);
118
119         _fml_dbg("Called.\n");
120
121         return E_OK;
122 }
123
124 uint32_t
125 fm_vsp_config_buffer_prefix_content(t_handle h_fm_vsp,
126                 t_fm_buffer_prefix_content *p_fm_buffer_prefix_content)
127 {
128         t_device *p_dev = NULL;
129         t_device *p_vsp_dev = (t_device *)h_fm_vsp;
130         ioc_fm_buffer_prefix_content_params_t params;
131
132         _fml_dbg("Calling...\n");
133
134         p_dev = (t_device *)p_vsp_dev->h_user_priv;
135         params.p_fm_vsp = UINT_TO_PTR(p_vsp_dev->id);
136         memcpy(&params.fm_buffer_prefix_content,
137                p_fm_buffer_prefix_content, sizeof(*p_fm_buffer_prefix_content));
138
139         if (ioctl(p_dev->fd, FM_IOC_VSP_CONFIG_BUFFER_PREFIX_CONTENT,
140                   &params)) {
141                 DPAA_PMD_ERR("%s ioctl error\n", __func__);
142                 RETURN_ERROR(MINOR, E_INVALID_OPERATION, NO_MSG);
143         }
144
145         _fml_dbg("Called.\n");
146
147         return E_OK;
148 }