105491d2cSKalle Valo /* Copyright (c) 2014 Broadcom Corporation
205491d2cSKalle Valo  *
305491d2cSKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
405491d2cSKalle Valo  * purpose with or without fee is hereby granted, provided that the above
505491d2cSKalle Valo  * copyright notice and this permission notice appear in all copies.
605491d2cSKalle Valo  *
705491d2cSKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
805491d2cSKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
905491d2cSKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
1005491d2cSKalle Valo  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1105491d2cSKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
1205491d2cSKalle Valo  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
1305491d2cSKalle Valo  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1405491d2cSKalle Valo  */
1505491d2cSKalle Valo #ifndef BRCMFMAC_COMMONRING_H
1605491d2cSKalle Valo #define BRCMFMAC_COMMONRING_H
1705491d2cSKalle Valo 
1805491d2cSKalle Valo 
1905491d2cSKalle Valo struct brcmf_commonring {
2005491d2cSKalle Valo 	u16 r_ptr;
2105491d2cSKalle Valo 	u16 w_ptr;
2205491d2cSKalle Valo 	u16 f_ptr;
2305491d2cSKalle Valo 	u16 depth;
2405491d2cSKalle Valo 	u16 item_len;
2505491d2cSKalle Valo 
2605491d2cSKalle Valo 	void *buf_addr;
2705491d2cSKalle Valo 
2805491d2cSKalle Valo 	int (*cr_ring_bell)(void *ctx);
2905491d2cSKalle Valo 	int (*cr_update_rptr)(void *ctx);
3005491d2cSKalle Valo 	int (*cr_update_wptr)(void *ctx);
3105491d2cSKalle Valo 	int (*cr_write_rptr)(void *ctx);
3205491d2cSKalle Valo 	int (*cr_write_wptr)(void *ctx);
3305491d2cSKalle Valo 
3405491d2cSKalle Valo 	void *cr_ctx;
3505491d2cSKalle Valo 
3605491d2cSKalle Valo 	spinlock_t lock;
3705491d2cSKalle Valo 	unsigned long flags;
3805491d2cSKalle Valo 	bool inited;
3905491d2cSKalle Valo 	bool was_full;
4005491d2cSKalle Valo 
4105491d2cSKalle Valo 	atomic_t outstanding_tx;
4205491d2cSKalle Valo };
4305491d2cSKalle Valo 
4405491d2cSKalle Valo 
4505491d2cSKalle Valo void brcmf_commonring_register_cb(struct brcmf_commonring *commonring,
4605491d2cSKalle Valo 				  int (*cr_ring_bell)(void *ctx),
4705491d2cSKalle Valo 				  int (*cr_update_rptr)(void *ctx),
4805491d2cSKalle Valo 				  int (*cr_update_wptr)(void *ctx),
4905491d2cSKalle Valo 				  int (*cr_write_rptr)(void *ctx),
5005491d2cSKalle Valo 				  int (*cr_write_wptr)(void *ctx), void *ctx);
5105491d2cSKalle Valo void brcmf_commonring_config(struct brcmf_commonring *commonring, u16 depth,
5205491d2cSKalle Valo 			     u16 item_len, void *buf_addr);
5305491d2cSKalle Valo void brcmf_commonring_lock(struct brcmf_commonring *commonring);
5405491d2cSKalle Valo void brcmf_commonring_unlock(struct brcmf_commonring *commonring);
5505491d2cSKalle Valo bool brcmf_commonring_write_available(struct brcmf_commonring *commonring);
5605491d2cSKalle Valo void *brcmf_commonring_reserve_for_write(struct brcmf_commonring *commonring);
5705491d2cSKalle Valo void *
5805491d2cSKalle Valo brcmf_commonring_reserve_for_write_multiple(struct brcmf_commonring *commonring,
5905491d2cSKalle Valo 					    u16 n_items, u16 *alloced);
6005491d2cSKalle Valo int brcmf_commonring_write_complete(struct brcmf_commonring *commonring);
6105491d2cSKalle Valo void brcmf_commonring_write_cancel(struct brcmf_commonring *commonring,
6205491d2cSKalle Valo 				   u16 n_items);
6305491d2cSKalle Valo void *brcmf_commonring_get_read_ptr(struct brcmf_commonring *commonring,
6405491d2cSKalle Valo 				    u16 *n_items);
6505491d2cSKalle Valo int brcmf_commonring_read_complete(struct brcmf_commonring *commonring,
6605491d2cSKalle Valo 				   u16 n_items);
6705491d2cSKalle Valo 
6805491d2cSKalle Valo #define brcmf_commonring_n_items(commonring) (commonring->depth)
6905491d2cSKalle Valo #define brcmf_commonring_len_item(commonring) (commonring->item_len)
7005491d2cSKalle Valo 
7105491d2cSKalle Valo 
7205491d2cSKalle Valo #endif /* BRCMFMAC_COMMONRING_H */
73