1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Private header file for Linux OS Independent Layer 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Portions of this code are copyright (c) 2021 Cypress Semiconductor Corporation 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Copyright (C) 1999-2017, Broadcom Corporation 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 9*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 10*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 11*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 12*4882a593Smuzhiyun * following added to such license: 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 15*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 16*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 17*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 18*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 19*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 20*4882a593Smuzhiyun * modifications of the software. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Notwithstanding the above, under no circumstances may you combine this 23*4882a593Smuzhiyun * software in any way with any other Broadcom software provided under a license 24*4882a593Smuzhiyun * other than the GPL, without Broadcom's express prior written consent. 25*4882a593Smuzhiyun * 26*4882a593Smuzhiyun * 27*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Open:>> 28*4882a593Smuzhiyun * 29*4882a593Smuzhiyun * $Id: linux_osl_priv.h 690260 2017-03-15 09:34:11Z $ 30*4882a593Smuzhiyun */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun #ifndef _LINUX_OSL_PRIV_H_ 33*4882a593Smuzhiyun #define _LINUX_OSL_PRIV_H_ 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define OS_HANDLE_MAGIC 0x1234abcd /* Magic # to recognize osh */ 36*4882a593Smuzhiyun #define BCM_MEM_FILENAME_LEN 24 /* Mem. filename length */ 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* dependancy check */ 39*4882a593Smuzhiyun #if !defined(BCMPCIE) && defined(DHD_USE_STATIC_CTRLBUF) 40*4882a593Smuzhiyun #error "DHD_USE_STATIC_CTRLBUF suppored PCIE target only" 41*4882a593Smuzhiyun #endif /* !BCMPCIE && DHD_USE_STATIC_CTRLBUF */ 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #ifdef CONFIG_DHD_USE_STATIC_BUF 44*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 45*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE (PAGE_SIZE*1) 46*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE (PAGE_SIZE*2) 47*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE (PAGE_SIZE*4) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define PREALLOC_FREE_MAGIC 0xFEDC 50*4882a593Smuzhiyun #define PREALLOC_USED_MAGIC 0xFCDE 51*4882a593Smuzhiyun #else 52*4882a593Smuzhiyun #define DHD_SKB_HDRSIZE 336 53*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE) 54*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE) 55*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE) 56*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define STATIC_BUF_MAX_NUM 16 59*4882a593Smuzhiyun #define STATIC_BUF_SIZE (PAGE_SIZE*2) 60*4882a593Smuzhiyun #define STATIC_BUF_TOTAL_LEN (STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun typedef struct bcm_static_buf { 63*4882a593Smuzhiyun spinlock_t static_lock; 64*4882a593Smuzhiyun unsigned char *buf_ptr; 65*4882a593Smuzhiyun unsigned char buf_use[STATIC_BUF_MAX_NUM]; 66*4882a593Smuzhiyun } bcm_static_buf_t; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun extern bcm_static_buf_t *bcm_static_buf; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 71*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM 0 72*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE 73*4882a593Smuzhiyun #elif defined(ENHANCED_STATIC_BUF) 74*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM 1 75*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE DHD_SKB_4PAGE_BUFSIZE 76*4882a593Smuzhiyun #else 77*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM 0 78*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE 79*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 82*4882a593Smuzhiyun #define STATIC_PKT_1PAGE_NUM 0 83*4882a593Smuzhiyun #define STATIC_PKT_2PAGE_NUM 128 84*4882a593Smuzhiyun #else 85*4882a593Smuzhiyun #define STATIC_PKT_1PAGE_NUM 8 86*4882a593Smuzhiyun #define STATIC_PKT_2PAGE_NUM 8 87*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun #define STATIC_PKT_1_2PAGE_NUM \ 90*4882a593Smuzhiyun ((STATIC_PKT_1PAGE_NUM) + (STATIC_PKT_2PAGE_NUM)) 91*4882a593Smuzhiyun #define STATIC_PKT_MAX_NUM \ 92*4882a593Smuzhiyun ((STATIC_PKT_1_2PAGE_NUM) + (STATIC_PKT_4PAGE_NUM)) 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun typedef struct bcm_static_pkt { 95*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 96*4882a593Smuzhiyun struct sk_buff *skb_8k[STATIC_PKT_2PAGE_NUM]; 97*4882a593Smuzhiyun unsigned char pkt_invalid[STATIC_PKT_2PAGE_NUM]; 98*4882a593Smuzhiyun spinlock_t osl_pkt_lock; 99*4882a593Smuzhiyun uint32 last_allocated_index; 100*4882a593Smuzhiyun #else 101*4882a593Smuzhiyun struct sk_buff *skb_4k[STATIC_PKT_1PAGE_NUM]; 102*4882a593Smuzhiyun struct sk_buff *skb_8k[STATIC_PKT_2PAGE_NUM]; 103*4882a593Smuzhiyun #ifdef ENHANCED_STATIC_BUF 104*4882a593Smuzhiyun struct sk_buff *skb_16k; 105*4882a593Smuzhiyun #endif /* ENHANCED_STATIC_BUF */ 106*4882a593Smuzhiyun struct semaphore osl_pkt_sem; 107*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 108*4882a593Smuzhiyun unsigned char pkt_use[STATIC_PKT_MAX_NUM]; 109*4882a593Smuzhiyun } bcm_static_pkt_t; 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun extern bcm_static_pkt_t *bcm_static_skb; 112*4882a593Smuzhiyun #endif /* CONFIG_DHD_USE_STATIC_BUF */ 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun typedef struct bcm_mem_link { 115*4882a593Smuzhiyun struct bcm_mem_link *prev; 116*4882a593Smuzhiyun struct bcm_mem_link *next; 117*4882a593Smuzhiyun uint size; 118*4882a593Smuzhiyun int line; 119*4882a593Smuzhiyun void *osh; 120*4882a593Smuzhiyun char file[BCM_MEM_FILENAME_LEN]; 121*4882a593Smuzhiyun } bcm_mem_link_t; 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun struct osl_cmn_info { 124*4882a593Smuzhiyun atomic_t malloced; 125*4882a593Smuzhiyun atomic_t pktalloced; /* Number of allocated packet buffers */ 126*4882a593Smuzhiyun spinlock_t dbgmem_lock; 127*4882a593Smuzhiyun bcm_mem_link_t *dbgmem_list; 128*4882a593Smuzhiyun bcm_mem_link_t *dbgvmem_list; 129*4882a593Smuzhiyun spinlock_t pktalloc_lock; 130*4882a593Smuzhiyun atomic_t refcount; /* Number of references to this shared structure. */ 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun typedef struct osl_cmn_info osl_cmn_t; 133*4882a593Smuzhiyun 134*4882a593Smuzhiyun #if defined(BCM_BACKPLANE_TIMEOUT) 135*4882a593Smuzhiyun typedef uint32 (*bpt_cb_fn)(void *ctx, void *addr); 136*4882a593Smuzhiyun #endif /* BCM_BACKPLANE_TIMEOUT */ 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun struct osl_info { 139*4882a593Smuzhiyun osl_pubinfo_t pub; 140*4882a593Smuzhiyun uint32 flags; /* If specific cases to be handled in the OSL */ 141*4882a593Smuzhiyun uint magic; 142*4882a593Smuzhiyun void *pdev; 143*4882a593Smuzhiyun uint failed; 144*4882a593Smuzhiyun uint bustype; 145*4882a593Smuzhiyun osl_cmn_t *cmn; /* Common OSL related data shred between two OSH's */ 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun void *bus_handle; 148*4882a593Smuzhiyun #ifdef BCM_SECURE_DMA 149*4882a593Smuzhiyun struct sec_mem_elem *sec_list_4096; 150*4882a593Smuzhiyun struct sec_mem_elem *sec_list_base_4096; 151*4882a593Smuzhiyun phys_addr_t contig_base; 152*4882a593Smuzhiyun void *contig_base_va; 153*4882a593Smuzhiyun phys_addr_t contig_base_alloc; 154*4882a593Smuzhiyun void *contig_base_alloc_va; 155*4882a593Smuzhiyun phys_addr_t contig_base_alloc_coherent; 156*4882a593Smuzhiyun void *contig_base_alloc_coherent_va; 157*4882a593Smuzhiyun void *contig_base_coherent_va; 158*4882a593Smuzhiyun void *contig_delta_va_pa; 159*4882a593Smuzhiyun struct { 160*4882a593Smuzhiyun phys_addr_t pa; 161*4882a593Smuzhiyun void *va; 162*4882a593Smuzhiyun bool avail; 163*4882a593Smuzhiyun } sec_cma_coherent[SEC_CMA_COHERENT_MAX]; 164*4882a593Smuzhiyun int stb_ext_params; 165*4882a593Smuzhiyun #endif /* BCM_SECURE_DMA */ 166*4882a593Smuzhiyun #if defined(BCM_BACKPLANE_TIMEOUT) 167*4882a593Smuzhiyun bpt_cb_fn bpt_cb; 168*4882a593Smuzhiyun void *sih; 169*4882a593Smuzhiyun #endif /* BCM_BACKPLANE_TIMEOUT */ 170*4882a593Smuzhiyun #ifdef USE_DMA_LOCK 171*4882a593Smuzhiyun spinlock_t dma_lock; 172*4882a593Smuzhiyun bool dma_lock_bh; 173*4882a593Smuzhiyun #endif /* USE_DMA_LOCK */ 174*4882a593Smuzhiyun #ifdef DHD_MAP_LOGGING 175*4882a593Smuzhiyun void *dhd_map_log; 176*4882a593Smuzhiyun void *dhd_unmap_log; 177*4882a593Smuzhiyun #endif /* DHD_MAP_LOGGING */ 178*4882a593Smuzhiyun }; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #endif /* _LINUX_OSL_PRIV_H_ */ 181