Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C), 2025, Wuxi Stars Micro System Technologies Co., Ltd.
3 : : */
4 : :
5 : : #include <sys/types.h>
6 : : #include <sys/stat.h>
7 : : #include <fcntl.h>
8 : : #include <sys/ioctl.h>
9 : : #include <sys/mman.h>
10 : : #include <unistd.h>
11 : : #include <inttypes.h>
12 : : #include <rte_version.h>
13 : : #include <eal_export.h>
14 : :
15 : : #include "sxe2_osal.h"
16 : : #include "sxe2_common_log.h"
17 : : #include "sxe2_ioctl_chnl.h"
18 : : #include "sxe2_ioctl_chnl_func.h"
19 : :
20 : : #define SXE2_CHR_DEV_NAME "/dev/sxe2-dpdk-"
21 : :
22 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_cmd_close)
23 : : void
24 : 0 : sxe2_drv_cmd_close(struct sxe2_common_device *cdev)
25 : : {
26 : 0 : cdev->config.kernel_reset = true;
27 : 0 : }
28 : :
29 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_cmd_exec)
30 : : int32_t
31 : 0 : sxe2_drv_cmd_exec(struct sxe2_common_device *cdev,
32 : : struct sxe2_drv_cmd_params *cmd_params)
33 : : {
34 : : int32_t cmd_fd;
35 : : int32_t ret = -EIO;
36 : :
37 [ # # ]: 0 : if (cdev->config.kernel_reset) {
38 : : ret = -EPERM;
39 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
40 : 0 : goto l_end;
41 : : }
42 : :
43 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
44 [ # # ]: 0 : if (cmd_fd < 0) {
45 : : ret = -EBADF;
46 : 0 : PMD_LOG_ERR(COM, "Fail to exec cmd, fd[%d] error", cmd_fd);
47 : 0 : goto l_end;
48 : : }
49 : :
50 : 0 : PMD_LOG_DEBUG(COM, "Exec drv cmd fd[%d] trace_id[0x%"PRIx64"]"
51 : : "opcode[0x%x] req_len[%d] resp_len[%d]",
52 : : cmd_fd, cmd_params->trace_id, cmd_params->opcode,
53 : : cmd_params->req_len, cmd_params->resp_len);
54 : :
55 : 0 : pthread_mutex_lock(&cdev->config.lock);
56 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_PASSTHROUGH, cmd_params);
57 [ # # ]: 0 : if (ret < 0) {
58 : 0 : PMD_LOG_ERR(COM, "Fail to exec cmd, fd[%d] opcode[0x%x] ret[%d], err:%s",
59 : : cmd_fd, cmd_params->opcode, ret, strerror(errno));
60 : 0 : ret = -errno;
61 : 0 : pthread_mutex_unlock(&cdev->config.lock);
62 : 0 : goto l_end;
63 : : }
64 : 0 : pthread_mutex_unlock(&cdev->config.lock);
65 : :
66 : 0 : l_end:
67 : 0 : return ret;
68 : : }
69 : :
70 : :
71 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_open)
72 : : int32_t
73 : 0 : sxe2_drv_dev_open(struct sxe2_common_device *cdev, struct rte_pci_device *pci_dev)
74 : : {
75 : : int32_t ret = 0;
76 : : int32_t fd = 0;
77 : 0 : char drv_name[32] = {0};
78 : :
79 : 0 : snprintf(drv_name, sizeof(drv_name),
80 : : "%s%04"PRIx32":%02"PRIx8":%02"PRIx8".%"PRIx8,
81 : : SXE2_CHR_DEV_NAME,
82 : : pci_dev->addr.domain,
83 : 0 : pci_dev->addr.bus,
84 : 0 : pci_dev->addr.devid,
85 : 0 : pci_dev->addr.function);
86 : :
87 : : fd = open(drv_name, O_RDWR);
88 [ # # ]: 0 : if (fd < 0) {
89 : : ret = -EBADF;
90 : 0 : PMD_LOG_ERR(COM, "Fail to open device:%s, ret=%d, err:%s",
91 : : drv_name, ret, strerror(errno));
92 : 0 : goto l_end;
93 : : }
94 : :
95 : 0 : SXE2_CDEV_TO_CMD_FD(cdev) = fd;
96 : :
97 : 0 : PMD_LOG_INFO(COM, "Successfully opened device:%s, fd=%d",
98 : : drv_name, SXE2_CDEV_TO_CMD_FD(cdev));
99 : :
100 : 0 : l_end:
101 : 0 : return ret;
102 : : }
103 : :
104 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_close)
105 : : void
106 : 0 : sxe2_drv_dev_close(struct sxe2_common_device *cdev)
107 : : {
108 : 0 : int32_t fd = SXE2_CDEV_TO_CMD_FD(cdev);
109 : :
110 [ # # ]: 0 : if (fd >= 0)
111 : 0 : close(fd);
112 : 0 : PMD_LOG_INFO(COM, "closed device fd=%d", fd);
113 : 0 : SXE2_CDEV_TO_CMD_FD(cdev) = SXE2_CMD_FD_INVALID;
114 : 0 : }
115 : :
116 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_handshake)
117 : : int32_t
118 : 0 : sxe2_drv_dev_handshake(struct sxe2_common_device *cdev)
119 : : {
120 : : int32_t ret = 0;
121 : : int32_t cmd_fd = 0;
122 : : struct sxe2_ioctl_cmd_common_hdr cmd_params;
123 : :
124 [ # # ]: 0 : if (cdev->config.kernel_reset) {
125 : : ret = -EPERM;
126 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
127 : 0 : goto l_end;
128 : : }
129 : :
130 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
131 [ # # ]: 0 : if (cmd_fd < 0) {
132 : : ret = -EBADF;
133 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
134 : 0 : goto l_end;
135 : : }
136 : :
137 : 0 : PMD_LOG_DEBUG(COM, "Open fd=%d to handshake with kernel", cmd_fd);
138 : :
139 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_cmd_common_hdr));
140 : 0 : cmd_params.dpdk_ver = SXE2_COM_VER;
141 : 0 : cmd_params.msg_len = sizeof(struct sxe2_ioctl_cmd_common_hdr);
142 : :
143 : 0 : pthread_mutex_lock(&cdev->config.lock);
144 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_HANDSHAKE, &cmd_params);
145 [ # # ]: 0 : if (ret < 0) {
146 : 0 : PMD_LOG_ERR(COM, "Failed to handshake, fd=%d, ret=%d, err:%s",
147 : : cmd_fd, ret, strerror(errno));
148 : : ret = -EIO;
149 : 0 : pthread_mutex_unlock(&cdev->config.lock);
150 : 0 : goto l_end;
151 : : }
152 : 0 : pthread_mutex_unlock(&cdev->config.lock);
153 : :
154 [ # # ]: 0 : if (cmd_params.cap & RTE_BIT32(SXE2_COM_CAP_IOMMU_MAP))
155 : 0 : cdev->config.support_iommu = true;
156 : : else
157 : 0 : cdev->config.support_iommu = false;
158 : :
159 : 0 : l_end:
160 : 0 : return ret;
161 : : }
162 : :
163 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_rxq_irq_set)
164 : : int32_t
165 : 0 : sxe2_drv_dev_rxq_irq_set(struct sxe2_common_device *cdev,
166 : : uint16_t base_irq, int32_t *efd, uint16_t nb_irq)
167 : : {
168 : : struct sxe2_ioctl_irq_set cmd_params;
169 : : int32_t ret = 0;
170 : : int32_t cmd_fd = 0;
171 : :
172 [ # # ]: 0 : if (cdev->config.kernel_reset) {
173 : : ret = -EPERM;
174 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
175 : 0 : goto l_end;
176 : : }
177 : :
178 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
179 [ # # ]: 0 : if (cmd_fd < 0) {
180 : : ret = -EBADF;
181 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
182 : 0 : goto l_end;
183 : : }
184 : :
185 : 0 : PMD_LOG_DEBUG(COM, "Open fd=%d to set rxq irq, base_queue=%d, efds=%p, nb_irq=%d",
186 : : cmd_fd, base_irq, efd, nb_irq);
187 : :
188 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_irq_set));
189 : 0 : cmd_params.base_irq_in_com = base_irq;
190 : 0 : cmd_params.cnt = nb_irq;
191 : 0 : cmd_params.event_fd = efd;
192 : :
193 : 0 : pthread_mutex_lock(&cdev->config.lock);
194 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_IO_IRQS_REQ, &cmd_params);
195 [ # # ]: 0 : if (ret < 0) {
196 : 0 : PMD_LOG_ERR(COM, "Failed to set io irqs, fd=%d, ret=%d, err:%s",
197 : : cmd_fd, ret, strerror(errno));
198 : 0 : pthread_mutex_unlock(&cdev->config.lock);
199 : 0 : goto l_end;
200 : : }
201 : 0 : pthread_mutex_unlock(&cdev->config.lock);
202 : :
203 : 0 : l_end:
204 : 0 : return ret;
205 : : }
206 : :
207 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_other_irq_set)
208 : : int32_t
209 : 0 : sxe2_drv_dev_other_irq_set(struct sxe2_common_device *cdev,
210 : : int32_t efd, uint64_t event)
211 : : {
212 : : int32_t ret = 0;
213 : : int32_t cmd_fd = 0;
214 : : struct sxe2_ioctl_other_evt_set cmd_params;
215 : :
216 [ # # ]: 0 : if (cdev->config.kernel_reset) {
217 : : ret = -EPERM;
218 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
219 : 0 : goto l_end;
220 : : }
221 : :
222 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
223 [ # # ]: 0 : if (cmd_fd < 0) {
224 : : ret = -EBADF;
225 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
226 : 0 : goto l_end;
227 : : }
228 : :
229 : 0 : PMD_LOG_DEBUG(COM, "Open fd=%d to set other irq, efd=%d, event=%"PRIu64"",
230 : : cmd_fd, efd, event);
231 : :
232 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_other_evt_set));
233 : 0 : cmd_params.eventfd = efd;
234 : 0 : cmd_params.filter_table = event;
235 : :
236 : 0 : pthread_mutex_lock(&cdev->config.lock);
237 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_EVT_IRQ_REQ, &cmd_params);
238 [ # # ]: 0 : if (ret < 0) {
239 : 0 : PMD_LOG_ERR(COM, "Failed to set others evt, fd=%d, ret=%d, err:%s",
240 : : cmd_fd, ret, strerror(errno));
241 : : ret = -EIO;
242 : 0 : pthread_mutex_unlock(&cdev->config.lock);
243 : 0 : goto l_end;
244 : : }
245 : 0 : pthread_mutex_unlock(&cdev->config.lock);
246 : :
247 : 0 : l_end:
248 : 0 : return ret;
249 : : }
250 : :
251 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_other_irq_get)
252 : : int32_t
253 : 0 : sxe2_drv_dev_other_irq_get(struct sxe2_common_device *cdev, uint64_t *event)
254 : : {
255 : : int32_t ret = 0;
256 : : int32_t cmd_fd = 0;
257 : : struct sxe2_ioctl_other_evt_get cmd_params;
258 : :
259 [ # # ]: 0 : if (cdev->config.kernel_reset) {
260 : : ret = -EPERM;
261 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
262 : 0 : goto l_end;
263 : : }
264 : :
265 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
266 [ # # ]: 0 : if (cmd_fd < 0) {
267 : : ret = -EBADF;
268 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
269 : 0 : goto l_end;
270 : : }
271 : :
272 : 0 : PMD_LOG_DEBUG(COM, "Open fd=%d to get other irq", cmd_fd);
273 : :
274 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_other_evt_get));
275 : :
276 : 0 : pthread_mutex_lock(&cdev->config.lock);
277 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_EVT_CAUSE_GET, &cmd_params);
278 [ # # ]: 0 : if (ret < 0) {
279 : 0 : PMD_LOG_ERR(COM, "Failed to set others evt, fd=%d, ret=%d, err:%s",
280 : : cmd_fd, ret, strerror(errno));
281 : : ret = -EIO;
282 : 0 : pthread_mutex_unlock(&cdev->config.lock);
283 : 0 : goto l_end;
284 : : }
285 : 0 : pthread_mutex_unlock(&cdev->config.lock);
286 : 0 : *event = cmd_params.evt_cause;
287 : :
288 : 0 : l_end:
289 : 0 : return ret;
290 : : }
291 : :
292 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_reset_irq_set)
293 : : int32_t
294 : 0 : sxe2_drv_dev_reset_irq_set(struct sxe2_common_device *cdev, int32_t efd)
295 : : {
296 : : int32_t ret = 0;
297 : : int32_t cmd_fd = 0;
298 : : struct sxe2_ioctl_reset_sub_set cmd_params;
299 : :
300 [ # # ]: 0 : if (cdev->config.kernel_reset) {
301 : : ret = -EPERM;
302 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
303 : 0 : goto l_end;
304 : : }
305 : :
306 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
307 [ # # ]: 0 : if (cmd_fd < 0) {
308 : : ret = -EBADF;
309 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
310 : 0 : goto l_end;
311 : : }
312 : :
313 : 0 : PMD_LOG_DEBUG(COM, "Open fd=%d to set reset irq, efd=%d",
314 : : cmd_fd, efd);
315 : :
316 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_reset_sub_set));
317 : 0 : cmd_params.eventfd = efd;
318 : :
319 : 0 : pthread_mutex_lock(&cdev->config.lock);
320 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_RST_IRQ_REQ, &cmd_params);
321 [ # # ]: 0 : if (ret < 0) {
322 : 0 : PMD_LOG_ERR(COM, "Failed to set reset irqs, fd=%d, ret=%d, err:%s",
323 : : cmd_fd, ret, strerror(errno));
324 : : ret = -EIO;
325 : 0 : pthread_mutex_unlock(&cdev->config.lock);
326 : 0 : goto l_end;
327 : : }
328 : 0 : pthread_mutex_unlock(&cdev->config.lock);
329 : :
330 : 0 : l_end:
331 : 0 : return ret;
332 : : }
333 : :
334 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_mmap)
335 : : void
336 : 0 : *sxe2_drv_dev_mmap(struct sxe2_common_device *cdev, uint8_t bar_idx, uint64_t len, uint64_t offset)
337 : : {
338 : : int32_t cmd_fd = 0;
339 : : void *virt = NULL;
340 : :
341 [ # # ]: 0 : if (cdev->config.kernel_reset) {
342 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
343 : 0 : goto l_err;
344 : : }
345 : :
346 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
347 [ # # ]: 0 : if (cmd_fd < 0) {
348 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
349 : 0 : goto l_err;
350 : : }
351 : :
352 : 0 : PMD_LOG_DEBUG(COM, "fd=%d, bar idx=%d, len=%"PRIu64", src=0x%"PRIx64", offset=0x%"PRIx64"",
353 : : bar_idx, cmd_fd, len, offset, SXE2_COM_PCI_OFFSET_GEN(bar_idx, offset));
354 : :
355 : 0 : virt = mmap(NULL, len, PROT_READ | PROT_WRITE,
356 : : MAP_SHARED, cmd_fd, SXE2_COM_PCI_OFFSET_GEN(bar_idx, offset));
357 [ # # ]: 0 : if (virt == MAP_FAILED) {
358 : 0 : PMD_LOG_ERR(COM, "Failed mmap, cmd_fd=%d, len=%"PRIu64", offset=0x%"PRIx64", err:%s",
359 : : cmd_fd, len, offset, strerror(errno));
360 : 0 : goto l_err;
361 : : }
362 : :
363 : : return virt;
364 : : l_err:
365 : : return NULL;
366 : : }
367 : :
368 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_munmap)
369 : : int32_t
370 : 0 : sxe2_drv_dev_munmap(struct sxe2_common_device *cdev, void *virt, uint64_t len)
371 : : {
372 : : int32_t ret = 0;
373 : :
374 [ # # ]: 0 : if (cdev->config.kernel_reset) {
375 : : ret = -EPERM;
376 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
377 : 0 : goto l_end;
378 : : }
379 : :
380 : 0 : PMD_LOG_DEBUG(COM, "Munmap virt=%p, len=0x%"PRIx64"",
381 : : virt, len);
382 : :
383 : 0 : ret = munmap(virt, len);
384 [ # # ]: 0 : if (ret < 0) {
385 : 0 : PMD_LOG_ERR(COM, "Failed to munmap, virt=%p, len=%"PRIu64", err:%s",
386 : : virt, len, strerror(errno));
387 : 0 : ret = -errno;
388 : 0 : goto l_end;
389 : : }
390 : :
391 : 0 : l_end:
392 : 0 : return ret;
393 : : }
394 : :
395 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_dma_map)
396 : : int32_t
397 : 0 : sxe2_drv_dev_dma_map(struct sxe2_common_device *cdev, uint64_t vaddr,
398 : : uint64_t iova, uint64_t size)
399 : : {
400 : : struct sxe2_ioctl_iommu_dma_map cmd_params;
401 : : enum rte_iova_mode iova_mode;
402 : : int32_t ret = 0;
403 : : int32_t cmd_fd = 0;
404 : :
405 [ # # ]: 0 : if (cdev->config.kernel_reset) {
406 : : ret = -EPERM;
407 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
408 : 0 : goto l_end;
409 : : }
410 : :
411 : 0 : iova_mode = rte_eal_iova_mode();
412 [ # # ]: 0 : if (iova_mode == RTE_IOVA_PA) {
413 [ # # ]: 0 : if (cdev->config.support_iommu) {
414 : 0 : PMD_LOG_ERR(COM, "iommu not support pa mode");
415 : : ret = -EIO;
416 : : }
417 : 0 : goto l_end;
418 [ # # ]: 0 : } else if (iova_mode == RTE_IOVA_VA) {
419 [ # # ]: 0 : if (!cdev->config.support_iommu) {
420 : 0 : PMD_LOG_ERR(COM, "no iommu not support va mode, please use pa mode.");
421 : : ret = -EIO;
422 : 0 : goto l_end;
423 : : }
424 : : }
425 : :
426 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
427 [ # # ]: 0 : if (cmd_fd < 0) {
428 : : ret = -EBADF;
429 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
430 : 0 : goto l_end;
431 : : }
432 : :
433 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_iommu_dma_map));
434 : 0 : cmd_params.vaddr = vaddr;
435 : 0 : cmd_params.iova = iova;
436 : 0 : cmd_params.size = size;
437 : :
438 : 0 : pthread_mutex_lock(&cdev->config.lock);
439 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_DMA_MAP, &cmd_params);
440 [ # # ]: 0 : if (ret < 0) {
441 : 0 : PMD_LOG_ERR(COM, "Failed to dma map, fd=%d, ret=%d, err:%s",
442 : : cmd_fd, ret, strerror(errno));
443 : : ret = -EIO;
444 : 0 : pthread_mutex_unlock(&cdev->config.lock);
445 : 0 : goto l_end;
446 : : }
447 : 0 : pthread_mutex_unlock(&cdev->config.lock);
448 : :
449 : 0 : l_end:
450 : 0 : return ret;
451 : : }
452 : :
453 : : RTE_EXPORT_INTERNAL_SYMBOL(sxe2_drv_dev_dma_unmap)
454 : : int32_t
455 : 0 : sxe2_drv_dev_dma_unmap(struct sxe2_common_device *cdev, uint64_t iova)
456 : : {
457 : : int32_t ret = 0;
458 : : int32_t cmd_fd = 0;
459 : : struct sxe2_ioctl_iommu_dma_unmap cmd_params;
460 : :
461 [ # # ]: 0 : if (cdev->config.kernel_reset) {
462 : : ret = -EPERM;
463 : 0 : PMD_LOG_WARN(COM, "kernel reset, need restart app.");
464 : 0 : goto l_end;
465 : : }
466 : :
467 [ # # ]: 0 : if (!cdev->config.support_iommu)
468 : 0 : goto l_end;
469 : :
470 : 0 : cmd_fd = SXE2_CDEV_TO_CMD_FD(cdev);
471 [ # # ]: 0 : if (cmd_fd < 0) {
472 : : ret = -EBADF;
473 : 0 : PMD_LOG_ERR(COM, "Failed to exec cmd, fd=%d", cmd_fd);
474 : 0 : goto l_end;
475 : : }
476 : :
477 : 0 : PMD_LOG_DEBUG(COM, "fd %d dma unmap iova=0x%"PRIX64"",
478 : : cmd_fd, iova);
479 : :
480 : : memset(&cmd_params, 0, sizeof(struct sxe2_ioctl_iommu_dma_unmap));
481 : 0 : cmd_params.iova = iova;
482 : :
483 : 0 : pthread_mutex_lock(&cdev->config.lock);
484 : 0 : ret = ioctl(cmd_fd, SXE2_COM_CMD_DMA_UNMAP, &cmd_params);
485 [ # # ]: 0 : if (ret < 0) {
486 : 0 : PMD_LOG_INFO(COM, "Failed to dma unmap, fd=%d, ret=%d, err:%s",
487 : : cmd_fd, ret, strerror(errno));
488 : : ret = -EIO;
489 : 0 : pthread_mutex_unlock(&cdev->config.lock);
490 : 0 : goto l_end;
491 : : }
492 : 0 : pthread_mutex_unlock(&cdev->config.lock);
493 : :
494 : 0 : l_end:
495 : 0 : return ret;
496 : : }
|