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