root/usr/src/uts/common/io/bnxe/577xx/drivers/common/lm/device/context.h
#ifndef __CONTEXT_H
#define __CONTEXT_H
/*
functions for managing Chip per-connection context
*/
#include "lm5710.h"

#define CONN_ID_INVALID                            (0xFFFFFFFF)

#define LM_CONN_MAX_FUNC(_pdev,_conn)             (((_pdev)->context_info->proto_end[_conn]- \
                                                    (_pdev)->context_info->proto_start[_conn]) + 1)

#define LM_CONN_BASE(_pdev,_conn)               ((_pdev)->context_info->proto_start[_conn])

/* returns a pionter to a connections chip context*/
void * lm_get_context(struct _lm_device_t *pdev, u32_t cid);

/* same as above but returns phys address in 64 bit pointer */
u64_t lm_get_context_phys(struct _lm_device_t *pdev, u32_t cid);

/* context pool initializer and release functions */
lm_status_t lm_alloc_context_pool(struct _lm_device_t *pdev);
lm_status_t lm_setup_context_pool(struct _lm_device_t *pdev);
void lm_release_context_pool(struct _lm_device_t *pdev);

typedef struct _lm_4tuple_t {
    u32_t src_ip[4]; /* in host order */
    u32_t dst_ip[4]; /* in host order */
    
    u8_t ip_type;
    #define LM_IP_TYPE_V4   1
    #define LM_IP_TYPE_V6   2

    u16_t dst_port; /* in host order */
    u16_t src_port; /* in host order */
} lm_4tuple_t;

/* allocate a free context by type 
   returns CID or -1 if none are avaliable 
   takes the list spinlock */
lm_status_t lm_allocate_cid(struct _lm_device_t *pdev, u32_t type, void * cookie, s32_t * cid);

/* returns the size of a context */
lm_status_t lm_get_context_size(struct _lm_device_t *pdev, s32_t * context_size);


/** 
 * sets the CDU validation data to be valid for a given cid
 * 
 * @param pdev - the physical device handle
 * @param cid - the context of this cid will be initialized with the cdu validataion data
 * @param invalidate - the cdu-validation data can be set, and it can be invalidated... this parameters
 *                   determines which it is.
 * @return lm_status_t
 */
lm_status_t lm_set_cdu_validation_data(struct _lm_device_t *pdev, s32_t cid, u8_t invalidate);

/* free a context
   takes the list spinlock */
void lm_free_cid(struct _lm_device_t *pdev, u32_t type, u32_t cid, u8_t notify_fw);

/* inserts 4 tuple to SRC mirror hash 
   to be called after lm_allocate_cid and before init offload ramrod
   returns failure if hash is full
   takes the CID lock */
lm_status_t lm_searcher_mirror_hash_insert(struct _lm_device_t *pdev, u32_t cid, lm_4tuple_t *tuple);

/* removes 4 tuple to SRC mirror hash 
   to be called after cfc del ramrod completion and before lm_recycle_cid
   takes the CID lock */
void lm_searcher_mirror_hash_remove(struct _lm_device_t *pdev, u32_t cid);

/* lookup the protocol cookie for a given CID 
   does not take a lock 
   will assert if the CID is not allocated */
void * lm_cid_cookie(struct _lm_device_t *pdev, u32_t type, u32_t cid);

/* lookup the protocol cid_resc for a given CID 
   does not take a lock 
   will DbgBreakIf( if the CID is not allocated */
lm_cid_resc_t * lm_cid_resc(struct _lm_device_t *pdev, u32_t cid);

/* Find the protocol that 'cid' belongs to. */
u8_t lm_map_cid_to_proto(struct _lm_device_t * pdev, u32_t cid);

void lm_init_connection_context(struct _lm_device_t *pdev, u32_t const sw_cid, u8_t sb_id);

void lm_recycle_cid(struct _lm_device_t *pdev, u32_t cid);

lm_status_t lm_set_cid_resc(struct _lm_device_t *pdev, u32_t type, void *cookie, u32_t cid);

lm_status_t lm_free_cid_resc(struct _lm_device_t *pdev, u32_t type, u32_t cid, u8_t notify_fw);

/* lookup the slow path request manager from within
   the protocol cid_resc for a given CID 
   does not take a lock 
   will DbgBreakIf( if the CID is not allocated */
lm_sp_req_manager_t *lm_cid_sp_req_mgr(struct _lm_device_t *pdev, u32_t cid);

typedef enum {
    LM_CID_STATE_VALID,
    LM_CID_STATE_PENDING,
    LM_CID_STATE_ERROR
} lm_cid_state_enum;

lm_cid_state_enum
lm_cid_state(
    IN struct _lm_device_t *pdev, 
    IN u32_t cid
    );

lm_status_t
lm_set_cid_state(
    IN struct _lm_device_t *pdev, 
    IN u32_t cid,
    IN lm_cid_state_enum state
    );


void lm_cid_recycled_cb_register(struct _lm_device_t *pdev, u8_t type, lm_cid_recycled_cb_t cb);

void lm_cid_recycled_cb_deregister(struct _lm_device_t *pdev, u8_t type);

lm_status_t lm_set_con_state(struct _lm_device_t *pdev, u32_t cid, u32_t state);

u32_t lm_get_con_state(struct _lm_device_t *pdev, u32_t cid);

#endif /* __CONTEXT_H */