1*daeccac2SArend van Spriel // SPDX-License-Identifier: ISC 2*daeccac2SArend van Spriel /* 3*daeccac2SArend 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