|  | /* | 
|  | * 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 |