162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * NXP Wireless LAN device driver: utility functions
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2011-2020 NXP
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _MWIFIEX_UTIL_H_
962306a36Sopenharmony_ci#define _MWIFIEX_UTIL_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct mwifiex_private;
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistruct mwifiex_dma_mapping {
1462306a36Sopenharmony_ci	dma_addr_t addr;
1562306a36Sopenharmony_ci	size_t len;
1662306a36Sopenharmony_ci};
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistruct mwifiex_cb {
1962306a36Sopenharmony_ci	struct mwifiex_dma_mapping dma_mapping;
2062306a36Sopenharmony_ci	union {
2162306a36Sopenharmony_ci		struct mwifiex_rxinfo rx_info;
2262306a36Sopenharmony_ci		struct mwifiex_txinfo tx_info;
2362306a36Sopenharmony_ci	};
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* size/addr for mwifiex_debug_info */
2762306a36Sopenharmony_ci#define item_size(n)		(sizeof_field(struct mwifiex_debug_info, n))
2862306a36Sopenharmony_ci#define item_addr(n)		(offsetof(struct mwifiex_debug_info, n))
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* size/addr for struct mwifiex_adapter */
3162306a36Sopenharmony_ci#define adapter_item_size(n)	(sizeof_field(struct mwifiex_adapter, n))
3262306a36Sopenharmony_ci#define adapter_item_addr(n)	(offsetof(struct mwifiex_adapter, n))
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistruct mwifiex_debug_data {
3562306a36Sopenharmony_ci	char name[32];		/* variable/array name */
3662306a36Sopenharmony_ci	u32 size;		/* size of the variable/array */
3762306a36Sopenharmony_ci	size_t addr;		/* address of the variable/array */
3862306a36Sopenharmony_ci	int num;		/* number of variables in an array */
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic inline struct mwifiex_rxinfo *MWIFIEX_SKB_RXCB(struct sk_buff *skb)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	BUILD_BUG_ON(sizeof(struct mwifiex_cb) > sizeof(skb->cb));
4662306a36Sopenharmony_ci	return &cb->rx_info;
4762306a36Sopenharmony_ci}
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_cistatic inline struct mwifiex_txinfo *MWIFIEX_SKB_TXCB(struct sk_buff *skb)
5062306a36Sopenharmony_ci{
5162306a36Sopenharmony_ci	struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	return &cb->tx_info;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline void mwifiex_store_mapping(struct sk_buff *skb,
5762306a36Sopenharmony_ci					 struct mwifiex_dma_mapping *mapping)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	memcpy(&cb->dma_mapping, mapping, sizeof(*mapping));
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic inline void mwifiex_get_mapping(struct sk_buff *skb,
6562306a36Sopenharmony_ci				       struct mwifiex_dma_mapping *mapping)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	struct mwifiex_cb *cb = (struct mwifiex_cb *)skb->cb;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	memcpy(mapping, &cb->dma_mapping, sizeof(*mapping));
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline dma_addr_t MWIFIEX_SKB_DMA_ADDR(struct sk_buff *skb)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	struct mwifiex_dma_mapping mapping;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	mwifiex_get_mapping(skb, &mapping);
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	return mapping.addr;
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ciint mwifiex_debug_info_to_buffer(struct mwifiex_private *priv, char *buf,
8262306a36Sopenharmony_ci				 struct mwifiex_debug_info *info);
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_cistatic inline void le16_unaligned_add_cpu(__le16 *var, u16 val)
8562306a36Sopenharmony_ci{
8662306a36Sopenharmony_ci	put_unaligned_le16(get_unaligned_le16(var) + val, var);
8762306a36Sopenharmony_ci}
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#endif /* !_MWIFIEX_UTIL_H_ */
90