1 #ifndef __CONTEXT_H
2 #define __CONTEXT_H
3 /*
4 functions for managing Chip per-connection context
5 */
6 #include "lm5710.h"
7 
8 #define CONN_ID_INVALID                            (0xFFFFFFFF)
9 
10 #define LM_CONN_MAX_FUNC(_pdev,_conn)             (((_pdev)->context_info->proto_end[_conn]- \
11                                                     (_pdev)->context_info->proto_start[_conn]) + 1)
12 
13 #define LM_CONN_BASE(_pdev,_conn)               ((_pdev)->context_info->proto_start[_conn])
14 
15 /* returns a pionter to a connections chip context*/
16 void * lm_get_context(struct _lm_device_t *pdev, u32_t cid);
17 
18 /* same as above but returns phys address in 64 bit pointer */
19 u64_t lm_get_context_phys(struct _lm_device_t *pdev, u32_t cid);
20 
21 /* context pool initializer and release functions */
22 lm_status_t lm_alloc_context_pool(struct _lm_device_t *pdev);
23 lm_status_t lm_setup_context_pool(struct _lm_device_t *pdev);
24 void lm_release_context_pool(struct _lm_device_t *pdev);
25 
26 typedef struct _lm_4tuple_t {
27     u32_t src_ip[4]; /* in host order */
28     u32_t dst_ip[4]; /* in host order */
29 
30     u8_t ip_type;
31     #define LM_IP_TYPE_V4   1
32     #define LM_IP_TYPE_V6   2
33 
34     u16_t dst_port; /* in host order */
35     u16_t src_port; /* in host order */
36 } lm_4tuple_t;
37 
38 /* allocate a free context by type
39    returns CID or -1 if none are avaliable
40    takes the list spinlock */
41 lm_status_t lm_allocate_cid(struct _lm_device_t *pdev, u32_t type, void * cookie, s32_t * cid);
42 
43 /* returns the size of a context */
44 lm_status_t lm_get_context_size(struct _lm_device_t *pdev, s32_t * context_size);
45 
46 
47 /**
48  * sets the CDU validation data to be valid for a given cid
49  *
50  * @param pdev - the physical device handle
51  * @param cid - the context of this cid will be initialized with the cdu validataion data
52  * @param invalidate - the cdu-validation data can be set, and it can be invalidated... this parameters
53  *                   determines which it is.
54  * @return lm_status_t
55  */
56 lm_status_t lm_set_cdu_validation_data(struct _lm_device_t *pdev, s32_t cid, u8_t invalidate);
57 
58 /* free a context
59    takes the list spinlock */
60 void lm_free_cid(struct _lm_device_t *pdev, u32_t type, u32_t cid, u8_t notify_fw);
61 
62 /* inserts 4 tuple to SRC mirror hash
63    to be called after lm_allocate_cid and before init offload ramrod
64    returns failure if hash is full
65    takes the CID lock */
66 lm_status_t lm_searcher_mirror_hash_insert(struct _lm_device_t *pdev, u32_t cid, lm_4tuple_t *tuple);
67 
68 /* removes 4 tuple to SRC mirror hash
69    to be called after cfc del ramrod completion and before lm_recycle_cid
70    takes the CID lock */
71 void lm_searcher_mirror_hash_remove(struct _lm_device_t *pdev, u32_t cid);
72 
73 /* lookup the protocol cookie for a given CID
74    does not take a lock
75    will assert if the CID is not allocated */
76 void * lm_cid_cookie(struct _lm_device_t *pdev, u32_t type, u32_t cid);
77 
78 /* lookup the protocol cid_resc for a given CID
79    does not take a lock
80    will DbgBreakIf( if the CID is not allocated */
81 lm_cid_resc_t * lm_cid_resc(struct _lm_device_t *pdev, u32_t cid);
82 
83 /* Find the protocol that 'cid' belongs to. */
84 u8_t lm_map_cid_to_proto(struct _lm_device_t * pdev, u32_t cid);
85 
86 void lm_init_connection_context(struct _lm_device_t *pdev, u32_t const sw_cid, u8_t sb_id);
87 
88 void lm_recycle_cid(struct _lm_device_t *pdev, u32_t cid);
89 
90 lm_status_t lm_set_cid_resc(struct _lm_device_t *pdev, u32_t type, void *cookie, u32_t cid);
91 
92 lm_status_t lm_free_cid_resc(struct _lm_device_t *pdev, u32_t type, u32_t cid, u8_t notify_fw);
93 
94 /* lookup the slow path request manager from within
95    the protocol cid_resc for a given CID
96    does not take a lock
97    will DbgBreakIf( if the CID is not allocated */
98 lm_sp_req_manager_t *lm_cid_sp_req_mgr(struct _lm_device_t *pdev, u32_t cid);
99 
100 typedef enum {
101     LM_CID_STATE_VALID,
102     LM_CID_STATE_PENDING,
103     LM_CID_STATE_ERROR
104 } lm_cid_state_enum;
105 
106 lm_cid_state_enum
107 lm_cid_state(
108     IN struct _lm_device_t *pdev,
109     IN u32_t cid
110     );
111 
112 lm_status_t
113 lm_set_cid_state(
114     IN struct _lm_device_t *pdev,
115     IN u32_t cid,
116     IN lm_cid_state_enum state
117     );
118 
119 
120 void lm_cid_recycled_cb_register(struct _lm_device_t *pdev, u8_t type, lm_cid_recycled_cb_t cb);
121 
122 void lm_cid_recycled_cb_deregister(struct _lm_device_t *pdev, u8_t type);
123 
124 lm_status_t lm_set_con_state(struct _lm_device_t *pdev, u32_t cid, u32_t state);
125 
126 u32_t lm_get_con_state(struct _lm_device_t *pdev, u32_t cid);
127 
128 #endif /* __CONTEXT_H */
129 
130 
131