Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  * NXP Wireless LAN device driver: utility functions
0004  *
0005  * Copyright 2011-2020 NXP
0006  */
0007 
0008 #ifndef _MWIFIEX_UTIL_H_
0009 #define _MWIFIEX_UTIL_H_
0010 
0011 struct mwifiex_private;
0012 
0013 struct mwifiex_dma_mapping {
0014     dma_addr_t addr;
0015     size_t len;
0016 };
0017 
0018 struct mwifiex_cb {
0019     struct mwifiex_dma_mapping dma_mapping;
0020     union {
0021         struct mwifiex_rxinfo rx_info;
0022         struct mwifiex_txinfo tx_info;
0023     };
0024 };
0025 
0026 /* size/addr for mwifiex_debug_info */
0027 #define item_size(n)        (sizeof_field(struct mwifiex_debug_info, n))
0028 #define item_addr(n)        (offsetof(struct mwifiex_debug_info, n))
0029 
0030 /* size/addr for struct mwifiex_adapter */
0031 #define adapter_item_size(n)    (sizeof_field(struct mwifiex_adapter, n))
0032 #define adapter_item_addr(n)    (offsetof(struct mwifiex_adapter, n))
0033 
0034 struct mwifiex_debug_data {
0035     char name[32];      /* variable/array name */
0036     u32 size;       /* size of the variable/array */
0037     size_t addr;        /* address of the variable/array */
0038     int num;        /* number of variables in an array */
0039 };
0040 
0041 static inline struct mwifiex_rxinfo *MWIFIEX_SKB_RXCB(struct sk_buff *skb)
0042 {
0043     struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
0044 
0045     BUILD_BUG_ON(sizeof(struct mwifiex_cb) > sizeof(skb->cb));
0046     return &cb->rx_info;
0047 }
0048 
0049 static inline struct mwifiex_txinfo *MWIFIEX_SKB_TXCB(struct sk_buff *skb)
0050 {
0051     struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
0052 
0053     return &cb->tx_info;
0054 }
0055 
0056 static inline void mwifiex_store_mapping(struct sk_buff *skb,
0057                      struct mwifiex_dma_mapping *mapping)
0058 {
0059     struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
0060 
0061     memcpy(&cb->dma_mapping, mapping, sizeof(*mapping));
0062 }
0063 
0064 static inline void mwifiex_get_mapping(struct sk_buff *skb,
0065                        struct mwifiex_dma_mapping *mapping)
0066 {
0067     struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
0068 
0069     memcpy(mapping, &cb->dma_mapping, sizeof(*mapping));
0070 }
0071 
0072 static inline dma_addr_t MWIFIEX_SKB_DMA_ADDR(struct sk_buff *skb)
0073 {
0074     struct mwifiex_dma_mapping mapping;
0075 
0076     mwifiex_get_mapping(skb, &mapping);
0077 
0078     return mapping.addr;
0079 }
0080 
0081 int mwifiex_debug_info_to_buffer(struct mwifiex_private *priv, char *buf,
0082                  struct mwifiex_debug_info *info);
0083 
0084 static inline void le16_unaligned_add_cpu(__le16 *var, u16 val)
0085 {
0086     put_unaligned_le16(get_unaligned_le16(var) + val, var);
0087 }
0088 
0089 #endif /* !_MWIFIEX_UTIL_H_ */