1daeccac2SArend van Spriel // SPDX-License-Identifier: ISC
2daeccac2SArend van Spriel /*
3daeccac2SArend van Spriel  * Copyright (c) 2014 Broadcom Corporation
405491d2cSKalle Valo  */
505491d2cSKalle Valo #ifndef BRCMFMAC_COMMONRING_H
605491d2cSKalle Valo #define BRCMFMAC_COMMONRING_H
705491d2cSKalle Valo 
805491d2cSKalle Valo 
905491d2cSKalle Valo struct brcmf_commonring {
1005491d2cSKalle Valo 	u16 r_ptr;
1105491d2cSKalle Valo 	u16 w_ptr;
1205491d2cSKalle Valo 	u16 f_ptr;
1305491d2cSKalle Valo 	u16 depth;
1405491d2cSKalle Valo 	u16 item_len;
1505491d2cSKalle Valo 
1605491d2cSKalle Valo 	void *buf_addr;
1705491d2cSKalle Valo 
1805491d2cSKalle Valo 	int (*cr_ring_bell)(void *ctx);
1905491d2cSKalle Valo 	int (*cr_update_rptr)(void *ctx);
2005491d2cSKalle Valo 	int (*cr_update_wptr)(void *ctx);
2105491d2cSKalle Valo 	int (*cr_write_rptr)(void *ctx);
2205491d2cSKalle Valo 	int (*cr_write_wptr)(void *ctx);
2305491d2cSKalle Valo 
2405491d2cSKalle Valo 	void *cr_ctx;
2505491d2cSKalle Valo 
2605491d2cSKalle Valo 	spinlock_t lock;
2705491d2cSKalle Valo 	unsigned long flags;
2805491d2cSKalle Valo 	bool inited;
2905491d2cSKalle Valo 	bool was_full;
3005491d2cSKalle Valo 
3105491d2cSKalle Valo 	atomic_t outstanding_tx;
3205491d2cSKalle Valo };
3305491d2cSKalle Valo 
3405491d2cSKalle Valo 
3505491d2cSKalle Valo void brcmf_commonring_register_cb(struct brcmf_commonring *commonring,
3605491d2cSKalle Valo 				  int (*cr_ring_bell)(void *ctx),
3705491d2cSKalle Valo 				  int (*cr_update_rptr)(void *ctx),
3805491d2cSKalle Valo 				  int (*cr_update_wptr)(void *ctx),
3905491d2cSKalle Valo 				  int (*cr_write_rptr)(void *ctx),
4005491d2cSKalle Valo 				  int (*cr_write_wptr)(void *ctx), void *ctx);
4105491d2cSKalle Valo void brcmf_commonring_config(struct brcmf_commonring *commonring, u16 depth,
4205491d2cSKalle Valo 			     u16 item_len, void *buf_addr);
4305491d2cSKalle Valo void brcmf_commonring_lock(struct brcmf_commonring *commonring);
4405491d2cSKalle Valo void brcmf_commonring_unlock(struct brcmf_commonring *commonring);
4505491d2cSKalle Valo bool brcmf_commonring_write_available(struct brcmf_commonring *commonring);
4605491d2cSKalle Valo void *brcmf_commonring_reserve_for_write(struct brcmf_commonring *commonring);
4705491d2cSKalle Valo void *
4805491d2cSKalle Valo brcmf_commonring_reserve_for_write_multiple(struct brcmf_commonring *commonring,
4905491d2cSKalle Valo 					    u16 n_items, u16 *alloced);
5005491d2cSKalle Valo int brcmf_commonring_write_complete(struct brcmf_commonring *commonring);
5105491d2cSKalle Valo void brcmf_commonring_write_cancel(struct brcmf_commonring *commonring,
5205491d2cSKalle Valo 				   u16 n_items);
5305491d2cSKalle Valo void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
5405491d2cSKalle Valo 				    u16 *n_items);
5505491d2cSKalle Valo int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
5605491d2cSKalle Valo 				   u16 n_items);
5705491d2cSKalle Valo 
5805491d2cSKalle Valo #define brcmf_commonring_n_items(commonring) (commonring->depth)
5905491d2cSKalle Valo #define brcmf_commonring_len_item(commonring) (commonring->item_len)
6005491d2cSKalle Valo 
6105491d2cSKalle Valo 
6205491d2cSKalle Valo #endif /* BRCMFMAC_COMMONRING_H */
63