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