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