/* QLogic FCoE Offload Driver
 * Copyright (c) 2016-2018 Cavium Inc.
 *
 * This software is available under the terms of the GNU General Public License
 * (GPL) Version 2, available from the file COPYING in the main directory of
 * this source tree.
 */
#ifndef _SCSI_FW_FUNCS_H
#define _SCSI_FW_FUNCS_H
#include <linux/qed/common_hsi.h>
#include <linux/qed/storage_common.h>
#include <linux/qed/fcoe_common.h>

struct scsi_sgl_task_params {
	struct scsi_sge *sgl;
	struct regpair sgl_phys_addr;
	u32 total_buffer_size;
	u16 num_sges;

	 /* true if SGL contains a small (< 4KB) SGE in middle(not 1st or last)
	  * -> relevant for tx only
	  */
	bool small_mid_sge;
};

struct scsi_dif_task_params {
	u32 initial_ref_tag;
	bool initial_ref_tag_is_valid;
	u16 application_tag;
	u16 application_tag_mask;
	u16 dif_block_size_log;
	bool dif_on_network;
	bool dif_on_host;
	u8 host_guard_type;
	u8 protection_type;
	u8 ref_tag_mask;
	bool crc_seed;

	 /* Enable Connection error upon DIF error (segments with DIF errors are
	  * dropped)
	  */
	bool tx_dif_conn_err_en;
	bool ignore_app_tag;
	bool keep_ref_tag_const;
	bool validate_guard;
	bool validate_app_tag;
	bool validate_ref_tag;
	bool forward_guard;
	bool forward_app_tag;
	bool forward_ref_tag;
	bool forward_app_tag_with_mask;
	bool forward_ref_tag_with_mask;
};

struct scsi_initiator_cmd_params {
	 /* for cdb_size > default CDB size (extended CDB > 16 bytes) ->
	  * pointer to the CDB buffer SGE
	  */
	struct scsi_sge extended_cdb_sge;

	/* Physical address of sense data buffer for sense data - 256B buffer */
	struct regpair sense_data_buffer_phys_addr;
};

/**
 * @brief scsi_is_slow_sgl - checks for slow SGL
 *
 * @param num_sges - number of sges in SGL
 * @param small_mid_sge - True is the SGL contains an SGE which is smaller than
 * 4KB and its not the 1st or last SGE in the SGL
 */
bool scsi_is_slow_sgl(u16 num_sges, bool small_mid_sge);

/**
 * @brief init_scsi_sgl_context - initializes SGL task context
 *
 * @param sgl_params - SGL context parameters to initialize (output parameter)
 * @param data_desc - context struct containing SGEs array to set (output
 * parameter)
 * @param sgl_task_params - SGL parameters (input)
 */
void init_scsi_sgl_context(struct scsi_sgl_params *sgl_params,
	struct scsi_cached_sges *ctx_data_desc,
	struct scsi_sgl_task_params *sgl_task_params);
#endif
