/**************************************************************************** * * Copyright (c) 2014 - 2018 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ #ifndef __HIP4_SMAPPER_H__ #define __HIP4_SMAPPER_H__ struct slsi_dev; struct slsi_hip4; enum smapper_type { TX_5G, TX_2G, RX }; #define HIP4_SMAPPER_TOTAL_BANKS 10 #define HIP4_SMAPPER_BANK_SMALL false #define HIP4_SMAPPER_BANK_LARGE true #define HIP_SMAPPER_OWNER_FW 0 #define HIP_SMAPPER_OWNER_HOST 1 #define HIP_SMAPPER_STATUS_REFILL 0 #define HIP_SMAPPER_STATUS_MAPPED 1 #define HIP4_SMAPPER_OTHER_CPU 0 #define HIP4_SMAPPER_OWN_CPU 1 #define HIP4_SMAPPER_STATE_OUT 0 #define HIP4_SMAPPER_STATE_WANT 1 #define HIP4_SMAPPER_STATE_CLAIM 2 #define HIP4_SMAPPER_BANKS_CHECK_CONFIGURE(reg) (((reg) >> 30) == 0 ? 1 : 0) #define HIP4_SMAPPER_BANKS_CONFIGURE_DONE(reg) ((reg) = (reg) | 0xc0000000) #define HIP4_SMAPPER_GET_BANK_STATE(b, reg) (((0x1 << ((b) * 2)) & (reg)) > 0 ? 1 : 0) #define HIP4_SMAPPER_GET_BANK_OWNER(b, reg) (((0x2 << ((b) * 2)) & (reg)) > 0 ? 1 : 0) #define HIP4_SMAPPER_SET_BANK_STATE(b, reg, val) ((reg) = ((reg) & ~(0x1 << ((b) * 2))) | \ ((val) << ((b) * 2))) #define HIP4_SMAPPER_SET_BANK_OWNER(b, reg, val) ((reg) = (reg & ~(0x2 << ((b) * 2))) | \ (((val) << 1) << ((b) * 2))) struct hip4_smapper_descriptor { u8 bank_num; u8 entry_num; u16 entry_size; u16 headroom; }; /* There should be an agreement between host and FW about bank mapping */ /* TODO : think about this agreement */ enum smapper_banks { RX_0, RX_1, RX_2, RX_3, END_RX_BANKS }; struct hip4_smapper_control { u32 emul_loc; /* Smapper emulator location in MIF_ADDR */ u32 emul_sz; /* Smapper emulator size */ u8 th_req; /* TH smapper request interrupt bit position */ u8 fh_ind; /* FH smapper ind interrupt bit position */ u32 mbox_scb; /* SMAPPER MBOX scoreboard location */ u32 *mbox_ptr; /* Mbox pointer */ spinlock_t smapper_lock; /* Lookup table to map the virtual bank mapping in wlan with the phy mapping in HW */ /* Currently is safe to use this indexing as only WIFI is using smapper */ u8 lookuptable[HIP4_SMAPPER_TOTAL_BANKS]; }; struct hip4_smapper_bank { enum smapper_type type; u16 entries; bool in_use; u8 bank; u8 cur; u32 entry_size; struct sk_buff **skbuff; dma_addr_t *skbuff_dma; struct hip4_smapper_control_entry *entry; u16 align; }; int hip4_smapper_init(struct slsi_dev *sdev, struct slsi_hip4 *hip); void hip4_smapper_deinit(struct slsi_dev *sdev, struct slsi_hip4 *hip); struct mbulk *hip4_smapper_send(struct slsi_hip4 *hip, struct sk_buff *skb, int *val); int hip4_smapper_consume_entry(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi); void *hip4_smapper_get_skb_data(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi); struct sk_buff *hip4_smapper_get_skb(struct slsi_dev *sdev, struct slsi_hip4 *hip, struct sk_buff *skb_fapi); void hip4_smapper_free_mapped_skb(struct sk_buff *skb); #endif