Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4d4df193 authored by Harihara Kadayam's avatar Harihara Kadayam Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Add ISP84XX support.



Signed-off-by: default avatarRavi Anand <ravi.anand@qlogic.com>
Additional cleanups and
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent b93480e3
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1291,7 +1291,7 @@ qla2x00_init_host_attr(scsi_qla_host_t *ha)
	if (IS_QLA25XX(ha))
		speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
		    FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
	else if (IS_QLA24XX(ha) || IS_QLA54XX(ha))
	else if (IS_QLA24XX_TYPE(ha))
		speed = FC_PORTSPEED_4GBIT | FC_PORTSPEED_2GBIT |
		    FC_PORTSPEED_1GBIT;
	else if (IS_QLA23XX(ha))
+8 −0
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
/* #define QL_DEBUG_LEVEL_13 */ /* Output fdmi function trace msgs */
/* #define QL_DEBUG_LEVEL_14 */ /* Output RSCN trace msgs */
/* #define QL_DEBUG_LEVEL_15 */ /* Output NPIV trace msgs */
/* #define QL_DEBUG_LEVEL_16 */ /* Output ISP84XX trace msgs */

/*
* Macros use for debugging the driver.
@@ -41,6 +42,7 @@
#define DEBUG2_9_10(x)	do { if (ql2xextended_error_logging) { x; } } while (0)
#define DEBUG2_11(x)	do { if (ql2xextended_error_logging) { x; } } while (0)
#define DEBUG2_13(x)	do { if (ql2xextended_error_logging) { x; } } while (0)
#define DEBUG2_16(x)	do { if (ql2xextended_error_logging) { x; } } while (0)

#if defined(QL_DEBUG_LEVEL_3)
#define DEBUG3(x)	do {x;} while (0)
@@ -120,6 +122,12 @@
#define DEBUG15(x)	do {} while (0)
#endif

#if defined(QL_DEBUG_LEVEL_16)
#define DEBUG16(x)	do {x;} while (0)
#else
#define DEBUG16(x)	do {} while (0)
#endif

/*
 * Firmware Dump structure definition
 */
+25 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#include <linux/workqueue.h>
#include <linux/firmware.h>
#include <linux/aer.h>
#include <linux/mutex.h>
#include <asm/semaphore.h>

#include <scsi/scsi.h>
@@ -2142,6 +2143,21 @@ struct qla_work_evt {
	} u;
};

struct qla_chip_state_84xx {
	struct list_head list;
	struct kref kref;

	void *bus;
	spinlock_t access_lock;
	struct mutex fw_update_mutex;
	uint32_t fw_update;
	uint32_t op_fw_version;
	uint32_t op_fw_size;
	uint32_t op_fw_seq_size;
	uint32_t diag_fw_version;
	uint32_t gold_fw_version;
};

/*
 * Linux Host Adapter structure
 */
