hc
2024-05-08 f309769f8af08599af39b6de4f675784ce76530d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/******************************************************************************
 *
 * Copyright(c) 2019 -  Realtek Corporation.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 *****************************************************************************/
#include "drv_types.h"
 
void pci_cache_wback(struct pci_dev *hwdev,
           dma_addr_t *bus_addr, size_t size, int direction)
{
   if (NULL != hwdev && NULL != bus_addr)
         pci_dma_sync_single_for_device(hwdev, *bus_addr, size,
                   direction);
   else
       RTW_ERR("pcie hwdev handle or bus addr is NULL!\n");
}
void pci_cache_inv(struct pci_dev *hwdev,
           dma_addr_t *bus_addr, size_t size, int direction)
{
   if (NULL != hwdev && NULL != bus_addr)
       pci_dma_sync_single_for_cpu(hwdev, *bus_addr, size, direction);
   else
       RTW_ERR("pcie hwdev handle or bus addr is NULL!\n");
}
void pci_get_bus_addr(struct pci_dev *hwdev,
           void *vir_addr, dma_addr_t *bus_addr,
           size_t size, int direction)
{
   if (NULL != hwdev) {
       *bus_addr = pci_map_single(hwdev, vir_addr, size, direction);
   } else {
       RTW_ERR("pcie hwdev handle is NULL!\n");
       *bus_addr = (dma_addr_t)virt_to_phys(vir_addr);
       /*RTW_ERR("Get bus_addr: %x by virt_to_phys()\n", bus_addr);*/
   }
}
void pci_unmap_bus_addr(struct pci_dev *hwdev,
           dma_addr_t *bus_addr, size_t size, int direction)
{
   if (NULL != hwdev && NULL != bus_addr)
       pci_unmap_single(hwdev, *bus_addr, size, direction);
   else
       RTW_ERR("pcie hwdev handle or bus addr is NULL!\n");
}
void *pci_alloc_cache_mem(struct pci_dev *pdev,
           dma_addr_t *bus_addr, size_t size, int direction)
{
   void *vir_addr = NULL;
 
   vir_addr = rtw_zmalloc(size);
 
   if (!vir_addr)
       bus_addr = NULL;
   else
       pci_get_bus_addr(pdev, vir_addr, bus_addr, size, direction);
 
   return vir_addr;
}
void *pci_alloc_noncache_mem(struct pci_dev *pdev,
           dma_addr_t *bus_addr, size_t size)
{
   void *vir_addr = NULL;
 
   if (NULL != pdev)
       vir_addr = dma_alloc_coherent(&pdev->dev,
               size, bus_addr,
               (in_atomic() ? GFP_ATOMIC : GFP_KERNEL));
   if (!vir_addr)
       bus_addr = NULL;
   else
       bus_addr = (dma_addr_t *)((((SIZE_PTR)bus_addr + 3) / 4) * 4);
 
   return vir_addr;
}
void pci_free_cache_mem(struct pci_dev *pdev,
       void *vir_addr, dma_addr_t *bus_addr,
       size_t size, int direction)
{
   pci_unmap_bus_addr(pdev, bus_addr, size, direction);
   rtw_mfree(vir_addr, size);
 
   vir_addr = NULL;
}
void pci_free_noncache_mem(struct pci_dev *pdev,
       void *vir_addr, dma_addr_t *bus_addr, size_t size)
{
   if (NULL != pdev)
       pci_free_consistent(pdev, size, vir_addr, *bus_addr);
   vir_addr = NULL;
}