root/sys/dev/qlnx/qlnxe/ecore_iscsi_api.h
/*
 * Copyright (c) 2017-2018 Cavium, Inc.
 * All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef __ECORE_ISCSI_API_H__
#define __ECORE_ISCSI_API_H__

#ifndef __EXTRACT__LINUX__IF__
typedef enum _ecore_status_t (*iscsi_event_cb_t)(void *context,
                                                 u8 fw_event_code,
                                                 void *fw_handle);

struct ecore_iscsi_stats
{
        u64 iscsi_rx_bytes_cnt;
        u64 iscsi_rx_packet_cnt;
        u64 iscsi_rx_new_ooo_isle_events_cnt;
        u32 iscsi_cmdq_threshold_cnt;
        u32 iscsi_rq_threshold_cnt;
        u32 iscsi_immq_threshold_cnt;

        u64 iscsi_rx_dropped_pdus_task_not_valid;

        u64 iscsi_rx_data_pdu_cnt;
        u64 iscsi_rx_r2t_pdu_cnt;
        u64 iscsi_rx_total_pdu_cnt;

        u64 iscsi_tx_go_to_slow_start_event_cnt;
        u64 iscsi_tx_fast_retransmit_event_cnt;

        u64 iscsi_tx_data_pdu_cnt;
        u64 iscsi_tx_r2t_pdu_cnt;
        u64 iscsi_tx_total_pdu_cnt;

        u64 iscsi_tx_bytes_cnt;
        u64 iscsi_tx_packet_cnt;

        u64 iscsi_rx_tcp_payload_bytes_cnt;
        u64 iscsi_rx_tcp_pkt_cnt;
        u64 iscsi_rx_pure_ack_cnt;

        u64 iscsi_rx_dup_ack_cnt;

        u64 iscsi_tx_pure_ack_cnt;
        u64 iscsi_tx_delayed_ack_cnt;

        u64 iscsi_tx_tcp_payload_bytes_cnt;
        u64 iscsi_tx_tcp_pkt_cnt;
};

struct ecore_iscsi_tcp_stats
{
        u64 iscsi_tcp_tx_packets_cnt;
        u64 iscsi_tcp_tx_bytes_cnt;
        u64 iscsi_tcp_tx_rxmit_cnt;
        u64 iscsi_tcp_rx_packets_cnt;
        u64 iscsi_tcp_rx_bytes_cnt;
        u64 iscsi_tcp_rx_dup_ack_cnt;
        u32 iscsi_tcp_rx_chksum_err_cnt;
};
#endif

#ifndef __EXTRACT__LINUX__C__
struct ecore_iscsi_conn {
        osal_list_entry_t       list_entry;
        bool                    free_on_delete;

        u16                     conn_id;
        u32                     icid;
        u32                     fw_cid;

        u8                      layer_code;
        u8                      offl_flags;
        u8                      connect_mode;
        u32                     initial_ack;
        dma_addr_t              sq_pbl_addr;
        struct ecore_chain      r2tq;
        struct ecore_chain      xhq;
        struct ecore_chain      uhq;

        struct tcp_upload_params *tcp_upload_params_virt_addr;
        dma_addr_t              tcp_upload_params_phys_addr;
        struct iscsi_conn_stats_params *conn_stats_params_virt_addr;
        dma_addr_t              conn_stats_params_phys_addr;
        struct scsi_terminate_extra_params *queue_cnts_virt_addr;
        dma_addr_t              queue_cnts_phys_addr;
        dma_addr_t              syn_phy_addr;

        u16                     syn_ip_payload_length;
        u8                      local_mac[6];
        u8                      remote_mac[6];
        u16                     vlan_id;
        u16                     tcp_flags;
        u8                      ip_version;
        u32                     remote_ip[4];
        u32                     local_ip[4];
        u8                      ka_max_probe_cnt;
        u8                      dup_ack_theshold;
        u32                     rcv_next;
        u32                     snd_una;
        u32                     snd_next;
        u32                     snd_max;
        u32                     snd_wnd;
        u32                     rcv_wnd;
        u32                     snd_wl1;
        u32                     cwnd;
        u32                     ss_thresh;
        u16                     srtt;
        u16                     rtt_var;
        u32                     ts_recent;
        u32                     ts_recent_age;
        u32                     total_rt;
        u32                     ka_timeout_delta;
        u32                     rt_timeout_delta;
        u8                      dup_ack_cnt;
        u8                      snd_wnd_probe_cnt;
        u8                      ka_probe_cnt;
        u8                      rt_cnt;
        u32                     flow_label;
        u32                     ka_timeout;
        u32                     ka_interval;
        u32                     max_rt_time;
        u32                     initial_rcv_wnd;
        u8                      ttl;
        u8                      tos_or_tc;
        u16                     remote_port;
        u16                     local_port;
        u16                     mss;
        u8                      snd_wnd_scale;
        u8                      rcv_wnd_scale;
        u16                     da_timeout_value;
        u8                      ack_frequency;

        u8                      update_flag;
#define ECORE_ISCSI_CONN_HD_EN          0x01
#define ECORE_ISCSI_CONN_DD_EN          0x02
#define ECORE_ISCSI_CONN_INITIAL_R2T    0x04
#define ECORE_ISCSI_CONN_IMMEDIATE_DATA 0x08

        u8                      default_cq;
        u32                     max_seq_size;
        u32                     max_recv_pdu_length;
        u32                     max_send_pdu_length;
        u32                     first_seq_length;
        u32                     exp_stat_sn;
        u32                     stat_sn;
        u16                     physical_q0;
        u16                     physical_q1;
        u8                      abortive_dsconnect;
        u8                      dif_on_immediate;
#define ECORE_ISCSI_CONN_DIF_ON_IMM_DIS         0
#define ECORE_ISCSI_CONN_DIF_ON_IMM_DEFAULT     1
#define ECORE_ISCSI_CONN_DIF_ON_IMM_LUN_MAPPER  2

        dma_addr_t              lun_mapper_phys_addr;
        u32                     initial_ref_tag;
        u16                     application_tag;
        u16                     application_tag_mask;
        u8                      validate_guard;
        u8                      validate_app_tag;
        u8                      validate_ref_tag;
        u8                      forward_guard;
        u8                      forward_app_tag;
        u8                      forward_ref_tag;
        u8                      interval_size;          /* 0=512B, 1=4KB */
        u8                      network_interface;      /* 0=None, 1=DIF */
        u8                      host_interface;         /* 0=None, 1=DIF, 2=DIX */
        u8                      ref_tag_mask;           /* mask for refernce tag handling */
        u8                      forward_app_tag_with_mask;
        u8                      forward_ref_tag_with_mask;

        u8                      ignore_app_tag;
        u8                      initial_ref_tag_is_valid;
        u8                      host_guard_type;        /* 0 = IP checksum, 1 = CRC */
        u8                      protection_type;        /* 1/2/3 - Protection Type */
        u8                      crc_seed;               /* 0=0x0000, 1=0xffff */
        u8                      keep_ref_tag_const;
};
#endif

