/* * Linux network driver for Brocade Converged Network Adapter. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) Version 2 as * published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ /* * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. * All rights reserved * www.brocade.com */ /** * @file bfa_wc.h Generic wait counter. */ #ifndef __BFA_WC_H__ #define __BFA_WC_H__ typedef void (*bfa_wc_resume_t) (void *cbarg); struct bfa_wc { bfa_wc_resume_t wc_resume; void *wc_cbarg; int wc_count; }; static inline void bfa_wc_up(struct bfa_wc *wc) { wc->wc_count++; } static inline void bfa_wc_down(struct bfa_wc *wc) { wc->wc_count--; if (wc->wc_count == 0) wc->wc_resume(wc->wc_cbarg); } /** * Initialize a waiting counter. */ static inline void bfa_wc_init(struct bfa_wc *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg) { wc->wc_resume = wc_resume; wc->wc_cbarg = wc_cbarg; wc->wc_count = 0; bfa_wc_up(wc); } /** * Wait for counter to reach zero */ static inline void bfa_wc_wait(struct bfa_wc *wc) { bfa_wc_down(wc); } #endif