@@ -2230,6 +2246,7 @@ typedef struct scsi_qla_host {
#define	DFLG_NO_CABLE			BIT_4

#define PCI_DEVICE_ID_QLOGIC_ISP2532	0x2532
#define PCI_DEVICE_ID_QLOGIC_ISP8432	0x8432
	uint32_t	device_type;
#define DT_ISP2100			BIT_0
#define DT_ISP2200			BIT_1
@@ -2243,7 +2260,8 @@ typedef struct scsi_qla_host {
#define DT_ISP5422			BIT_9
#define DT_ISP5432			BIT_10
#define DT_ISP2532			BIT_11
#define DT_ISP_LAST			(DT_ISP2532 << 1)
#define DT_ISP8432			BIT_12
#define DT_ISP_LAST			(DT_ISP8432 << 1)

#define DT_IIDMA			BIT_26
#define DT_FWI2				BIT_27
@@ -2265,12 +2283,16 @@ typedef struct scsi_qla_host {
#define IS_QLA5422(ha)	(DT_MASK(ha) & DT_ISP5422)
#define IS_QLA5432(ha)	(DT_MASK(ha) & DT_ISP5432)
#define IS_QLA2532(ha)	(DT_MASK(ha) & DT_ISP2532)
#define IS_QLA8432(ha)	(DT_MASK(ha) & DT_ISP8432)

#define IS_QLA23XX(ha)	(IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \
    			 IS_QLA6312(ha) || IS_QLA6322(ha))
#define IS_QLA24XX(ha)	(IS_QLA2422(ha) || IS_QLA2432(ha))
#define IS_QLA54XX(ha)	(IS_QLA5422(ha) || IS_QLA5432(ha))
#define IS_QLA25XX(ha)	(IS_QLA2532(ha))
#define IS_QLA84XX(ha)	(IS_QLA8432(ha))
#define IS_QLA24XX_TYPE(ha)	(IS_QLA24XX(ha) || IS_QLA54XX(ha) || \
			IS_QLA84XX(ha))

#define IS_IIDMA_CAPABLE(ha)	((ha)->device_type & DT_IIDMA)
#define IS_FWI2_CAPABLE(ha)	((ha)->device_type & DT_FWI2)
@@ -2575,6 +2597,8 @@ typedef struct scsi_qla_host {
#define VP_ERR_ADAP_NORESOURCES	5
	uint16_t	max_npiv_vports;	/* 63 or 125 per topoloty */
	int		cur_vport_count;

	struct qla_chip_state_84xx *cs84xx;
} scsi_qla_host_t;


+123 −0
Original line number Diff line number Diff line
@@ -1218,4 +1218,127 @@ struct qla_fdt_layout {
	uint8_t protect_sec_cmd;
	uint8_t unused2[65];
};

/* 84XX Support **************************************************************/

#define MBA_ISP84XX_ALERT	0x800f  /* Alert Notification. */
#define A84_PANIC_RECOVERY	0x1
#define A84_OP_LOGIN_COMPLETE	0x2
#define A84_DIAG_LOGIN_COMPLETE	0x3
#define A84_GOLD_LOGIN_COMPLETE	0x4

#define MBC_ISP84XX_RESET	0x3a    /* Reset. */

#define FSTATE_REMOTE_FC_DOWN	BIT_0
#define FSTATE_NSL_LINK_DOWN	BIT_1
#define FSTATE_IS_DIAG_FW	BIT_2
#define FSTATE_LOGGED_IN	BIT_3
#define FSTATE_WAITING_FOR_VERIFY	BIT_4

#define VERIFY_CHIP_IOCB_TYPE	0x1B
struct verify_chip_entry_84xx {
	uint8_t entry_type;
	uint8_t entry_count;
	uint8_t sys_defined;
	uint8_t entry_status;

	uint32_t handle;

	uint16_t options;
#define VCO_DONT_UPDATE_FW	BIT_0
#define VCO_FORCE_UPDATE	BIT_1
#define VCO_DONT_RESET_UPDATE	BIT_2
#define VCO_DIAG_FW		BIT_3
#define VCO_END_OF_DATA		BIT_14
#define VCO_ENABLE_DSD		BIT_15

	uint16_t reserved_1;

	uint16_t data_seg_cnt;
	uint16_t reserved_2[3];

	uint32_t fw_ver;
	uint32_t exchange_address;

	uint32_t reserved_3[3];
	uint32_t fw_size;
	uint32_t fw_seq_size;
	uint32_t relative_offset;

	uint32_t dseg_address[2];
	uint32_t dseg_length;
};

struct verify_chip_rsp_84xx {
	uint8_t entry_type;
	uint8_t entry_count;
	uint8_t sys_defined;
	uint8_t entry_status;

	uint32_t handle;

	uint16_t comp_status;
#define CS_VCS_CHIP_FAILURE	0x3
#define CS_VCS_BAD_EXCHANGE	0x8
#define CS_VCS_SEQ_COMPLETEi	0x40

	uint16_t failure_code;
#define VFC_CHECKSUM_ERROR	0x1
#define VFC_INVALID_LEN		0x2
#define VFC_ALREADY_IN_PROGRESS	0x8

	uint16_t reserved_1[4];

	uint32_t fw_ver;
	uint32_t exchange_address;

	uint32_t reserved_2[6];
};

#define ACCESS_CHIP_IOCB_TYPE	0x2B
struct access_chip_84xx {
	uint8_t entry_type;
	uint8_t entry_count;
	uint8_t sys_defined;
	uint8_t entry_status;

	uint32_t handle;

	uint16_t options;
#define ACO_DUMP_MEMORY		0x0
#define ACO_LOAD_MEMORY		0x1
#define ACO_CHANGE_CONFIG_PARAM	0x2
#define ACO_REQUEST_INFO	0x3

	uint16_t reserved1;

	uint16_t dseg_count;
	uint16_t reserved2[3];

	uint32_t parameter1;
	uint32_t parameter2;
	uint32_t parameter3;

	uint32_t reserved3[3];
	uint32_t total_byte_cnt;
	uint32_t reserved4;

	uint32_t dseg_address[2];
	uint32_t dseg_length;
};

struct access_chip_rsp_84xx {
	uint8_t entry_type;
	uint8_t entry_count;
	uint8_t sys_defined;
	uint8_t entry_status;

	uint32_t handle;

	uint16_t comp_status;
	uint16_t failure_code;
	uint32_t residual_count;

	uint32_t reserved[12];
};
#endif
+8 −0
Original line number Diff line number Diff line
@@ -47,6 +47,8 @@ extern void qla2x00_update_fcport(scsi_qla_host_t *, fc_port_t *);
extern void qla2x00_alloc_fw_dump(scsi_qla_host_t *);
extern void qla2x00_try_to_stop_firmware(scsi_qla_host_t *);

extern void qla84xx_put_chip(struct scsi_qla_host *);

/*
 * Global Data in qla_os.c source file.
 */
@@ -149,6 +151,10 @@ qla2x00_verify_checksum(scsi_qla_host_t *, uint32_t);
extern int
qla2x00_issue_iocb(scsi_qla_host_t *, void *, dma_addr_t, size_t);

extern int
qla2x00_issue_iocb_timeout(scsi_qla_host_t *, void *, dma_addr_t, size_t,
    uint32_t);

extern int
qla2x00_abort_command(scsi_qla_host_t *, srb_t *);

@@ -249,6 +255,8 @@ qla2x00_read_sfp(scsi_qla_host_t *, dma_addr_t, uint16_t, uint16_t, uint16_t);
extern int
qla2x00_set_idma_speed(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t *);

extern int qla84xx_verify_chip(struct scsi_qla_host *, uint16_t *);

/*
 * Global Function Prototypes in qla_isr.c source file.
 */
Loading