1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Private header file for Linux OS Independent Layer 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2020, Broadcom. 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Unless you and Broadcom execute a separate written software license 7*4882a593Smuzhiyun * agreement governing use of this software, this software is licensed to you 8*4882a593Smuzhiyun * under the terms of the GNU General Public License version 2 (the "GPL"), 9*4882a593Smuzhiyun * available at http://www.broadcom.com/licenses/GPLv2.php, with the 10*4882a593Smuzhiyun * following added to such license: 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * As a special exception, the copyright holders of this software give you 13*4882a593Smuzhiyun * permission to link this software with independent modules, and to copy and 14*4882a593Smuzhiyun * distribute the resulting executable under terms of your choice, provided that 15*4882a593Smuzhiyun * you also meet, for each linked independent module, the terms and conditions of 16*4882a593Smuzhiyun * the license of that module. An independent module is a module which is not 17*4882a593Smuzhiyun * derived from this software. The special exception does not apply to any 18*4882a593Smuzhiyun * modifications of the software. 19*4882a593Smuzhiyun * 20*4882a593Smuzhiyun * 21*4882a593Smuzhiyun * <<Broadcom-WL-IPTag/Dual:>> 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun #ifndef _LINUX_OSL_PRIV_H_ 25*4882a593Smuzhiyun #define _LINUX_OSL_PRIV_H_ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #include <osl.h> 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun #define OS_HANDLE_MAGIC 0x1234abcd /* Magic # to recognize osh */ 30*4882a593Smuzhiyun #define BCM_MEM_FILENAME_LEN 24 /* Mem. filename length */ 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun /* dependancy check */ 33*4882a593Smuzhiyun #if !defined(BCMPCIE) && defined(DHD_USE_STATIC_CTRLBUF) 34*4882a593Smuzhiyun #error "DHD_USE_STATIC_CTRLBUF suppored PCIE target only" 35*4882a593Smuzhiyun #endif /* !BCMPCIE && DHD_USE_STATIC_CTRLBUF */ 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define OSL_MEMLIST_LOCK(lock, flags) (flags) = osl_spin_lock(lock) 38*4882a593Smuzhiyun #define OSL_MEMLIST_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags)) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define OSL_STATIC_BUF_LOCK(lock, flags) (flags) = osl_spin_lock(lock) 41*4882a593Smuzhiyun #define OSL_STATIC_BUF_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags)) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define OSL_STATIC_PKT_LOCK(lock, flags) (flags) = osl_spin_lock(lock) 44*4882a593Smuzhiyun #define OSL_STATIC_PKT_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags)) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define OSL_PKTLIST_LOCK(lock, flags) (flags) = osl_spin_lock(lock) 47*4882a593Smuzhiyun #define OSL_PKTLIST_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags)) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define OSL_CTRACE_LOCK(lock, flags) (flags) = osl_spin_lock(lock) 50*4882a593Smuzhiyun #define OSL_CTRACE_UNLOCK(lock, flags) osl_spin_unlock((lock), (flags)) 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #ifdef CONFIG_DHD_USE_STATIC_BUF 53*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 54*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE (PAGE_SIZE*1) 55*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE (PAGE_SIZE*2) 56*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE (PAGE_SIZE*4) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun #define PREALLOC_FREE_MAGIC 0xFEDC 59*4882a593Smuzhiyun #define PREALLOC_USED_MAGIC 0xFCDE 60*4882a593Smuzhiyun #else 61*4882a593Smuzhiyun #define DHD_SKB_HDRSIZE 336 62*4882a593Smuzhiyun #define DHD_SKB_1PAGE_BUFSIZE ((PAGE_SIZE*1)-DHD_SKB_HDRSIZE) 63*4882a593Smuzhiyun #define DHD_SKB_2PAGE_BUFSIZE ((PAGE_SIZE*2)-DHD_SKB_HDRSIZE) 64*4882a593Smuzhiyun #define DHD_SKB_4PAGE_BUFSIZE ((PAGE_SIZE*4)-DHD_SKB_HDRSIZE) 65*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define STATIC_BUF_MAX_NUM 16 68*4882a593Smuzhiyun #define STATIC_BUF_SIZE (PAGE_SIZE*2) 69*4882a593Smuzhiyun #define STATIC_BUF_TOTAL_LEN (STATIC_BUF_MAX_NUM * STATIC_BUF_SIZE) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun typedef struct bcm_static_buf { 72*4882a593Smuzhiyun spinlock_t static_lock; 73*4882a593Smuzhiyun unsigned char *buf_ptr; 74*4882a593Smuzhiyun unsigned char buf_use[STATIC_BUF_MAX_NUM]; 75*4882a593Smuzhiyun } bcm_static_buf_t; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun extern bcm_static_buf_t *bcm_static_buf; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 80*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM 0 81*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE 82*4882a593Smuzhiyun #elif defined(ENHANCED_STATIC_BUF) 83*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM 1 84*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE DHD_SKB_4PAGE_BUFSIZE 85*4882a593Smuzhiyun #else 86*4882a593Smuzhiyun #define STATIC_PKT_4PAGE_NUM 0 87*4882a593Smuzhiyun #define DHD_SKB_MAX_BUFSIZE DHD_SKB_2PAGE_BUFSIZE 88*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 91*4882a593Smuzhiyun #define STATIC_PKT_1PAGE_NUM 0 92*4882a593Smuzhiyun /* Should match DHD_SKB_2PAGE_BUF_NUM */ 93*4882a593Smuzhiyun #define STATIC_PKT_2PAGE_NUM 192 94*4882a593Smuzhiyun #else 95*4882a593Smuzhiyun #define STATIC_PKT_1PAGE_NUM 8 96*4882a593Smuzhiyun #define STATIC_PKT_2PAGE_NUM 8 97*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #define STATIC_PKT_1_2PAGE_NUM \ 100*4882a593Smuzhiyun ((STATIC_PKT_1PAGE_NUM) + (STATIC_PKT_2PAGE_NUM)) 101*4882a593Smuzhiyun #define STATIC_PKT_MAX_NUM \ 102*4882a593Smuzhiyun ((STATIC_PKT_1_2PAGE_NUM) + (STATIC_PKT_4PAGE_NUM)) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun typedef struct bcm_static_pkt { 105*4882a593Smuzhiyun #ifdef DHD_USE_STATIC_CTRLBUF 106*4882a593Smuzhiyun struct sk_buff *skb_8k[STATIC_PKT_2PAGE_NUM]; 107*4882a593Smuzhiyun unsigned char pkt_invalid[STATIC_PKT_2PAGE_NUM]; 108*4882a593Smuzhiyun spinlock_t osl_pkt_lock; 109*4882a593Smuzhiyun uint32 last_allocated_index; 110*4882a593Smuzhiyun #else 111*4882a593Smuzhiyun struct sk_buff *skb_4k[STATIC_PKT_1PAGE_NUM]; 112*4882a593Smuzhiyun struct sk_buff *skb_8k[STATIC_PKT_2PAGE_NUM]; 113*4882a593Smuzhiyun #ifdef ENHANCED_STATIC_BUF 114*4882a593Smuzhiyun struct sk_buff *skb_16k; 115*4882a593Smuzhiyun #endif /* ENHANCED_STATIC_BUF */ 116*4882a593Smuzhiyun struct semaphore osl_pkt_sem; 117*4882a593Smuzhiyun #endif /* DHD_USE_STATIC_CTRLBUF */ 118*4882a593Smuzhiyun unsigned char pkt_use[STATIC_PKT_MAX_NUM]; 119*4882a593Smuzhiyun } bcm_static_pkt_t; 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun extern bcm_static_pkt_t *bcm_static_skb; 122*4882a593Smuzhiyun #endif /* CONFIG_DHD_USE_STATIC_BUF */ 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun typedef struct bcm_mem_link { 125*4882a593Smuzhiyun struct bcm_mem_link *prev; 126*4882a593Smuzhiyun struct bcm_mem_link *next; 127*4882a593Smuzhiyun uint size; 128*4882a593Smuzhiyun int line; 129*4882a593Smuzhiyun void *osh; 130*4882a593Smuzhiyun char file[BCM_MEM_FILENAME_LEN]; 131*4882a593Smuzhiyun } bcm_mem_link_t; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct osl_cmn_info { 134*4882a593Smuzhiyun atomic_t malloced; 135*4882a593Smuzhiyun atomic_t pktalloced; /* Number of allocated packet buffers */ 136*4882a593Smuzhiyun spinlock_t dbgmem_lock; 137*4882a593Smuzhiyun bcm_mem_link_t *dbgmem_list; 138*4882a593Smuzhiyun bcm_mem_link_t *dbgvmem_list; 139*4882a593Smuzhiyun #ifdef BCMDBG_PKT /* pkt logging for debugging */ 140*4882a593Smuzhiyun spinlock_t pktlist_lock; 141*4882a593Smuzhiyun pktlist_info_t pktlist; 142*4882a593Smuzhiyun #endif /* BCMDBG_PKT */ 143*4882a593Smuzhiyun spinlock_t pktalloc_lock; 144*4882a593Smuzhiyun atomic_t refcount; /* Number of references to this shared structure. */ 145*4882a593Smuzhiyun }; 146*4882a593Smuzhiyun typedef struct osl_cmn_info osl_cmn_t; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #if defined(AXI_TIMEOUTS_NIC) 149*4882a593Smuzhiyun typedef uint32 (*bpt_cb_fn)(void *ctx, void *addr); 150*4882a593Smuzhiyun #endif /* AXI_TIMEOUTS_NIC */ 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun struct osl_info { 153*4882a593Smuzhiyun osl_pubinfo_t pub; 154*4882a593Smuzhiyun uint32 flags; /* If specific cases to be handled in the OSL */ 155*4882a593Smuzhiyun uint magic; 156*4882a593Smuzhiyun void *pdev; 157*4882a593Smuzhiyun uint failed; 158*4882a593Smuzhiyun uint bustype; 159*4882a593Smuzhiyun osl_cmn_t *cmn; /* Common OSL related data shred between two OSH's */ 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun /* for host drivers, a bus handle is needed when reading from and/or writing to dongle 162*4882a593Smuzhiyun * registeres, however ai/si utilities only passes osh handle to R_REG and W_REG. as 163*4882a593Smuzhiyun * a work around, save the bus handle here 164*4882a593Smuzhiyun */ 165*4882a593Smuzhiyun void *bus_handle; 166*4882a593Smuzhiyun #ifdef BCMDBG_CTRACE 167*4882a593Smuzhiyun spinlock_t ctrace_lock; 168*4882a593Smuzhiyun struct list_head ctrace_list; 169*4882a593Smuzhiyun int ctrace_num; 170*4882a593Smuzhiyun #endif /* BCMDBG_CTRACE */ 171*4882a593Smuzhiyun #if defined(AXI_TIMEOUTS_NIC) 172*4882a593Smuzhiyun bpt_cb_fn bpt_cb; 173*4882a593Smuzhiyun void *sih; 174*4882a593Smuzhiyun #endif /* AXI_TIMEOUTS_NIC */ 175*4882a593Smuzhiyun #ifdef USE_DMA_LOCK 176*4882a593Smuzhiyun spinlock_t dma_lock; 177*4882a593Smuzhiyun bool dma_lock_bh; 178*4882a593Smuzhiyun #endif /* USE_DMA_LOCK */ 179*4882a593Smuzhiyun #ifdef DHD_MAP_LOGGING 180*4882a593Smuzhiyun void *dhd_map_log; 181*4882a593Smuzhiyun void *dhd_unmap_log; 182*4882a593Smuzhiyun #endif /* DHD_MAP_LOGGING */ 183*4882a593Smuzhiyun }; 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #endif /* _LINUX_OSL_PRIV_H_ */ 186