1*4882a593Smuzhiyun /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 2*4882a593Smuzhiyun /* QLogic qed NIC Driver 3*4882a593Smuzhiyun * Copyright (c) 2015-2017 QLogic Corporation 4*4882a593Smuzhiyun * Copyright (c) 2019-2020 Marvell International Ltd. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _QED_ISCSI_IF_H 8*4882a593Smuzhiyun #define _QED_ISCSI_IF_H 9*4882a593Smuzhiyun #include <linux/types.h> 10*4882a593Smuzhiyun #include <linux/qed/qed_if.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun typedef int (*iscsi_event_cb_t) (void *context, 13*4882a593Smuzhiyun u8 fw_event_code, void *fw_handle); 14*4882a593Smuzhiyun struct qed_iscsi_stats { 15*4882a593Smuzhiyun u64 iscsi_rx_bytes_cnt; 16*4882a593Smuzhiyun u64 iscsi_rx_packet_cnt; 17*4882a593Smuzhiyun u64 iscsi_rx_new_ooo_isle_events_cnt; 18*4882a593Smuzhiyun u32 iscsi_cmdq_threshold_cnt; 19*4882a593Smuzhiyun u32 iscsi_rq_threshold_cnt; 20*4882a593Smuzhiyun u32 iscsi_immq_threshold_cnt; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun u64 iscsi_rx_dropped_pdus_task_not_valid; 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun u64 iscsi_rx_data_pdu_cnt; 25*4882a593Smuzhiyun u64 iscsi_rx_r2t_pdu_cnt; 26*4882a593Smuzhiyun u64 iscsi_rx_total_pdu_cnt; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun u64 iscsi_tx_go_to_slow_start_event_cnt; 29*4882a593Smuzhiyun u64 iscsi_tx_fast_retransmit_event_cnt; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun u64 iscsi_tx_data_pdu_cnt; 32*4882a593Smuzhiyun u64 iscsi_tx_r2t_pdu_cnt; 33*4882a593Smuzhiyun u64 iscsi_tx_total_pdu_cnt; 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun u64 iscsi_tx_bytes_cnt; 36*4882a593Smuzhiyun u64 iscsi_tx_packet_cnt; 37*4882a593Smuzhiyun }; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun struct qed_dev_iscsi_info { 40*4882a593Smuzhiyun struct qed_dev_info common; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun void __iomem *primary_dbq_rq_addr; 43*4882a593Smuzhiyun void __iomem *secondary_bdq_rq_addr; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun u8 num_cqs; 46*4882a593Smuzhiyun }; 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun struct qed_iscsi_id_params { 49*4882a593Smuzhiyun u8 mac[ETH_ALEN]; 50*4882a593Smuzhiyun u32 ip[4]; 51*4882a593Smuzhiyun u16 port; 52*4882a593Smuzhiyun }; 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun struct qed_iscsi_params_offload { 55*4882a593Smuzhiyun u8 layer_code; 56*4882a593Smuzhiyun dma_addr_t sq_pbl_addr; 57*4882a593Smuzhiyun u32 initial_ack; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun struct qed_iscsi_id_params src; 60*4882a593Smuzhiyun struct qed_iscsi_id_params dst; 61*4882a593Smuzhiyun u16 vlan_id; 62*4882a593Smuzhiyun u8 tcp_flags; 63*4882a593Smuzhiyun u8 ip_version; 64*4882a593Smuzhiyun u8 default_cq; 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun u8 ka_max_probe_cnt; 67*4882a593Smuzhiyun u8 dup_ack_theshold; 68*4882a593Smuzhiyun u32 rcv_next; 69*4882a593Smuzhiyun u32 snd_una; 70*4882a593Smuzhiyun u32 snd_next; 71*4882a593Smuzhiyun u32 snd_max; 72*4882a593Smuzhiyun u32 snd_wnd; 73*4882a593Smuzhiyun u32 rcv_wnd; 74*4882a593Smuzhiyun u32 snd_wl1; 75*4882a593Smuzhiyun u32 cwnd; 76*4882a593Smuzhiyun u32 ss_thresh; 77*4882a593Smuzhiyun u16 srtt; 78*4882a593Smuzhiyun u16 rtt_var; 79*4882a593Smuzhiyun u32 ts_recent; 80*4882a593Smuzhiyun u32 ts_recent_age; 81*4882a593Smuzhiyun u32 total_rt; 82*4882a593Smuzhiyun u32 ka_timeout_delta; 83*4882a593Smuzhiyun u32 rt_timeout_delta; 84*4882a593Smuzhiyun u8 dup_ack_cnt; 85*4882a593Smuzhiyun u8 snd_wnd_probe_cnt; 86*4882a593Smuzhiyun u8 ka_probe_cnt; 87*4882a593Smuzhiyun u8 rt_cnt; 88*4882a593Smuzhiyun u32 flow_label; 89*4882a593Smuzhiyun u32 ka_timeout; 90*4882a593Smuzhiyun u32 ka_interval; 91*4882a593Smuzhiyun u32 max_rt_time; 92*4882a593Smuzhiyun u32 initial_rcv_wnd; 93*4882a593Smuzhiyun u8 ttl; 94*4882a593Smuzhiyun u8 tos_or_tc; 95*4882a593Smuzhiyun u16 remote_port; 96*4882a593Smuzhiyun u16 local_port; 97*4882a593Smuzhiyun u16 mss; 98*4882a593Smuzhiyun u8 snd_wnd_scale; 99*4882a593Smuzhiyun u8 rcv_wnd_scale; 100*4882a593Smuzhiyun u16 da_timeout_value; 101*4882a593Smuzhiyun u8 ack_frequency; 102*4882a593Smuzhiyun }; 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun struct qed_iscsi_params_update { 105*4882a593Smuzhiyun u8 update_flag; 106*4882a593Smuzhiyun #define QED_ISCSI_CONN_HD_EN BIT(0) 107*4882a593Smuzhiyun #define QED_ISCSI_CONN_DD_EN BIT(1) 108*4882a593Smuzhiyun #define QED_ISCSI_CONN_INITIAL_R2T BIT(2) 109*4882a593Smuzhiyun #define QED_ISCSI_CONN_IMMEDIATE_DATA BIT(3) 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun u32 max_seq_size; 112*4882a593Smuzhiyun u32 max_recv_pdu_length; 113*4882a593Smuzhiyun u32 max_send_pdu_length; 114*4882a593Smuzhiyun u32 first_seq_length; 115*4882a593Smuzhiyun u32 exp_stat_sn; 116*4882a593Smuzhiyun }; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun #define MAX_TID_BLOCKS_ISCSI (512) 119*4882a593Smuzhiyun struct qed_iscsi_tid { 120*4882a593Smuzhiyun u32 size; /* In bytes per task */ 121*4882a593Smuzhiyun u32 num_tids_per_block; 122*4882a593Smuzhiyun u8 *blocks[MAX_TID_BLOCKS_ISCSI]; 123*4882a593Smuzhiyun }; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun struct qed_iscsi_cb_ops { 126*4882a593Smuzhiyun struct qed_common_cb_ops common; 127*4882a593Smuzhiyun }; 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun /** 130*4882a593Smuzhiyun * struct qed_iscsi_ops - qed iSCSI operations. 131*4882a593Smuzhiyun * @common: common operations pointer 132*4882a593Smuzhiyun * @ll2: light L2 operations pointer 133*4882a593Smuzhiyun * @fill_dev_info: fills iSCSI specific information 134*4882a593Smuzhiyun * @param cdev 135*4882a593Smuzhiyun * @param info 136*4882a593Smuzhiyun * @return 0 on sucesss, otherwise error value. 137*4882a593Smuzhiyun * @register_ops: register iscsi operations 138*4882a593Smuzhiyun * @param cdev 139*4882a593Smuzhiyun * @param ops - specified using qed_iscsi_cb_ops 140*4882a593Smuzhiyun * @param cookie - driver private 141*4882a593Smuzhiyun * @start: iscsi in FW 142*4882a593Smuzhiyun * @param cdev 143*4882a593Smuzhiyun * @param tasks - qed will fill information about tasks 144*4882a593Smuzhiyun * return 0 on success, otherwise error value. 145*4882a593Smuzhiyun * @stop: iscsi in FW 146*4882a593Smuzhiyun * @param cdev 147*4882a593Smuzhiyun * return 0 on success, otherwise error value. 148*4882a593Smuzhiyun * @acquire_conn: acquire a new iscsi connection 149*4882a593Smuzhiyun * @param cdev 150*4882a593Smuzhiyun * @param handle - qed will fill handle that should be 151*4882a593Smuzhiyun * used henceforth as identifier of the 152*4882a593Smuzhiyun * connection. 153*4882a593Smuzhiyun * @param p_doorbell - qed will fill the address of the 154*4882a593Smuzhiyun * doorbell. 155*4882a593Smuzhiyun * @return 0 on sucesss, otherwise error value. 156*4882a593Smuzhiyun * @release_conn: release a previously acquired iscsi connection 157*4882a593Smuzhiyun * @param cdev 158*4882a593Smuzhiyun * @param handle - the connection handle. 159*4882a593Smuzhiyun * @return 0 on success, otherwise error value. 160*4882a593Smuzhiyun * @offload_conn: configures an offloaded connection 161*4882a593Smuzhiyun * @param cdev 162*4882a593Smuzhiyun * @param handle - the connection handle. 163*4882a593Smuzhiyun * @param conn_info - the configuration to use for the 164*4882a593Smuzhiyun * offload. 165*4882a593Smuzhiyun * @return 0 on success, otherwise error value. 166*4882a593Smuzhiyun * @update_conn: updates an offloaded connection 167*4882a593Smuzhiyun * @param cdev 168*4882a593Smuzhiyun * @param handle - the connection handle. 169*4882a593Smuzhiyun * @param conn_info - the configuration to use for the 170*4882a593Smuzhiyun * offload. 171*4882a593Smuzhiyun * @return 0 on success, otherwise error value. 172*4882a593Smuzhiyun * @destroy_conn: stops an offloaded connection 173*4882a593Smuzhiyun * @param cdev 174*4882a593Smuzhiyun * @param handle - the connection handle. 175*4882a593Smuzhiyun * @return 0 on success, otherwise error value. 176*4882a593Smuzhiyun * @clear_sq: clear all task in sq 177*4882a593Smuzhiyun * @param cdev 178*4882a593Smuzhiyun * @param handle - the connection handle. 179*4882a593Smuzhiyun * @return 0 on success, otherwise error value. 180*4882a593Smuzhiyun * @get_stats: iSCSI related statistics 181*4882a593Smuzhiyun * @param cdev 182*4882a593Smuzhiyun * @param stats - pointer to struck that would be filled 183*4882a593Smuzhiyun * we stats 184*4882a593Smuzhiyun * @return 0 on success, error otherwise. 185*4882a593Smuzhiyun * @change_mac Change MAC of interface 186*4882a593Smuzhiyun * @param cdev 187*4882a593Smuzhiyun * @param handle - the connection handle. 188*4882a593Smuzhiyun * @param mac - new MAC to configure. 189*4882a593Smuzhiyun * @return 0 on success, otherwise error value. 190*4882a593Smuzhiyun */ 191*4882a593Smuzhiyun struct qed_iscsi_ops { 192*4882a593Smuzhiyun const struct qed_common_ops *common; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun const struct qed_ll2_ops *ll2; 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun int (*fill_dev_info)(struct qed_dev *cdev, 197*4882a593Smuzhiyun struct qed_dev_iscsi_info *info); 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun void (*register_ops)(struct qed_dev *cdev, 200*4882a593Smuzhiyun struct qed_iscsi_cb_ops *ops, void *cookie); 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun int (*start)(struct qed_dev *cdev, 203*4882a593Smuzhiyun struct qed_iscsi_tid *tasks, 204*4882a593Smuzhiyun void *event_context, iscsi_event_cb_t async_event_cb); 205*4882a593Smuzhiyun 206*4882a593Smuzhiyun int (*stop)(struct qed_dev *cdev); 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun int (*acquire_conn)(struct qed_dev *cdev, 209*4882a593Smuzhiyun u32 *handle, 210*4882a593Smuzhiyun u32 *fw_cid, void __iomem **p_doorbell); 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun int (*release_conn)(struct qed_dev *cdev, u32 handle); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun int (*offload_conn)(struct qed_dev *cdev, 215*4882a593Smuzhiyun u32 handle, 216*4882a593Smuzhiyun struct qed_iscsi_params_offload *conn_info); 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun int (*update_conn)(struct qed_dev *cdev, 219*4882a593Smuzhiyun u32 handle, 220*4882a593Smuzhiyun struct qed_iscsi_params_update *conn_info); 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun int (*destroy_conn)(struct qed_dev *cdev, u32 handle, u8 abrt_conn); 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun int (*clear_sq)(struct qed_dev *cdev, u32 handle); 225*4882a593Smuzhiyun 226*4882a593Smuzhiyun int (*get_stats)(struct qed_dev *cdev, 227*4882a593Smuzhiyun struct qed_iscsi_stats *stats); 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun int (*change_mac)(struct qed_dev *cdev, u32 handle, const u8 *mac); 230*4882a593Smuzhiyun }; 231*4882a593Smuzhiyun 232*4882a593Smuzhiyun const struct qed_iscsi_ops *qed_get_iscsi_ops(void); 233*4882a593Smuzhiyun void qed_put_iscsi_ops(void); 234*4882a593Smuzhiyun #endif 235