Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. |
| 3 | * All rights reserved |
| 4 | * www.brocade.com |
| 5 | * |
| 6 | * Linux driver for Brocade Fibre Channel Host Bus Adapter. |
| 7 | * |
| 8 | * This program is free software; you can redistribute it and/or modify it |
| 9 | * under the terms of the GNU General Public License (GPL) Version 2 as |
| 10 | * published by the Free Software Foundation |
| 11 | * |
| 12 | * This program is distributed in the hope that it will be useful, but |
| 13 | * WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | * General Public License for more details. |
| 16 | */ |
| 17 | #ifndef __BFA_AEN_H__ |
| 18 | #define __BFA_AEN_H__ |
| 19 | |
| 20 | #include "defs/bfa_defs_aen.h" |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 21 | #include "defs/bfa_defs_status.h" |
| 22 | #include "cs/bfa_debug.h" |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 23 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 24 | #define BFA_AEN_MAX_ENTRY 512 |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 25 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 26 | extern int bfa_aen_max_cfg_entry; |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 27 | struct bfa_aen_s { |
| 28 | void *bfad; |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 29 | int max_entry; |
| 30 | int write_index; |
| 31 | int read_index; |
| 32 | int bfad_num; |
| 33 | int seq_num; |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 34 | void (*aen_cb_notify)(void *bfad); |
| 35 | void (*gettimeofday)(struct bfa_timeval_s *tv); |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 36 | struct bfa_trc_mod_s *trcmod; |
| 37 | int app_ri[BFA_AEN_MAX_APP]; /* For multiclient support */ |
| 38 | struct bfa_aen_entry_s list[BFA_AEN_MAX_ENTRY]; /* Must be the last */ |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 39 | }; |
| 40 | |
| 41 | |
| 42 | /** |
| 43 | * Public APIs |
| 44 | */ |
| 45 | static inline void |
| 46 | bfa_aen_set_max_cfg_entry(int max_entry) |
| 47 | { |
| 48 | bfa_aen_max_cfg_entry = max_entry; |
| 49 | } |
| 50 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 51 | static inline int |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 52 | bfa_aen_get_max_cfg_entry(void) |
| 53 | { |
| 54 | return bfa_aen_max_cfg_entry; |
| 55 | } |
| 56 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 57 | static inline int |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 58 | bfa_aen_get_meminfo(void) |
| 59 | { |
Jing Huang | f8ceafd | 2009-09-25 12:29:54 -0700 | [diff] [blame] | 60 | return sizeof(struct bfa_aen_entry_s) * bfa_aen_get_max_cfg_entry(); |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 61 | } |
| 62 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 63 | static inline int |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 64 | bfa_aen_get_wi(struct bfa_aen_s *aen) |
| 65 | { |
| 66 | return aen->write_index; |
| 67 | } |
| 68 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 69 | static inline int |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 70 | bfa_aen_get_ri(struct bfa_aen_s *aen) |
| 71 | { |
| 72 | return aen->read_index; |
| 73 | } |
| 74 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 75 | static inline int |
| 76 | bfa_aen_fetch_count(struct bfa_aen_s *aen, enum bfa_aen_app app_id) |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 77 | { |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 78 | bfa_assert((app_id < BFA_AEN_MAX_APP) && (app_id >= bfa_aen_app_bcu)); |
| 79 | return ((aen->write_index + aen->max_entry) - aen->app_ri[app_id]) |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 80 | % aen->max_entry; |
| 81 | } |
| 82 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 83 | int bfa_aen_init(struct bfa_aen_s *aen, struct bfa_trc_mod_s *trcmod, |
| 84 | void *bfad, int bfad_num, void (*aen_cb_notify)(void *), |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 85 | void (*gettimeofday)(struct bfa_timeval_s *)); |
| 86 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 87 | void bfa_aen_post(struct bfa_aen_s *aen, enum bfa_aen_category aen_category, |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 88 | int aen_type, union bfa_aen_data_u *aen_data); |
| 89 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 90 | bfa_status_t bfa_aen_fetch(struct bfa_aen_s *aen, |
| 91 | struct bfa_aen_entry_s *aen_entry, |
| 92 | int entry_req, enum bfa_aen_app app_id, int *entry_ret); |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 93 | |
Krishna Gudipati | 2993cc7 | 2010-03-05 19:36:47 -0800 | [diff] [blame] | 94 | int bfa_aen_get_inst(struct bfa_aen_s *aen); |
Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 95 | |
| 96 | #endif /* __BFA_AEN_H__ */ |