/**
 * @brief ecore_iscsi_acquire_connection - allocate resources, 
 *        provides connecion handle (CID)as out parameter.
 *
 * @param p_path
 * @param p_conn  partially initialized incoming container of 
 *                iSCSI connection data
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_acquire_connection(struct ecore_hwfn *p_hwfn,
                               struct ecore_iscsi_conn *p_in_conn,
                               struct ecore_iscsi_conn **p_out_conn);

/**
 * @brief ecore_iscsi_setup_connection- initialize connection data.
 *
 * @param p_conn  container of iSCSI connection data
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_setup_connection(struct ecore_iscsi_conn *p_conn);

void OSAL_IOMEM *ecore_iscsi_get_db_addr(struct ecore_hwfn *p_hwfn,
                                         u32 cid);

void OSAL_IOMEM *ecore_iscsi_get_global_cmdq_cons(struct ecore_hwfn *p_hwfn,
                                                  u8 relative_q_id);

void OSAL_IOMEM *ecore_iscsi_get_primary_bdq_prod(struct ecore_hwfn *p_hwfn,
                                                  u8 bdq_id);

void OSAL_IOMEM *ecore_iscsi_get_secondary_bdq_prod(struct ecore_hwfn *p_hwfn,
                                                    u8 bdq_id);

/**
 * @brief ecore_iscsi_offload_connection - offload previously 
 *        allocated iSCSI connection
 *
 * @param p_path 
 * @param p_conn  container of iSCSI connection data
 *  
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_offload_connection(struct ecore_hwfn *p_hwfn,
                               struct ecore_iscsi_conn *p_conn);

/**
 * @brief ecore_iscsi_release_connection - deletes connecton 
 *        resources (incliding container of iSCSI connection
 *        data)
 *
 * @param p_path 
 * @param p_conn  container of iSCSI connection data
 */
