Commit | Line | Data |
---|---|---|
8b230ed8 RM |
1 | /* |
2 | * Linux network driver for Brocade Converged Network Adapter. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify it | |
5 | * under the terms of the GNU General Public License (GPL) Version 2 as | |
6 | * published by the Free Software Foundation | |
7 | * | |
8 | * This program is distributed in the hope that it will be useful, but | |
9 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
11 | * General Public License for more details. | |
12 | */ | |
13 | /* | |
14 | * Copyright (c) 2005-2010 Brocade Communications Systems, Inc. | |
15 | * All rights reserved | |
16 | * www.brocade.com | |
17 | */ | |
18 | ||
19 | /** | |
20 | * @file bfa_wc.h Generic wait counter. | |
21 | */ | |
22 | ||
23 | #ifndef __BFA_WC_H__ | |
24 | #define __BFA_WC_H__ | |
25 | ||
26 | typedef void (*bfa_wc_resume_t) (void *cbarg); | |
27 | ||
28 | struct bfa_wc { | |
29 | bfa_wc_resume_t wc_resume; | |
30 | void *wc_cbarg; | |
31 | int wc_count; | |
32 | }; | |
33 | ||
34 | static inline void | |
35 | bfa_wc_up(struct bfa_wc *wc) | |
36 | { | |
37 | wc->wc_count++; | |
38 | } | |
39 | ||
40 | static inline void | |
41 | bfa_wc_down(struct bfa_wc *wc) | |
42 | { | |
43 | wc->wc_count--; | |
44 | if (wc->wc_count == 0) | |
45 | wc->wc_resume(wc->wc_cbarg); | |
46 | } | |
47 | ||
48 | /** | |
49 | * Initialize a waiting counter. | |
50 | */ | |
51 | static inline void | |
52 | bfa_wc_init(struct bfa_wc *wc, bfa_wc_resume_t wc_resume, void *wc_cbarg) | |
53 | { | |
54 | wc->wc_resume = wc_resume; | |
55 | wc->wc_cbarg = wc_cbarg; | |
56 | wc->wc_count = 0; | |
57 | bfa_wc_up(wc); | |
58 | } | |
59 | ||
60 | /** | |
61 | * Wait for counter to reach zero | |
62 | */ | |
63 | static inline void | |
64 | bfa_wc_wait(struct bfa_wc *wc) | |
65 | { | |
66 | bfa_wc_down(wc); | |
67 | } | |
68 | ||
69 | #endif |