162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2021 Broadcom. All Rights Reserved. The term
462306a36Sopenharmony_ci * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#if !defined(__EFCT_DRIVER_H__)
862306a36Sopenharmony_ci#define __EFCT_DRIVER_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/***************************************************************************
1162306a36Sopenharmony_ci * OS specific includes
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci#include <linux/module.h>
1462306a36Sopenharmony_ci#include <linux/debugfs.h>
1562306a36Sopenharmony_ci#include <linux/firmware.h>
1662306a36Sopenharmony_ci#include "../include/efc_common.h"
1762306a36Sopenharmony_ci#include "../libefc/efclib.h"
1862306a36Sopenharmony_ci#include "efct_hw.h"
1962306a36Sopenharmony_ci#include "efct_io.h"
2062306a36Sopenharmony_ci#include "efct_xport.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define EFCT_DRIVER_NAME			"efct"
2362306a36Sopenharmony_ci#define EFCT_DRIVER_VERSION			"1.0.0.0"
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci/* EFCT_DEFAULT_FILTER-
2662306a36Sopenharmony_ci * MRQ filter to segregate the IO flow.
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_ci#define EFCT_DEFAULT_FILTER			"0x01ff22ff,0,0,0"
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* EFCT_OS_MAX_ISR_TIME_MSEC -
3162306a36Sopenharmony_ci * maximum time driver code should spend in an interrupt
3262306a36Sopenharmony_ci * or kernel thread context without yielding
3362306a36Sopenharmony_ci */
3462306a36Sopenharmony_ci#define EFCT_OS_MAX_ISR_TIME_MSEC		1000
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define EFCT_FC_MAX_SGL				64
3762306a36Sopenharmony_ci#define EFCT_FC_DIF_SEED			0
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci/* Watermark */
4062306a36Sopenharmony_ci#define EFCT_WATERMARK_HIGH_PCT			90
4162306a36Sopenharmony_ci#define EFCT_WATERMARK_LOW_PCT			80
4262306a36Sopenharmony_ci#define EFCT_IO_WATERMARK_PER_INITIATOR		8
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define EFCT_PCI_MAX_REGS			6
4562306a36Sopenharmony_ci#define MAX_PCI_INTERRUPTS			16
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct efct_intr_context {
4862306a36Sopenharmony_ci	struct efct		*efct;
4962306a36Sopenharmony_ci	u32			index;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistruct efct {
5362306a36Sopenharmony_ci	struct pci_dev			*pci;
5462306a36Sopenharmony_ci	void __iomem			*reg[EFCT_PCI_MAX_REGS];
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	u32				n_msix_vec;
5762306a36Sopenharmony_ci	bool				attached;
5862306a36Sopenharmony_ci	bool				soft_wwn_enable;
5962306a36Sopenharmony_ci	u8				efct_req_fw_upgrade;
6062306a36Sopenharmony_ci	struct efct_intr_context	intr_context[MAX_PCI_INTERRUPTS];
6162306a36Sopenharmony_ci	u32				numa_node;
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	char				name[EFC_NAME_LENGTH];
6462306a36Sopenharmony_ci	u32				instance_index;
6562306a36Sopenharmony_ci	struct list_head		list_entry;
6662306a36Sopenharmony_ci	struct efct_scsi_tgt		tgt_efct;
6762306a36Sopenharmony_ci	struct efct_xport		*xport;
6862306a36Sopenharmony_ci	struct efc			*efcport;
6962306a36Sopenharmony_ci	struct Scsi_Host		*shost;
7062306a36Sopenharmony_ci	int				logmask;
7162306a36Sopenharmony_ci	u32				max_isr_time_msec;
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	const char			*desc;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci	const char			*model;
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	struct efct_hw			hw;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	u32				rq_selection_policy;
8062306a36Sopenharmony_ci	char				*filter_def;
8162306a36Sopenharmony_ci	int				topology;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	/* Look up for target node */
8462306a36Sopenharmony_ci	struct xarray			lookup;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	/*
8762306a36Sopenharmony_ci	 * Target IO timer value:
8862306a36Sopenharmony_ci	 * Zero: target command timeout disabled.
8962306a36Sopenharmony_ci	 * Non-zero: Timeout value, in seconds, for target commands
9062306a36Sopenharmony_ci	 */
9162306a36Sopenharmony_ci	u32				target_io_timer_sec;
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci	int				speed;
9462306a36Sopenharmony_ci	struct dentry			*sess_debugfs_dir;
9562306a36Sopenharmony_ci};
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci#define FW_WRITE_BUFSIZE		(64 * 1024)
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistruct efct_fw_write_result {
10062306a36Sopenharmony_ci	struct completion done;
10162306a36Sopenharmony_ci	int status;
10262306a36Sopenharmony_ci	u32 actual_xfer;
10362306a36Sopenharmony_ci	u32 change_status;
10462306a36Sopenharmony_ci};
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ciextern struct list_head			efct_devices;
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#endif /* __EFCT_DRIVER_H__ */
109