| #ifndef __NCSI_INTERNAL_H__ |
| #define __NCSI_INTERNAL_H__ |
| |
| struct ncsi_dev_priv; |
| struct ncsi_package; |
| |
| #define NCSI_PACKAGE_INDEX(c) (((c) >> 5) & 0x7) |
| #define NCSI_CHANNEL_INDEX(c) ((c) & 0x1ffff) |
| #define NCSI_TO_CHANNEL(p, c) ((((p) & 0x7) << 5) | ((c) & 0x1ffff)) |
| |
| /* Channel state */ |
| enum { |
| ncsi_channel_state_deselected_initial, |
| ncsi_channel_state_selected_initial, |
| ncsi_channel_state_deselected_ready, |
| ncsi_channel_state_selected_ready, |
| }; |
| |
| struct ncsi_channel { |
| unsigned char nc_id; |
| int nc_state; |
| struct ncsi_package *nc_package; |
| struct ncsi_channel_version nc_version; |
| struct ncsi_channel_cap nc_caps[NCSI_CAP_MAX]; |
| struct ncsi_channel_mode nc_modes[NCSI_MODE_MAX]; |
| struct ncsi_channel_filter *nc_filters[NCSI_FILTER_MAX]; |
| struct ncsi_channel_stats nc_stats; |
| struct list_head nc_node; |
| }; |
| |
| struct ncsi_package { |
| unsigned char np_id; |
| struct ncsi_dev_priv *np_ndp; |
| atomic_t np_channel_num; |
| spinlock_t np_channel_lock; |
| struct list_head np_channels; |
| struct list_head np_node; |
| }; |
| |
| struct ncsi_req { |
| unsigned char nr_id; |
| bool nr_used; |
| struct ncsi_dev_priv *nr_ndp; |
| struct sk_buff *nr_cmd; |
| struct sk_buff *nr_rsp; |
| struct timer_list nr_timer; |
| bool nr_timer_enabled; |
| }; |
| |
| enum { |
| ncsi_dev_state_major = 0xff00, |
| ncsi_dev_state_minor = 0x00ff, |
| ncsi_dev_state_probe_deselect = 0x0201, |
| ncsi_dev_state_probe_package, |
| ncsi_dev_state_probe_channel, |
| ncsi_dev_state_probe_cis, |
| ncsi_dev_state_probe_gvi, |
| ncsi_dev_state_probe_gc, |
| ncsi_dev_state_probe_gls, |
| ncsi_dev_state_probe_dp, |
| ncsi_dev_state_config_sp = 0x0301, |
| ncsi_dev_state_config_cis, |
| ncsi_dev_state_config_sma, |
| ncsi_dev_state_config_ebf, |
| ncsi_dev_state_config_ecnt, |
| ncsi_dev_state_config_ec, |
| ncsi_dev_state_config_ae, |
| ncsi_dev_state_config_gls, |
| ncsi_dev_state_config_done, |
| ncsi_dev_state_suspend_select = 0x0401, |
| ncsi_dev_state_suspend_dcnt, |
| ncsi_dev_state_suspend_dc, |
| ncsi_dev_state_suspend_deselect, |
| ncsi_dev_state_suspend_done |
| }; |
| |
| struct ncsi_dev_priv { |
| struct ncsi_dev ndp_ndev; |
| int ndp_flags; |
| #define NCSI_DEV_PRIV_FLAG_POPULATED 0x1 |
| #define NCSI_DEV_PRIV_FLAG_CHANGE_ACTIVE 0x2 |
| struct ncsi_package *ndp_active_package; |
| struct ncsi_channel *ndp_active_channel; |
| atomic_t ndp_package_num; |
| spinlock_t ndp_package_lock; |
| struct list_head ndp_packages; |
| atomic_t ndp_pending_reqs; |
| atomic_t ndp_last_req_idx; |
| spinlock_t ndp_req_lock; |
| struct ncsi_req ndp_reqs[256]; |
| struct work_struct ndp_work; |
| struct packet_type ndp_ptype; |
| struct list_head ndp_node; |
| }; |
| |
| struct ncsi_cmd_arg { |
| struct ncsi_dev_priv *nca_ndp; |
| unsigned char nca_type; |
| unsigned char nca_id; |
| unsigned char nca_package; |
| unsigned char nca_channel; |
| unsigned short nca_payload; |
| unsigned int nca_portid; |
| union { |
| unsigned char nca_bytes[16]; |
| unsigned short nca_words[8]; |
| unsigned int nca_dwords[4]; |
| }; |
| }; |
| |
| extern struct net *ncsi_net; |
| extern struct list_head ncsi_dev_list; |
| extern spinlock_t ncsi_dev_lock; |
| |
| #define TO_NCSI_DEV_PRIV(nd) \ |
| container_of(nd, struct ncsi_dev_priv, ndp_ndev) |
| #define NCSI_FOR_EACH_DEV(ndp) \ |
| list_for_each_entry_rcu(ndp, &ncsi_dev_list, ndp_node) |
| #define NCSI_FOR_EACH_PACKAGE(ndp, np) \ |
| list_for_each_entry_rcu(np, &ndp->ndp_packages, np_node) |
| #define NCSI_FOR_EACH_CHANNEL(np, nc) \ |
| list_for_each_entry_rcu(nc, &np->np_channels, nc_node) |
| |
| /* Resources */ |
| int ncsi_find_channel_filter(struct ncsi_channel *nc, int table, void *data); |
| int ncsi_add_channel_filter(struct ncsi_channel *nc, int table, void *data); |
| int ncsi_del_channel_filter(struct ncsi_channel *nc, int table, int index); |
| struct ncsi_channel *ncsi_add_channel(struct ncsi_package *np, |
| unsigned char id); |
| struct ncsi_channel *ncsi_find_channel(struct ncsi_package *np, |
| unsigned char id); |
| struct ncsi_package *ncsi_add_package(struct ncsi_dev_priv *ndp, |
| unsigned char id); |
| struct ncsi_package *ncsi_find_package(struct ncsi_dev_priv *ndp, |
| unsigned char id); |
| void ncsi_release_package(struct ncsi_package *np); |
| void ncsi_find_package_and_channel(struct ncsi_dev_priv *ndp, |
| unsigned char id, |
| struct ncsi_package **np, |
| struct ncsi_channel **nc); |
| struct ncsi_req *ncsi_alloc_req(struct ncsi_dev_priv *ndp); |
| void ncsi_free_req(struct ncsi_req *nr, bool check, bool timeout); |
| struct ncsi_dev *ncsi_find_dev(struct net_device *dev); |
| int ncsi_config_dev(struct ncsi_dev *nd); |
| |
| /* Packet handlers */ |
| int ncsi_xmit_cmd(struct ncsi_cmd_arg *nca); |
| int ncsi_rcv_rsp(struct sk_buff *skb, struct net_device *dev, |
| struct packet_type *pt, struct net_device *orig_dev); |
| int ncsi_aen_handler(struct ncsi_dev_priv *ndp, struct sk_buff *skb); |
| #endif /* __NCSI_INTERNAL_H__ */ |