1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* QLogic FCoE Offload Driver 3*4882a593Smuzhiyun * Copyright (c) 2016-2018 Cavium Inc. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun #ifndef _SCSI_FW_FUNCS_H 6*4882a593Smuzhiyun #define _SCSI_FW_FUNCS_H 7*4882a593Smuzhiyun #include <linux/qed/common_hsi.h> 8*4882a593Smuzhiyun #include <linux/qed/storage_common.h> 9*4882a593Smuzhiyun #include <linux/qed/fcoe_common.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct scsi_sgl_task_params { 12*4882a593Smuzhiyun struct scsi_sge *sgl; 13*4882a593Smuzhiyun struct regpair sgl_phys_addr; 14*4882a593Smuzhiyun u32 total_buffer_size; 15*4882a593Smuzhiyun u16 num_sges; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun /* true if SGL contains a small (< 4KB) SGE in middle(not 1st or last) 18*4882a593Smuzhiyun * -> relevant for tx only 19*4882a593Smuzhiyun */ 20*4882a593Smuzhiyun bool small_mid_sge; 21*4882a593Smuzhiyun }; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct scsi_dif_task_params { 24*4882a593Smuzhiyun u32 initial_ref_tag; 25*4882a593Smuzhiyun bool initial_ref_tag_is_valid; 26*4882a593Smuzhiyun u16 application_tag; 27*4882a593Smuzhiyun u16 application_tag_mask; 28*4882a593Smuzhiyun u16 dif_block_size_log; 29*4882a593Smuzhiyun bool dif_on_network; 30*4882a593Smuzhiyun bool dif_on_host; 31*4882a593Smuzhiyun u8 host_guard_type; 32*4882a593Smuzhiyun u8 protection_type; 33*4882a593Smuzhiyun u8 ref_tag_mask; 34*4882a593Smuzhiyun bool crc_seed; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* Enable Connection error upon DIF error (segments with DIF errors are 37*4882a593Smuzhiyun * dropped) 38*4882a593Smuzhiyun */ 39*4882a593Smuzhiyun bool tx_dif_conn_err_en; 40*4882a593Smuzhiyun bool ignore_app_tag; 41*4882a593Smuzhiyun bool keep_ref_tag_const; 42*4882a593Smuzhiyun bool validate_guard; 43*4882a593Smuzhiyun bool validate_app_tag; 44*4882a593Smuzhiyun bool validate_ref_tag; 45*4882a593Smuzhiyun bool forward_guard; 46*4882a593Smuzhiyun bool forward_app_tag; 47*4882a593Smuzhiyun bool forward_ref_tag; 48*4882a593Smuzhiyun bool forward_app_tag_with_mask; 49*4882a593Smuzhiyun bool forward_ref_tag_with_mask; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun struct scsi_initiator_cmd_params { 53*4882a593Smuzhiyun /* for cdb_size > default CDB size (extended CDB > 16 bytes) -> 54*4882a593Smuzhiyun * pointer to the CDB buffer SGE 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun struct scsi_sge extended_cdb_sge; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun /* Physical address of sense data buffer for sense data - 256B buffer */ 59*4882a593Smuzhiyun struct regpair sense_data_buffer_phys_addr; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /** 63*4882a593Smuzhiyun * @brief scsi_is_slow_sgl - checks for slow SGL 64*4882a593Smuzhiyun * 65*4882a593Smuzhiyun * @param num_sges - number of sges in SGL 66*4882a593Smuzhiyun * @param small_mid_sge - True is the SGL contains an SGE which is smaller than 67*4882a593Smuzhiyun * 4KB and its not the 1st or last SGE in the SGL 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun bool scsi_is_slow_sgl(u16 num_sges, bool small_mid_sge); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun /** 72*4882a593Smuzhiyun * @brief init_scsi_sgl_context - initializes SGL task context 73*4882a593Smuzhiyun * 74*4882a593Smuzhiyun * @param sgl_params - SGL context parameters to initialize (output parameter) 75*4882a593Smuzhiyun * @param data_desc - context struct containing SGEs array to set (output 76*4882a593Smuzhiyun * parameter) 77*4882a593Smuzhiyun * @param sgl_task_params - SGL parameters (input) 78*4882a593Smuzhiyun */ 79*4882a593Smuzhiyun void init_scsi_sgl_context(struct scsi_sgl_params *sgl_params, 80*4882a593Smuzhiyun struct scsi_cached_sges *ctx_data_desc, 81*4882a593Smuzhiyun struct scsi_sgl_task_params *sgl_task_params); 82*4882a593Smuzhiyun #endif 83