void ecore_iscsi_release_connection(struct ecore_hwfn *p_hwfn,
                                    struct ecore_iscsi_conn *p_conn);

/**
 * @brief ecore_iscsi_terminate_connection - destroys previously
 *        offloaded iSCSI connection
 *
 * @param p_path 
 * @param p_conn  container of iSCSI connection data
 *  
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_terminate_connection(struct ecore_hwfn *p_hwfn,
                                 struct ecore_iscsi_conn *p_conn);

/**
 * @brief ecore_iscsi_update_connection - updates previously 
 *        offloaded iSCSI connection
 *
 *
 * @param p_path 
 * @param p_conn  container of iSCSI connection data
 *  
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_update_connection(struct ecore_hwfn *p_hwfn,
                              struct ecore_iscsi_conn *p_conn);

/**
 * @brief ecore_iscsi_mac_update_connection - updates remote MAC for previously
 *        offloaded iSCSI connection
 *
 *
 * @param p_path
 * @param p_conn  container of iSCSI connection data
 *
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_update_remote_mac(struct ecore_hwfn *p_hwfn,
                              struct ecore_iscsi_conn *p_conn);

/**
 * @brief ecore_iscsi_get_tcp_stats - get and optionally reset TCP statistics
 *        of offloaded iSCSI connection
 *
 *
 * @param p_path
 * @param p_conn  container of iSCSI connection data
 * @param p_stats - buffer to place extracted stats
 * @param reset - 1 - for reset stats (after extraction of accumulated
 *                statistics in optionally provided buffer)
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_get_tcp_stats(struct ecore_hwfn *p_hwfn,
                          struct ecore_iscsi_conn *p_conn,
                          struct ecore_iscsi_tcp_stats *p_stats,
                          u8 reset);

/**
 * @brief ecore_iscsi_clear_connection_sq - clear SQ
 *        offloaded iSCSI connection
 *
 *
 * @param p_path
 * @param p_conn  container of iSCSI connection data
 *
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_iscsi_clear_connection_sq(struct ecore_hwfn *p_hwfn,
                                struct ecore_iscsi_conn *p_conn);

/**
 * @brief ecore_sp_iscsi_func_start
 *
 * This ramrod inits iSCSI functionality in FW
 *
 * @param p_path
 * @param comp_mode
 * @param comp_addr
 *
 * @return enum _ecore_status_t
 */
enum _ecore_status_t
ecore_sp_iscsi_func_start(struct ecore_hwfn *p_hwfn,
                          enum spq_mode comp_mode,
                          struct ecore_spq_comp_cb *p_comp_addr,
                          void *async_event_context,
                          iscsi_event_cb_t async_event_cb);

enum _ecore_status_t
ecore_sp_iscsi_func_stop(struct ecore_hwfn *p_hwfn,
                         enum spq_mode comp_mode,
                         struct ecore_spq_comp_cb *p_comp_addr);

enum _ecore_status_t
ecore_iscsi_get_stats(struct ecore_hwfn *p_hwfn,
                      struct ecore_iscsi_stats *stats);

#endif