Commit f73cb695 authored by Chad Dupuis's avatar Chad Dupuis Committed by James Bottomley

[SCSI] qla2xxx: Add support for ISP2071.

Signed-off-by: default avatarChad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: default avatarArmen Baloyan <armen.baloyan@qlogic.com>
Signed-off-by: default avatarJoe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: default avatarSaurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 624f28be
qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \ qla2xxx-y := qla_os.o qla_init.o qla_mbx.o qla_iocb.o qla_isr.o qla_gs.o \
qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \ qla_dbg.o qla_sup.o qla_attr.o qla_mid.o qla_dfs.o qla_bsg.o \
qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_nx.o qla_mr.o qla_nx2.o qla_target.o qla_tmpl.o
obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o obj-$(CONFIG_SCSI_QLA_FC) += qla2xxx.o
obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o obj-$(CONFIG_TCM_QLA2XXX) += tcm_qla2xxx.o
...@@ -146,6 +146,92 @@ static struct bin_attribute sysfs_fw_dump_attr = { ...@@ -146,6 +146,92 @@ static struct bin_attribute sysfs_fw_dump_attr = {
.write = qla2x00_sysfs_write_fw_dump, .write = qla2x00_sysfs_write_fw_dump,
}; };
static ssize_t
qla2x00_sysfs_read_fw_dump_template(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
{
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
if (!ha->fw_dump_template || !ha->fw_dump_template_len)
return 0;
ql_dbg(ql_dbg_user, vha, 0x70e2,
"chunk <- off=%llx count=%lx\n", off, count);
return memory_read_from_buffer(buf, count, &off,
ha->fw_dump_template, ha->fw_dump_template_len);
}
static ssize_t
qla2x00_sysfs_write_fw_dump_template(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
{
struct scsi_qla_host *vha = shost_priv(dev_to_shost(container_of(kobj,
struct device, kobj)));
struct qla_hw_data *ha = vha->hw;
uint32_t size;
if (off == 0) {
if (ha->fw_dump)
vfree(ha->fw_dump);
if (ha->fw_dump_template)
vfree(ha->fw_dump_template);
ha->fw_dump = NULL;
ha->fw_dump_len = 0;
ha->fw_dump_template = NULL;
ha->fw_dump_template_len = 0;
size = qla27xx_fwdt_template_size(buf);
ql_dbg(ql_dbg_user, vha, 0x70d1,
"-> allocating fwdt (%x bytes)...\n", size);
ha->fw_dump_template = vmalloc(size);
if (!ha->fw_dump_template) {
ql_log(ql_log_warn, vha, 0x70d2,
"Failed allocate fwdt (%x bytes).\n", size);
return -ENOMEM;
}
ha->fw_dump_template_len = size;
}
if (off + count > ha->fw_dump_template_len) {
count = ha->fw_dump_template_len - off;
ql_dbg(ql_dbg_user, vha, 0x70d3,
"chunk -> truncating to %lx bytes.\n", count);
}
ql_dbg(ql_dbg_user, vha, 0x70d4,
"chunk -> off=%llx count=%lx\n", off, count);
memcpy(ha->fw_dump_template + off, buf, count);
if (off + count == ha->fw_dump_template_len) {
size = qla27xx_fwdt_calculate_dump_size(vha);
ql_dbg(ql_dbg_user, vha, 0x70d5,
"-> allocating fwdump (%x bytes)...\n", size);
ha->fw_dump = vmalloc(size);
if (!ha->fw_dump) {
ql_log(ql_log_warn, vha, 0x70d6,
"Failed allocate fwdump (%x bytes).\n", size);
return -ENOMEM;
}
ha->fw_dump_len = size;
}
return count;
}
static struct bin_attribute sysfs_fw_dump_template_attr = {
.attr = {
.name = "fw_dump_template",
.mode = S_IRUSR | S_IWUSR,
},
.size = 0,
.read = qla2x00_sysfs_read_fw_dump_template,
.write = qla2x00_sysfs_write_fw_dump_template,
};
static ssize_t static ssize_t
qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj, qla2x00_sysfs_read_nvram(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, struct bin_attribute *bin_attr,
...@@ -845,6 +931,7 @@ static struct sysfs_entry { ...@@ -845,6 +931,7 @@ static struct sysfs_entry {
int is4GBp_only; int is4GBp_only;
} bin_file_entries[] = { } bin_file_entries[] = {
{ "fw_dump", &sysfs_fw_dump_attr, }, { "fw_dump", &sysfs_fw_dump_attr, },
{ "fw_dump_template", &sysfs_fw_dump_template_attr, 0x27 },
{ "nvram", &sysfs_nvram_attr, }, { "nvram", &sysfs_nvram_attr, },
{ "optrom", &sysfs_optrom_attr, }, { "optrom", &sysfs_optrom_attr, },
{ "optrom_ctl", &sysfs_optrom_ctl_attr, }, { "optrom_ctl", &sysfs_optrom_ctl_attr, },
...@@ -870,6 +957,8 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha) ...@@ -870,6 +957,8 @@ qla2x00_alloc_sysfs_attr(scsi_qla_host_t *vha)
continue; continue;
if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw))) if (iter->is4GBp_only == 3 && !(IS_CNA_CAPABLE(vha->hw)))
continue; continue;
if (iter->is4GBp_only == 0x27 && !IS_QLA27XX(vha->hw))
continue;
ret = sysfs_create_bin_file(&host->shost_gendev.kobj, ret = sysfs_create_bin_file(&host->shost_gendev.kobj,
iter->attr); iter->attr);
...@@ -1210,7 +1299,7 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev, ...@@ -1210,7 +1299,7 @@ qla2x00_optrom_gold_fw_version_show(struct device *dev,
scsi_qla_host_t *vha = shost_priv(class_to_shost(dev)); scsi_qla_host_t *vha = shost_priv(class_to_shost(dev));
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha)) if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA27XX(ha))
return scnprintf(buf, PAGE_SIZE, "\n"); return scnprintf(buf, PAGE_SIZE, "\n");
return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n", return scnprintf(buf, PAGE_SIZE, "%d.%02d.%02d (%d)\n",
...@@ -1532,6 +1621,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost) ...@@ -1532,6 +1621,9 @@ qla2x00_get_host_speed(struct Scsi_Host *shost)
case PORT_SPEED_16GB: case PORT_SPEED_16GB:
speed = FC_PORTSPEED_16GBIT; speed = FC_PORTSPEED_16GBIT;
break; break;
case PORT_SPEED_32GB:
speed = FC_PORTSPEED_32GBIT;
break;
} }
fc_host_speed(shost) = speed; fc_host_speed(shost) = speed;
} }
...@@ -2183,6 +2275,9 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha) ...@@ -2183,6 +2275,9 @@ qla2x00_init_host_attr(scsi_qla_host_t *vha)
else if (IS_QLAFX00(ha)) else if (IS_QLAFX00(ha))
speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT | speed = FC_PORTSPEED_8GBIT | FC_PORTSPEED_4GBIT |
FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT; FC_PORTSPEED_2GBIT | FC_PORTSPEED_1GBIT;
else if (IS_QLA27XX(ha))
speed = FC_PORTSPEED_32GBIT | FC_PORTSPEED_16GBIT |
FC_PORTSPEED_8GBIT;
else else
speed = FC_PORTSPEED_1GBIT; speed = FC_PORTSPEED_1GBIT;
fc_host_supported_speeds(vha->host) = speed; fc_host_supported_speeds(vha->host) = speed;
......
...@@ -11,13 +11,15 @@ ...@@ -11,13 +11,15 @@
* ---------------------------------------------------------------------- * ----------------------------------------------------------------------
* | Level | Last Value Used | Holes | * | Level | Last Value Used | Holes |
* ---------------------------------------------------------------------- * ----------------------------------------------------------------------
* | Module Init and Probe | 0x015b | 0x4b,0xba,0xfa | * | Module Init and Probe | 0x017d | 0x004b,0x0141 |
* | | | 0x0x015a | * | | | 0x0144,0x0146 |
* | Mailbox commands | 0x1187 | 0x111a-0x111b | * | | | 0x015b-0x0160 |
* | | | 0x1155-0x1158 | * | | | 0x016e-0x0170 |
* | | | 0x1018-0x1019 | * | Mailbox commands | 0x1187 | 0x1018-0x1019 |
* | | | 0x10ca |
* | | | 0x1115-0x1116 | * | | | 0x1115-0x1116 |
* | | | 0x10ca | * | | | 0x111a-0x111b |
* | | | 0x1155-0x1158 |
* | Device Discovery | 0x2095 | 0x2020-0x2022, | * | Device Discovery | 0x2095 | 0x2020-0x2022, |
* | | | 0x2011-0x2012, | * | | | 0x2011-0x2012, |
* | | | 0x2016 | * | | | 0x2016 |
...@@ -33,17 +35,15 @@ ...@@ -33,17 +35,15 @@
* | | | 0x5084,0x5075 | * | | | 0x5084,0x5075 |
* | | | 0x503d,0x5044 | * | | | 0x503d,0x5044 |
* | Timer Routines | 0x6012 | | * | Timer Routines | 0x6012 | |
* | User Space Interactions | 0x70e1 | 0x7018,0x702e, | * | User Space Interactions | 0x70e2 | 0x7018,0x702e |
* | | | 0x7020,0x7024, | * | | | 0x7020,0x7024 |
* | | | 0x7039,0x7045, | * | | | 0x7039,0x7045 |
* | | | 0x7073-0x7075, | * | | | 0x7073-0x7075 |
* | | | 0x707b,0x708c, | * | | | 0x70a5-0x70a6 |
* | | | 0x70a5,0x70a6, | * | | | 0x70a8,0x70ab |
* | | | 0x70a8,0x70ab, | * | | | 0x70ad-0x70ae |
* | | | 0x70ad-0x70ae, | * | | | 0x70d7-0x70db |
* | | | 0x70d1-0x70db, | * | | | 0x70de-0x70df |
* | | | 0x7047,0x703b |
* | | | 0x70de-0x70df, |
* | Task Management | 0x803d | 0x8025-0x8026 | * | Task Management | 0x803d | 0x8025-0x8026 |
* | | | 0x800b,0x8039 | * | | | 0x800b,0x8039 |
* | AER/EEH | 0x9011 | | * | AER/EEH | 0x9011 | |
...@@ -59,7 +59,11 @@ ...@@ -59,7 +59,11 @@
* | | | 0xb13c-0xb140 | * | | | 0xb13c-0xb140 |
* | | | 0xb149 | * | | | 0xb149 |
* | MultiQ | 0xc00c | | * | MultiQ | 0xc00c | |
* | Misc | 0xd010 | | * | Misc | 0xd2ff | 0xd017-0xd019 |
* | | | 0xd020 |
* | | | 0xd02e-0xd0ff |
* | | | 0xd101-0xd1fe |
* | | | 0xd212-0xd2fe |
* | Target Mode | 0xe070 | 0xe021 | * | Target Mode | 0xe070 | 0xe021 |
* | Target Mode Management | 0xf072 | 0xf002-0xf003 | * | Target Mode Management | 0xf072 | 0xf002-0xf003 |
* | | | 0xf046-0xf049 | * | | | 0xf046-0xf049 |
...@@ -104,7 +108,87 @@ qla2xxx_copy_queues(struct qla_hw_data *ha, void *ptr) ...@@ -104,7 +108,87 @@ qla2xxx_copy_queues(struct qla_hw_data *ha, void *ptr)
return ptr + (rsp->length * sizeof(response_t)); return ptr + (rsp->length * sizeof(response_t));
} }
static int int
qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
uint32_t ram_dwords, void **nxt)
{
int rval;
uint32_t cnt, stat, timer, dwords, idx;
uint16_t mb0, mb1;
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
dma_addr_t dump_dma = ha->gid_list_dma;
uint32_t *dump = (uint32_t *)ha->gid_list;
rval = QLA_SUCCESS;
mb0 = 0;
WRT_REG_WORD(&reg->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
dwords = qla2x00_gid_list_size(ha) / 4;
for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
cnt += dwords, addr += dwords) {
if (cnt + dwords > ram_dwords)
dwords = ram_dwords - cnt;
WRT_REG_WORD(&reg->mailbox1, LSW(addr));
WRT_REG_WORD(&reg->mailbox8, MSW(addr));
WRT_REG_WORD(&reg->mailbox2, MSW(dump_dma));
WRT_REG_WORD(&reg->mailbox3, LSW(dump_dma));
WRT_REG_WORD(&reg->mailbox6, MSW(MSD(dump_dma)));
WRT_REG_WORD(&reg->mailbox7, LSW(MSD(dump_dma)));
WRT_REG_WORD(&reg->mailbox4, MSW(dwords));
WRT_REG_WORD(&reg->mailbox5, LSW(dwords));
WRT_REG_WORD(&reg->mailbox9, 0);
WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
ha->flags.mbox_int = 0;
for (timer = 6000000; timer; timer--) {
/* Check for pending interrupts. */
stat = RD_REG_DWORD(&reg->host_status);
if (stat & HSRX_RISC_INT) {
stat &= 0xff;
if (stat == 0x1 || stat == 0x2 ||
stat == 0x10 || stat == 0x11) {
set_bit(MBX_INTERRUPT,
&ha->mbx_cmd_flags);
mb0 = RD_REG_WORD(&reg->mailbox0);
mb1 = RD_REG_WORD(&reg->mailbox1);
WRT_REG_DWORD(&reg->hccr,
HCCRX_CLR_RISC_INT);
RD_REG_DWORD(&reg->hccr);
break;
}
/* Clear this intr; it wasn't a mailbox intr */
WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
RD_REG_DWORD(&reg->hccr);
}
udelay(5);
}
ha->flags.mbox_int = 1;
if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
rval = mb0 & MBS_MASK;
for (idx = 0; idx < dwords; idx++)
ram[cnt + idx] = IS_QLA27XX(ha) ?
le32_to_cpu(dump[idx]) : swab32(dump[idx]);
} else {
rval = QLA_FUNCTION_FAILED;
}
}
*nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL;
return rval;
}
int
qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram, qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
uint32_t ram_dwords, void **nxt) uint32_t ram_dwords, void **nxt)
{ {
...@@ -139,6 +223,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram, ...@@ -139,6 +223,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
WRT_REG_WORD(&reg->mailbox5, LSW(dwords)); WRT_REG_WORD(&reg->mailbox5, LSW(dwords));
WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT); WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
ha->flags.mbox_int = 0;
for (timer = 6000000; timer; timer--) { for (timer = 6000000; timer; timer--) {
/* Check for pending interrupts. */ /* Check for pending interrupts. */
stat = RD_REG_DWORD(&reg->host_status); stat = RD_REG_DWORD(&reg->host_status);
...@@ -164,11 +249,13 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram, ...@@ -164,11 +249,13 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
} }
udelay(5); udelay(5);
} }
ha->flags.mbox_int = 1;
if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
rval = mb0 & MBS_MASK; rval = mb0 & MBS_MASK;
for (idx = 0; idx < dwords; idx++) for (idx = 0; idx < dwords; idx++)
ram[cnt + idx] = swab32(dump[idx]); ram[cnt + idx] = IS_QLA27XX(ha) ?
le32_to_cpu(dump[idx]) : swab32(dump[idx]);
} else { } else {
rval = QLA_FUNCTION_FAILED; rval = QLA_FUNCTION_FAILED;
} }
...@@ -208,7 +295,7 @@ qla24xx_read_window(struct device_reg_24xx __iomem *reg, uint32_t iobase, ...@@ -208,7 +295,7 @@ qla24xx_read_window(struct device_reg_24xx __iomem *reg, uint32_t iobase,
return buf; return buf;
} }
static inline int int
qla24xx_pause_risc(struct device_reg_24xx __iomem *reg) qla24xx_pause_risc(struct device_reg_24xx __iomem *reg)
{ {
int rval = QLA_SUCCESS; int rval = QLA_SUCCESS;
...@@ -227,7 +314,7 @@ qla24xx_pause_risc(struct device_reg_24xx __iomem *reg) ...@@ -227,7 +314,7 @@ qla24xx_pause_risc(struct device_reg_24xx __iomem *reg)
return rval; return rval;
} }
static int int
qla24xx_soft_reset(struct qla_hw_data *ha) qla24xx_soft_reset(struct qla_hw_data *ha)
{ {
int rval = QLA_SUCCESS; int rval = QLA_SUCCESS;
...@@ -537,7 +624,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) ...@@ -537,7 +624,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
struct qla2xxx_mq_chain *mq = ptr; struct qla2xxx_mq_chain *mq = ptr;
device_reg_t __iomem *reg; device_reg_t __iomem *reg;
if (!ha->mqenable || IS_QLA83XX(ha)) if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha))
return ptr; return ptr;
mq = ptr; mq = ptr;
......
...@@ -348,3 +348,10 @@ ql_log_pci(uint32_t, struct pci_dev *pdev, int32_t, const char *fmt, ...); ...@@ -348,3 +348,10 @@ ql_log_pci(uint32_t, struct pci_dev *pdev, int32_t, const char *fmt, ...);
#define ql_dbg_tgt 0x00004000 /* Target mode */ #define ql_dbg_tgt 0x00004000 /* Target mode */
#define ql_dbg_tgt_mgt 0x00002000 /* Target mode management */ #define ql_dbg_tgt_mgt 0x00002000 /* Target mode management */
#define ql_dbg_tgt_tmr 0x00001000 /* Target mode task management */ #define ql_dbg_tgt_tmr 0x00001000 /* Target mode task management */
extern int qla27xx_dump_mpi_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
extern int qla24xx_dump_ram(struct qla_hw_data *, uint32_t, uint32_t *,
uint32_t, void **);
extern int qla24xx_pause_risc(struct device_reg_24xx __iomem *);
extern int qla24xx_soft_reset(struct qla_hw_data *);
...@@ -654,7 +654,7 @@ typedef union { ...@@ -654,7 +654,7 @@ typedef union {
struct device_reg_25xxmq isp25mq; struct device_reg_25xxmq isp25mq;
struct device_reg_82xx isp82; struct device_reg_82xx isp82;
struct device_reg_fx00 ispfx00; struct device_reg_fx00 ispfx00;
} device_reg_t; } __iomem device_reg_t;
#define ISP_REQ_Q_IN(ha, reg) \ #define ISP_REQ_Q_IN(ha, reg) \
(IS_QLA2100(ha) || IS_QLA2200(ha) ? \ (IS_QLA2100(ha) || IS_QLA2200(ha) ? \
...@@ -938,6 +938,7 @@ struct mbx_cmd_32 { ...@@ -938,6 +938,7 @@ struct mbx_cmd_32 {
*/ */
#define MBC_WRITE_SERDES 0x3 /* Write serdes word. */ #define MBC_WRITE_SERDES 0x3 /* Write serdes word. */
#define MBC_READ_SERDES 0x4 /* Read serdes word. */ #define MBC_READ_SERDES 0x4 /* Read serdes word. */
#define MBC_LOAD_DUMP_MPI_RAM 0x5 /* Load/Dump MPI RAM. */
#define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */ #define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */
#define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */ #define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */
#define MBC_PORT_PARAMS 0x1A /* Port iDMA Parameters. */ #define MBC_PORT_PARAMS 0x1A /* Port iDMA Parameters. */
...@@ -2148,6 +2149,7 @@ struct ct_fdmi_hba_attributes { ...@@ -2148,6 +2149,7 @@ struct ct_fdmi_hba_attributes {
#define FDMI_PORT_SPEED_4GB 0x8 #define FDMI_PORT_SPEED_4GB 0x8
#define FDMI_PORT_SPEED_8GB 0x10 #define FDMI_PORT_SPEED_8GB 0x10
#define FDMI_PORT_SPEED_16GB 0x20 #define FDMI_PORT_SPEED_16GB 0x20
#define FDMI_PORT_SPEED_32GB 0x40
#define FDMI_PORT_SPEED_UNKNOWN 0x8000 #define FDMI_PORT_SPEED_UNKNOWN 0x8000
struct ct_fdmi_port_attr { struct ct_fdmi_port_attr {
...@@ -2656,7 +2658,7 @@ struct bidi_statistics { ...@@ -2656,7 +2658,7 @@ struct bidi_statistics {
#define QLA_MQ_SIZE 32 #define QLA_MQ_SIZE 32
#define QLA_MAX_QUEUES 256 #define QLA_MAX_QUEUES 256
#define ISP_QUE_REG(ha, id) \ #define ISP_QUE_REG(ha, id) \
((ha->mqenable || IS_QLA83XX(ha)) ? \ ((ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ? \
((void __iomem *)ha->mqiobase + (QLA_QUE_PAGE * id)) :\ ((void __iomem *)ha->mqiobase + (QLA_QUE_PAGE * id)) :\
((void __iomem *)ha->iobase)) ((void __iomem *)ha->iobase))
#define QLA_REQ_QUE_ID(tag) \ #define QLA_REQ_QUE_ID(tag) \
...@@ -2794,7 +2796,6 @@ struct qla_hw_data { ...@@ -2794,7 +2796,6 @@ struct qla_hw_data {
uint32_t fac_supported :1; uint32_t fac_supported :1;
uint32_t chip_reset_done :1; uint32_t chip_reset_done :1;
uint32_t port0 :1;
uint32_t running_gold_fw :1; uint32_t running_gold_fw :1;
uint32_t eeh_busy :1; uint32_t eeh_busy :1;
uint32_t cpu_affinity_enabled :1; uint32_t cpu_affinity_enabled :1;
...@@ -2825,7 +2826,7 @@ struct qla_hw_data { ...@@ -2825,7 +2826,7 @@ struct qla_hw_data {
spinlock_t hardware_lock ____cacheline_aligned; spinlock_t hardware_lock ____cacheline_aligned;
int bars; int bars;
int mem_only; int mem_only;
device_reg_t __iomem *iobase; /* Base I/O address */ device_reg_t *iobase; /* Base I/O address */
resource_size_t pio_address; resource_size_t pio_address;
#define MIN_IOBASE_LEN 0x100 #define MIN_IOBASE_LEN 0x100
...@@ -2844,8 +2845,8 @@ struct qla_hw_data { ...@@ -2844,8 +2845,8 @@ struct qla_hw_data {
uint32_t rsp_que_off; uint32_t rsp_que_off;
/* Multi queue data structs */ /* Multi queue data structs */
device_reg_t __iomem *mqiobase; device_reg_t *mqiobase;
device_reg_t __iomem *msixbase; device_reg_t *msixbase;
uint16_t msix_count; uint16_t msix_count;
uint8_t mqenable; uint8_t mqenable;
struct req_que **req_q_map; struct req_que **req_q_map;
...@@ -2881,6 +2882,7 @@ struct qla_hw_data { ...@@ -2881,6 +2882,7 @@ struct qla_hw_data {
#define PORT_SPEED_4GB 0x03 #define PORT_SPEED_4GB 0x03
#define PORT_SPEED_8GB 0x04 #define PORT_SPEED_8GB 0x04
#define PORT_SPEED_16GB 0x05 #define PORT_SPEED_16GB 0x05
#define PORT_SPEED_32GB 0x06
#define PORT_SPEED_10GB 0x13 #define PORT_SPEED_10GB 0x13
uint16_t link_data_rate; /* F/W operating speed */ uint16_t link_data_rate; /* F/W operating speed */
...@@ -2904,6 +2906,7 @@ struct qla_hw_data { ...@@ -2904,6 +2906,7 @@ struct qla_hw_data {
#define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001 #define PCI_DEVICE_ID_QLOGIC_ISP8001 0x8001
#define PCI_DEVICE_ID_QLOGIC_ISP8031 0x8031 #define PCI_DEVICE_ID_QLOGIC_ISP8031 0x8031
#define PCI_DEVICE_ID_QLOGIC_ISP2031 0x2031 #define PCI_DEVICE_ID_QLOGIC_ISP2031 0x2031
#define PCI_DEVICE_ID_QLOGIC_ISP2071 0x2071
uint32_t device_type; uint32_t device_type;
#define DT_ISP2100 BIT_0 #define DT_ISP2100 BIT_0
#define DT_ISP2200 BIT_1 #define DT_ISP2200 BIT_1
...@@ -2924,7 +2927,8 @@ struct qla_hw_data { ...@@ -2924,7 +2927,8 @@ struct qla_hw_data {
#define DT_ISP8031 BIT_16 #define DT_ISP8031 BIT_16
#define DT_ISPFX00 BIT_17 #define DT_ISPFX00 BIT_17
#define DT_ISP8044 BIT_18 #define DT_ISP8044 BIT_18
#define DT_ISP_LAST (DT_ISP8044 << 1) #define DT_ISP2071 BIT_19
#define DT_ISP_LAST (DT_ISP2071 << 1)
#define DT_T10_PI BIT_25 #define DT_T10_PI BIT_25
#define DT_IIDMA BIT_26 #define DT_IIDMA BIT_26
...@@ -2954,6 +2958,7 @@ struct qla_hw_data { ...@@ -2954,6 +2958,7 @@ struct qla_hw_data {
#define IS_QLA2031(ha) (DT_MASK(ha) & DT_ISP2031) #define IS_QLA2031(ha) (DT_MASK(ha) & DT_ISP2031)
#define IS_QLA8031(ha) (DT_MASK(ha) & DT_ISP8031) #define IS_QLA8031(ha) (DT_MASK(ha) & DT_ISP8031)
#define IS_QLAFX00(ha) (DT_MASK(ha) & DT_ISPFX00) #define IS_QLAFX00(ha) (DT_MASK(ha) & DT_ISPFX00)
#define IS_QLA2071(ha) (DT_MASK(ha) & DT_ISP2071)
#define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \
IS_QLA6312(ha) || IS_QLA6322(ha)) IS_QLA6312(ha) || IS_QLA6322(ha))
...@@ -2962,6 +2967,7 @@ struct qla_hw_data { ...@@ -2962,6 +2967,7 @@ struct qla_hw_data {
#define IS_QLA25XX(ha) (IS_QLA2532(ha)) #define IS_QLA25XX(ha) (IS_QLA2532(ha))
#define IS_QLA83XX(ha) (IS_QLA2031(ha) || IS_QLA8031(ha)) #define IS_QLA83XX(ha) (IS_QLA2031(ha) || IS_QLA8031(ha))
#define IS_QLA84XX(ha) (IS_QLA8432(ha)) #define IS_QLA84XX(ha) (IS_QLA8432(ha))
#define IS_QLA27XX(ha) (IS_QLA2071(ha))
#define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \ #define IS_QLA24XX_TYPE(ha) (IS_QLA24XX(ha) || IS_QLA54XX(ha) || \
IS_QLA84XX(ha)) IS_QLA84XX(ha))
#define IS_CNA_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha) || \ #define IS_CNA_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA82XX(ha) || \
...@@ -2970,11 +2976,13 @@ struct qla_hw_data { ...@@ -2970,11 +2976,13 @@ struct qla_hw_data {
#define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \ #define IS_QLA2XXX_MIDTYPE(ha) (IS_QLA24XX(ha) || IS_QLA84XX(ha) || \
IS_QLA25XX(ha) || IS_QLA81XX(ha) || \ IS_QLA25XX(ha) || IS_QLA81XX(ha) || \
IS_QLA82XX(ha) || IS_QLA83XX(ha) || \ IS_QLA82XX(ha) || IS_QLA83XX(ha) || \
IS_QLA8044(ha)) IS_QLA8044(ha) || IS_QLA27XX(ha))
#define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) #define IS_MSIX_NACK_CAPABLE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha))
#define IS_NOPOLLING_TYPE(ha) (IS_QLA81XX(ha) && (ha)->flags.msix_enabled) #define IS_NOPOLLING_TYPE(ha) (IS_QLA81XX(ha) && (ha)->flags.msix_enabled)
#define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) #define IS_FAC_REQUIRED(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha) || \
#define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha)) IS_QLA27XX(ha))
#define IS_NOCACHE_VPD_TYPE(ha) (IS_QLA81XX(ha) || IS_QLA83XX(ha) || \
IS_QLA27XX(ha))
#define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha)) #define IS_ALOGIO_CAPABLE(ha) (IS_QLA23XX(ha) || IS_FWI2_CAPABLE(ha))
#define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI) #define IS_T10_PI_CAPABLE(ha) ((ha)->device_type & DT_T10_PI)
...@@ -2984,7 +2992,8 @@ struct qla_hw_data { ...@@ -2984,7 +2992,8 @@ struct qla_hw_data {
#define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001) #define IS_OEM_001(ha) ((ha)->device_type & DT_OEM_001)
#define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS) #define HAS_EXTENDED_IDS(ha) ((ha)->device_type & DT_EXTENDED_IDS)
#define IS_CT6_SUPPORTED(ha) ((ha)->device_type & DT_CT6_SUPPORTED) #define IS_CT6_SUPPORTED(ha) ((ha)->device_type & DT_CT6_SUPPORTED)
#define IS_MQUE_CAPABLE(ha) ((ha)->mqenable || IS_QLA83XX(ha)) #define IS_MQUE_CAPABLE(ha) ((ha)->mqenable || IS_QLA83XX(ha) || \
IS_QLA27XX(ha))
#define IS_BIDI_CAPABLE(ha) ((IS_QLA25XX(ha) || IS_QLA2031(ha))) #define IS_BIDI_CAPABLE(ha) ((IS_QLA25XX(ha) || IS_QLA2031(ha)))
/* Bit 21 of fw_attributes decides the MCTP capabilities */ /* Bit 21 of fw_attributes decides the MCTP capabilities */
#define IS_MCTP_CAPABLE(ha) (IS_QLA2031(ha) && \ #define IS_MCTP_CAPABLE(ha) (IS_QLA2031(ha) && \
...@@ -3109,6 +3118,9 @@ struct qla_hw_data { ...@@ -3109,6 +3118,9 @@ struct qla_hw_data {
uint16_t fw_xcb_count; uint16_t fw_xcb_count;
uint16_t fw_iocb_count; uint16_t fw_iocb_count;
uint32_t fw_shared_ram_start;
uint32_t fw_shared_ram_end;
uint16_t fw_options[16]; /* slots: 1,2,3,10,11 */ uint16_t fw_options[16]; /* slots: 1,2,3,10,11 */
uint8_t fw_seriallink_options[4]; uint8_t fw_seriallink_options[4];
uint16_t fw_seriallink_options24[4]; uint16_t fw_seriallink_options24[4];
...@@ -3117,6 +3129,9 @@ struct qla_hw_data { ...@@ -3117,6 +3129,9 @@ struct qla_hw_data {
uint32_t mpi_capabilities; uint32_t mpi_capabilities;
uint8_t phy_version[3]; uint8_t phy_version[3];
/* Firmware dump template */
void *fw_dump_template;
uint32_t fw_dump_template_len;
/* Firmware dump information. */ /* Firmware dump information. */
struct qla2xxx_fw_dump *fw_dump; struct qla2xxx_fw_dump *fw_dump;
uint32_t fw_dump_len; uint32_t fw_dump_len;
......
...@@ -114,7 +114,8 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha) ...@@ -114,7 +114,8 @@ qla2x00_dfs_setup(scsi_qla_host_t *vha)
{ {
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha)) if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
!IS_QLA27XX(ha))
goto out; goto out;
if (!ha->fce) if (!ha->fce)
goto out; goto out;
......
...@@ -1378,6 +1378,10 @@ struct qla_flt_header { ...@@ -1378,6 +1378,10 @@ struct qla_flt_header {
#define FLT_REG_NVRAM_0 0x15 #define FLT_REG_NVRAM_0 0x15
#define FLT_REG_VPD_1 0x16 #define FLT_REG_VPD_1 0x16
#define FLT_REG_NVRAM_1 0x17 #define FLT_REG_NVRAM_1 0x17
#define FLT_REG_VPD_2 0xD4
#define FLT_REG_NVRAM_2 0xD5
#define FLT_REG_VPD_3 0xD6
#define FLT_REG_NVRAM_3 0xD7
#define FLT_REG_FDT 0x1a #define FLT_REG_FDT 0x1a
#define FLT_REG_FLT 0x1c #define FLT_REG_FLT 0x1c
#define FLT_REG_HW_EVENT_0 0x1d #define FLT_REG_HW_EVENT_0 0x1d
......
...@@ -511,6 +511,14 @@ extern void qla2300_fw_dump(scsi_qla_host_t *, int); ...@@ -511,6 +511,14 @@ extern void qla2300_fw_dump(scsi_qla_host_t *, int);
extern void qla24xx_fw_dump(scsi_qla_host_t *, int); extern void qla24xx_fw_dump(scsi_qla_host_t *, int);
extern void qla25xx_fw_dump(scsi_qla_host_t *, int); extern void qla25xx_fw_dump(scsi_qla_host_t *, int);
extern void qla81xx_fw_dump(scsi_qla_host_t *, int); extern void qla81xx_fw_dump(scsi_qla_host_t *, int);
extern void qla27xx_fwdump(scsi_qla_host_t *, int);
extern ulong qla27xx_fwdt_calculate_dump_size(struct scsi_qla_host *);
extern int qla27xx_fwdt_template_valid(void *);
extern ulong qla27xx_fwdt_template_size(void *);
extern const void *qla27xx_fwdt_template_default(void);
extern ulong qla27xx_fwdt_template_default_size(void);
extern void qla2x00_dump_regs(scsi_qla_host_t *); extern void qla2x00_dump_regs(scsi_qla_host_t *);
extern void qla2x00_dump_buffer(uint8_t *, uint32_t); extern void qla2x00_dump_buffer(uint8_t *, uint32_t);
extern void qla2x00_dump_buffer_zipped(uint8_t *, uint32_t); extern void qla2x00_dump_buffer_zipped(uint8_t *, uint32_t);
......
...@@ -1532,6 +1532,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) ...@@ -1532,6 +1532,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
if (IS_CNA_CAPABLE(ha)) if (IS_CNA_CAPABLE(ha))
eiter->a.sup_speed = __constant_cpu_to_be32( eiter->a.sup_speed = __constant_cpu_to_be32(
FDMI_PORT_SPEED_10GB); FDMI_PORT_SPEED_10GB);
else if (IS_QLA27XX(ha))
eiter->a.sup_speed = __constant_cpu_to_be32(
FDMI_PORT_SPEED_32GB|FDMI_PORT_SPEED_16GB|
FDMI_PORT_SPEED_8GB);
else if (IS_QLA25XX(ha)) else if (IS_QLA25XX(ha))
eiter->a.sup_speed = __constant_cpu_to_be32( eiter->a.sup_speed = __constant_cpu_to_be32(
FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB|
...@@ -1580,6 +1584,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha) ...@@ -1580,6 +1584,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *vha)
eiter->a.cur_speed = eiter->a.cur_speed =
__constant_cpu_to_be32(FDMI_PORT_SPEED_16GB); __constant_cpu_to_be32(FDMI_PORT_SPEED_16GB);
break; break;
case PORT_SPEED_32GB:
eiter->a.cur_speed =
__constant_cpu_to_be32(FDMI_PORT_SPEED_32GB);
break;
default: default:
eiter->a.cur_speed = eiter->a.cur_speed =
__constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN);
...@@ -1889,6 +1897,9 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) ...@@ -1889,6 +1897,9 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list)
case BIT_10: case BIT_10:
list[i].fp_speed = PORT_SPEED_16GB; list[i].fp_speed = PORT_SPEED_16GB;
break; break;
case BIT_8:
list[i].fp_speed = PORT_SPEED_32GB;
break;
} }
ql_dbg(ql_dbg_disc, vha, 0x205b, ql_dbg(ql_dbg_disc, vha, 0x205b,
......
This diff is collapsed.
...@@ -488,7 +488,7 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req) ...@@ -488,7 +488,7 @@ qla2x00_start_iocbs(struct scsi_qla_host *vha, struct req_que *req)
req->ring_ptr++; req->ring_ptr++;
/* Set chip new ring index. */ /* Set chip new ring index. */
if (ha->mqenable || IS_QLA83XX(ha)) { if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
WRT_REG_DWORD(req->req_q_in, req->ring_index); WRT_REG_DWORD(req->req_q_in, req->ring_index);
RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr); RD_REG_DWORD_RELAXED(&ha->iobase->isp24.hccr);
} else if (IS_QLAFX00(ha)) { } else if (IS_QLAFX00(ha)) {
...@@ -1848,7 +1848,7 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp) ...@@ -1848,7 +1848,7 @@ qla2x00_alloc_iocbs(scsi_qla_host_t *vha, srb_t *sp)
skip_cmd_array: skip_cmd_array:
/* Check for room on request queue. */ /* Check for room on request queue. */
if (req->cnt < req_cnt) { if (req->cnt < req_cnt) {
if (ha->mqenable || IS_QLA83XX(ha)) if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha))
cnt = RD_REG_DWORD(&reg->isp25mq.req_q_out); cnt = RD_REG_DWORD(&reg->isp25mq.req_q_out);
else if (IS_P3P_TYPE(ha)) else if (IS_P3P_TYPE(ha))
cnt = RD_REG_DWORD(&reg->isp82.req_q_out); cnt = RD_REG_DWORD(&reg->isp82.req_q_out);
......
...@@ -356,15 +356,16 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr) ...@@ -356,15 +356,16 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr)
const char * const char *
qla2x00_get_link_speed_str(struct qla_hw_data *ha, uint16_t speed) qla2x00_get_link_speed_str(struct qla_hw_data *ha, uint16_t speed)
{ {
static const char * const link_speeds[] = { static const char *const link_speeds[] = {
"1", "2", "?", "4", "8", "16", "10" "1", "2", "?", "4", "8", "16", "32", "10"
}; };
#define QLA_LAST_SPEED 7
if (IS_QLA2100(ha) || IS_QLA2200(ha)) if (IS_QLA2100(ha) || IS_QLA2200(ha))
return link_speeds[0]; return link_speeds[0];
else if (speed == 0x13) else if (speed == 0x13)
return link_speeds[6]; return link_speeds[QLA_LAST_SPEED];
else if (speed < 6) else if (speed < QLA_LAST_SPEED)
return link_speeds[speed]; return link_speeds[speed];
else else
return link_speeds[LS_UNKNOWN]; return link_speeds[LS_UNKNOWN];
...@@ -649,7 +650,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) ...@@ -649,7 +650,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
break; break;
case MBA_SYSTEM_ERR: /* System Error */ case MBA_SYSTEM_ERR: /* System Error */
mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha)) ? mbx = (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) ?
RD_REG_WORD(&reg24->mailbox7) : 0; RD_REG_WORD(&reg24->mailbox7) : 0;
ql_log(ql_log_warn, vha, 0x5003, ql_log(ql_log_warn, vha, 0x5003,
"ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh " "ISP System Error - mbx1=%xh mbx2=%xh mbx3=%xh "
...@@ -666,7 +667,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb) ...@@ -666,7 +667,7 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)
vha->device_flags |= DFLG_DEV_FAILED; vha->device_flags |= DFLG_DEV_FAILED;
} else { } else {
/* Check to see if MPI timeout occurred */ /* Check to see if MPI timeout occurred */
if ((mbx & MBX_3) && (ha->flags.port0)) if ((mbx & MBX_3) && (ha->port_no == 0))
set_bit(MPI_RESET_NEEDED, set_bit(MPI_RESET_NEEDED,
&vha->dpc_flags); &vha->dpc_flags);
...@@ -2525,7 +2526,8 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha) ...@@ -2525,7 +2526,8 @@ qla2xxx_check_risc_status(scsi_qla_host_t *vha)
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha)) if (!IS_QLA25XX(ha) && !IS_QLA81XX(ha) && !IS_QLA83XX(ha) &&
!IS_QLA27XX(ha))
return; return;
rval = QLA_SUCCESS; rval = QLA_SUCCESS;
...@@ -2979,7 +2981,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp) ...@@ -2979,7 +2981,7 @@ qla24xx_enable_msix(struct qla_hw_data *ha, struct rsp_que *rsp)
} }
/* Enable MSI-X vector for response queue update for queue 0 */ /* Enable MSI-X vector for response queue update for queue 0 */
if (IS_QLA83XX(ha)) { if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
if (ha->msixbase && ha->mqiobase && if (ha->msixbase && ha->mqiobase &&
(ha->max_rsp_queues > 1 || ha->max_req_queues > 1)) (ha->max_rsp_queues > 1 || ha->max_req_queues > 1))
ha->mqenable = 1; ha->mqenable = 1;
...@@ -3003,12 +3005,13 @@ int ...@@ -3003,12 +3005,13 @@ int
qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
{ {
int ret = QLA_FUNCTION_FAILED; int ret = QLA_FUNCTION_FAILED;
device_reg_t __iomem *reg = ha->iobase; device_reg_t *reg = ha->iobase;
scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
/* If possible, enable MSI-X. */ /* If possible, enable MSI-X. */
if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) && if (!IS_QLA2432(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
!IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && !IS_QLAFX00(ha)) !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && !IS_QLAFX00(ha) &&
!IS_QLA27XX(ha))
goto skip_msi; goto skip_msi;
if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP && if (ha->pdev->subsystem_vendor == PCI_VENDOR_ID_HP &&
...@@ -3043,7 +3046,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp) ...@@ -3043,7 +3046,8 @@ qla2x00_request_irqs(struct qla_hw_data *ha, struct rsp_que *rsp)
"Falling back-to MSI mode -%d.\n", ret); "Falling back-to MSI mode -%d.\n", ret);
if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) && if (!IS_QLA24XX(ha) && !IS_QLA2532(ha) && !IS_QLA8432(ha) &&
!IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha)) !IS_QLA8001(ha) && !IS_P3P_TYPE(ha) && !IS_QLAFX00(ha) &&
!IS_QLA27XX(ha))
goto skip_msi; goto skip_msi;
ret = pci_enable_msi(ha->pdev); ret = pci_enable_msi(ha->pdev);
......
...@@ -35,7 +35,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) ...@@ -35,7 +35,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
{ {
int rval; int rval;
unsigned long flags = 0; unsigned long flags = 0;
device_reg_t __iomem *reg; device_reg_t *reg;
uint8_t abort_active; uint8_t abort_active;
uint8_t io_lock_on; uint8_t io_lock_on;
uint16_t command = 0; uint16_t command = 0;
...@@ -468,7 +468,8 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) ...@@ -468,7 +468,8 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr)
mcp->mb[1] = MSW(risc_addr); mcp->mb[1] = MSW(risc_addr);
mcp->mb[2] = LSW(risc_addr); mcp->mb[2] = LSW(risc_addr);
mcp->mb[3] = 0; mcp->mb[3] = 0;
if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha)) { if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) ||
IS_QLA27XX(ha)) {
struct nvram_81xx *nv = ha->nvram; struct nvram_81xx *nv = ha->nvram;
mcp->mb[4] = (nv->enhanced_features & mcp->mb[4] = (nv->enhanced_features &
EXTENDED_BB_CREDITS); EXTENDED_BB_CREDITS);
...@@ -539,6 +540,8 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) ...@@ -539,6 +540,8 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha)
mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8; mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8;
if (IS_FWI2_CAPABLE(ha)) if (IS_FWI2_CAPABLE(ha))
mcp->in_mb |= MBX_17|MBX_16|MBX_15; mcp->in_mb |= MBX_17|MBX_16|MBX_15;
if (IS_QLA27XX(ha))
mcp->in_mb |= MBX_21|MBX_20|MBX_19|MBX_18;
mcp->flags = 0; mcp->flags = 0;
mcp->tov = MBX_TOV_SECONDS; mcp->tov = MBX_TOV_SECONDS;
rval = qla2x00_mailbox_command(vha, mcp); rval = qla2x00_mailbox_command(vha, mcp);
...@@ -574,6 +577,10 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha) ...@@ -574,6 +577,10 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha)
"%s: Ext_FwAttributes Upper: 0x%x, Lower: 0x%x.\n", "%s: Ext_FwAttributes Upper: 0x%x, Lower: 0x%x.\n",
__func__, mcp->mb[17], mcp->mb[16]); __func__, mcp->mb[17], mcp->mb[16]);
} }
if (IS_QLA27XX(ha)) {
ha->fw_shared_ram_start = (mcp->mb[19] << 16) | mcp->mb[18];
ha->fw_shared_ram_end = (mcp->mb[21] << 16) | mcp->mb[20];
}
failed: failed:
if (rval != QLA_SUCCESS) { if (rval != QLA_SUCCESS) {
...@@ -1225,7 +1232,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size) ...@@ -1225,7 +1232,7 @@ qla2x00_init_firmware(scsi_qla_host_t *vha, uint16_t size)
} }
/* 1 and 2 should normally be captured. */ /* 1 and 2 should normally be captured. */
mcp->in_mb = MBX_2|MBX_1|MBX_0; mcp->in_mb = MBX_2|MBX_1|MBX_0;
if (IS_QLA83XX(ha)) if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
/* mb3 is additional info about the installed SFP. */ /* mb3 is additional info about the installed SFP. */
mcp->in_mb |= MBX_3; mcp->in_mb |= MBX_3;
mcp->buf_size = size; mcp->buf_size = size;
...@@ -2349,7 +2356,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt, ...@@ -2349,7 +2356,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *vha, uint16_t *cur_xchg_cnt,
mcp->mb[0] = MBC_GET_RESOURCE_COUNTS; mcp->mb[0] = MBC_GET_RESOURCE_COUNTS;
mcp->out_mb = MBX_0; mcp->out_mb = MBX_0;
mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; mcp->in_mb = MBX_11|MBX_10|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0;
if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw)) if (IS_QLA81XX(vha->hw) || IS_QLA83XX(vha->hw) || IS_QLA27XX(vha->hw))
mcp->in_mb |= MBX_12; mcp->in_mb |= MBX_12;
mcp->tov = MBX_TOV_SECONDS; mcp->tov = MBX_TOV_SECONDS;
mcp->flags = 0; mcp->flags = 0;
...@@ -3032,7 +3039,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, ...@@ -3032,7 +3039,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma,
"Entered %s.\n", __func__); "Entered %s.\n", __func__);
if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) && if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw) &&
!IS_QLA83XX(vha->hw)) !IS_QLA83XX(vha->hw) && !IS_QLA27XX(vha->hw))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
if (unlikely(pci_channel_offline(vha->hw->pdev))) if (unlikely(pci_channel_offline(vha->hw->pdev)))
...@@ -3662,7 +3669,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -3662,7 +3669,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
mcp->mb[12] = req->qos; mcp->mb[12] = req->qos;
mcp->mb[11] = req->vp_idx; mcp->mb[11] = req->vp_idx;
mcp->mb[13] = req->rid; mcp->mb[13] = req->rid;
if (IS_QLA83XX(ha)) if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
mcp->mb[15] = 0; mcp->mb[15] = 0;
mcp->mb[4] = req->id; mcp->mb[4] = req->id;
...@@ -3676,9 +3683,9 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -3676,9 +3683,9 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
mcp->flags = MBX_DMA_OUT; mcp->flags = MBX_DMA_OUT;
mcp->tov = MBX_TOV_SECONDS * 2; mcp->tov = MBX_TOV_SECONDS * 2;
if (IS_QLA81XX(ha) || IS_QLA83XX(ha)) if (IS_QLA81XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha))
mcp->in_mb |= MBX_1; mcp->in_mb |= MBX_1;
if (IS_QLA83XX(ha)) { if (IS_QLA83XX(ha) || !IS_QLA27XX(ha)) {
mcp->out_mb |= MBX_15; mcp->out_mb |= MBX_15;
/* debug q create issue in SR-IOV */ /* debug q create issue in SR-IOV */
mcp->in_mb |= MBX_9 | MBX_8 | MBX_7; mcp->in_mb |= MBX_9 | MBX_8 | MBX_7;
...@@ -3687,7 +3694,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) ...@@ -3687,7 +3694,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req)
spin_lock_irqsave(&ha->hardware_lock, flags); spin_lock_irqsave(&ha->hardware_lock, flags);
if (!(req->options & BIT_0)) { if (!(req->options & BIT_0)) {
WRT_REG_DWORD(req->req_q_in, 0); WRT_REG_DWORD(req->req_q_in, 0);
if (!IS_QLA83XX(ha)) if (!IS_QLA83XX(ha) || !IS_QLA27XX(ha))
WRT_REG_DWORD(req->req_q_out, 0); WRT_REG_DWORD(req->req_q_out, 0);
} }
spin_unlock_irqrestore(&ha->hardware_lock, flags); spin_unlock_irqrestore(&ha->hardware_lock, flags);
...@@ -3725,7 +3732,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -3725,7 +3732,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
mcp->mb[5] = rsp->length; mcp->mb[5] = rsp->length;
mcp->mb[14] = rsp->msix->entry; mcp->mb[14] = rsp->msix->entry;
mcp->mb[13] = rsp->rid; mcp->mb[13] = rsp->rid;
if (IS_QLA83XX(ha)) if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
mcp->mb[15] = 0; mcp->mb[15] = 0;
mcp->mb[4] = rsp->id; mcp->mb[4] = rsp->id;
...@@ -3742,7 +3749,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) ...@@ -3742,7 +3749,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp)
if (IS_QLA81XX(ha)) { if (IS_QLA81XX(ha)) {
mcp->out_mb |= MBX_12|MBX_11|MBX_10; mcp->out_mb |= MBX_12|MBX_11|MBX_10;
mcp->in_mb |= MBX_1; mcp->in_mb |= MBX_1;
} else if (IS_QLA83XX(ha)) { } else if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10; mcp->out_mb |= MBX_15|MBX_12|MBX_11|MBX_10;
mcp->in_mb |= MBX_1; mcp->in_mb |= MBX_1;
/* debug q create issue in SR-IOV */ /* debug q create issue in SR-IOV */
...@@ -3809,7 +3816,8 @@ qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size) ...@@ -3809,7 +3816,8 @@ qla81xx_fac_get_sector_size(scsi_qla_host_t *vha, uint32_t *sector_size)
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10dc, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10dc,
"Entered %s.\n", __func__); "Entered %s.\n", __func__);
if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw)) if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) &&
!IS_QLA27XX(vha->hw))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
mcp->mb[0] = MBC_FLASH_ACCESS_CTRL; mcp->mb[0] = MBC_FLASH_ACCESS_CTRL;
...@@ -3840,7 +3848,8 @@ qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable) ...@@ -3840,7 +3848,8 @@ qla81xx_fac_do_write_enable(scsi_qla_host_t *vha, int enable)
mbx_cmd_t mc; mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc; mbx_cmd_t *mcp = &mc;
if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw)) if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) &&
!IS_QLA27XX(vha->hw))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10df, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10df,
...@@ -3874,7 +3883,8 @@ qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish) ...@@ -3874,7 +3883,8 @@ qla81xx_fac_erase_sector(scsi_qla_host_t *vha, uint32_t start, uint32_t finish)
mbx_cmd_t mc; mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc; mbx_cmd_t *mcp = &mc;
if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw)) if (!IS_QLA81XX(vha->hw) && !IS_QLA83XX(vha->hw) &&
!IS_QLA27XX(vha->hw))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e2, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x10e2,
...@@ -4545,7 +4555,7 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha) ...@@ -4545,7 +4555,7 @@ qla2x00_get_data_rate(scsi_qla_host_t *vha)
mcp->mb[1] = 0; mcp->mb[1] = 0;
mcp->out_mb = MBX_1|MBX_0; mcp->out_mb = MBX_1|MBX_0;
mcp->in_mb = MBX_2|MBX_1|MBX_0; mcp->in_mb = MBX_2|MBX_1|MBX_0;
if (IS_QLA83XX(ha)) if (IS_QLA83XX(ha) || IS_QLA27XX(ha))
mcp->in_mb |= MBX_3; mcp->in_mb |= MBX_3;
mcp->tov = MBX_TOV_SECONDS; mcp->tov = MBX_TOV_SECONDS;
mcp->flags = 0; mcp->flags = 0;
...@@ -4574,7 +4584,8 @@ qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb) ...@@ -4574,7 +4584,8 @@ qla81xx_get_port_config(scsi_qla_host_t *vha, uint16_t *mb)
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1109, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1109,
"Entered %s.\n", __func__); "Entered %s.\n", __func__);
if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA8044(ha)) if (!IS_QLA81XX(ha) && !IS_QLA83XX(ha) && !IS_QLA8044(ha) &&
!IS_QLA27XX(ha))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
mcp->mb[0] = MBC_GET_PORT_CONFIG; mcp->mb[0] = MBC_GET_PORT_CONFIG;
mcp->out_mb = MBX_0; mcp->out_mb = MBX_0;
...@@ -5070,7 +5081,7 @@ qla83xx_wr_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data) ...@@ -5070,7 +5081,7 @@ qla83xx_wr_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t data)
mbx_cmd_t mc; mbx_cmd_t mc;
mbx_cmd_t *mcp = &mc; mbx_cmd_t *mcp = &mc;
if (!IS_QLA83XX(ha)) if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1130, ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1130,
...@@ -5145,7 +5156,7 @@ qla83xx_rd_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t *data) ...@@ -5145,7 +5156,7 @@ qla83xx_rd_reg(scsi_qla_host_t *vha, uint32_t reg, uint32_t *data)
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
unsigned long retry_max_time = jiffies + (2 * HZ); unsigned long retry_max_time = jiffies + (2 * HZ);
if (!IS_QLA83XX(ha)) if (!IS_QLA83XX(ha) && !IS_QLA27XX(ha))
return QLA_FUNCTION_FAILED; return QLA_FUNCTION_FAILED;
ql_dbg(ql_dbg_mbx, vha, 0x114b, "Entered %s.\n", __func__); ql_dbg(ql_dbg_mbx, vha, 0x114b, "Entered %s.\n", __func__);
......
...@@ -630,7 +630,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options, ...@@ -630,7 +630,7 @@ qla25xx_create_req_que(struct qla_hw_data *ha, uint16_t options,
struct req_que *req = NULL; struct req_que *req = NULL;
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
uint16_t que_id = 0; uint16_t que_id = 0;
device_reg_t __iomem *reg; device_reg_t *reg;
uint32_t cnt; uint32_t cnt;
req = kzalloc(sizeof(struct req_que), GFP_KERNEL); req = kzalloc(sizeof(struct req_que), GFP_KERNEL);
...@@ -754,7 +754,7 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options, ...@@ -754,7 +754,7 @@ qla25xx_create_rsp_que(struct qla_hw_data *ha, uint16_t options,
struct rsp_que *rsp = NULL; struct rsp_que *rsp = NULL;
struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
uint16_t que_id = 0; uint16_t que_id = 0;
device_reg_t __iomem *reg; device_reg_t *reg;
rsp = kzalloc(sizeof(struct rsp_que), GFP_KERNEL); rsp = kzalloc(sizeof(struct rsp_que), GFP_KERNEL);
if (rsp == NULL) { if (rsp == NULL) {
......
...@@ -40,7 +40,7 @@ qlafx00_mailbox_command(scsi_qla_host_t *vha, struct mbx_cmd_32 *mcp) ...@@ -40,7 +40,7 @@ qlafx00_mailbox_command(scsi_qla_host_t *vha, struct mbx_cmd_32 *mcp)
{ {
int rval; int rval;
unsigned long flags = 0; unsigned long flags = 0;
device_reg_t __iomem *reg; device_reg_t *reg;
uint8_t abort_active; uint8_t abort_active;
uint8_t io_lock_on; uint8_t io_lock_on;
uint16_t command = 0; uint16_t command = 0;
......
...@@ -1664,10 +1664,10 @@ qla82xx_iospace_config(struct qla_hw_data *ha) ...@@ -1664,10 +1664,10 @@ qla82xx_iospace_config(struct qla_hw_data *ha)
/* Mapping of IO base pointer */ /* Mapping of IO base pointer */
if (IS_QLA8044(ha)) { if (IS_QLA8044(ha)) {
ha->iobase = ha->iobase =
(device_reg_t __iomem *)((uint8_t *)ha->nx_pcibase); (device_reg_t *)((uint8_t *)ha->nx_pcibase);
} else if (IS_QLA82XX(ha)) { } else if (IS_QLA82XX(ha)) {
ha->iobase = ha->iobase =
(device_reg_t __iomem *)((uint8_t *)ha->nx_pcibase + (device_reg_t *)((uint8_t *)ha->nx_pcibase +
0xbc000 + (ha->pdev->devfn << 11)); 0xbc000 + (ha->pdev->devfn << 11));
} }
......
...@@ -2102,6 +2102,44 @@ static struct isp_operations qlafx00_isp_ops = { ...@@ -2102,6 +2102,44 @@ static struct isp_operations qlafx00_isp_ops = {
.initialize_adapter = qlafx00_initialize_adapter, .initialize_adapter = qlafx00_initialize_adapter,
}; };
static struct isp_operations qla27xx_isp_ops = {
.pci_config = qla25xx_pci_config,
.reset_chip = qla24xx_reset_chip,
.chip_diag = qla24xx_chip_diag,
.config_rings = qla24xx_config_rings,
.reset_adapter = qla24xx_reset_adapter,
.nvram_config = qla81xx_nvram_config,
.update_fw_options = qla81xx_update_fw_options,
.load_risc = qla81xx_load_risc,
.pci_info_str = qla24xx_pci_info_str,
.fw_version_str = qla24xx_fw_version_str,
.intr_handler = qla24xx_intr_handler,
.enable_intrs = qla24xx_enable_intrs,
.disable_intrs = qla24xx_disable_intrs,
.abort_command = qla24xx_abort_command,
.target_reset = qla24xx_abort_target,
.lun_reset = qla24xx_lun_reset,
.fabric_login = qla24xx_login_fabric,
.fabric_logout = qla24xx_fabric_logout,
.calc_req_entries = NULL,
.build_iocbs = NULL,
.prep_ms_iocb = qla24xx_prep_ms_iocb,
.prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb,
.read_nvram = NULL,
.write_nvram = NULL,
.fw_dump = qla27xx_fwdump,
.beacon_on = qla24xx_beacon_on,
.beacon_off = qla24xx_beacon_off,
.beacon_blink = qla83xx_beacon_blink,
.read_optrom = qla25xx_read_optrom_data,
.write_optrom = qla24xx_write_optrom_data,
.get_flash_version = qla24xx_get_flash_version,
.start_scsi = qla24xx_dif_start_scsi,
.abort_isp = qla2x00_abort_isp,
.iospace_config = qla83xx_iospace_config,
.initialize_adapter = qla2x00_initialize_adapter,
};
static inline void static inline void
qla2x00_set_isp_flags(struct qla_hw_data *ha) qla2x00_set_isp_flags(struct qla_hw_data *ha)
{ {
...@@ -2223,21 +2261,29 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha) ...@@ -2223,21 +2261,29 @@ qla2x00_set_isp_flags(struct qla_hw_data *ha)
case PCI_DEVICE_ID_QLOGIC_ISPF001: case PCI_DEVICE_ID_QLOGIC_ISPF001:
ha->device_type |= DT_ISPFX00; ha->device_type |= DT_ISPFX00;
break; break;
case PCI_DEVICE_ID_QLOGIC_ISP2071:
ha->device_type |= DT_ISP2071;
ha->device_type |= DT_ZIO_SUPPORTED;
ha->device_type |= DT_FWI2;
ha->device_type |= DT_IIDMA;
ha->fw_srisc_address = RISC_START_ADDRESS_2400;
break;
} }
if (IS_QLA82XX(ha)) if (IS_QLA82XX(ha))
ha->port_no = !(ha->portnum & 1); ha->port_no = !(ha->portnum & 1);
else else {
/* Get adapter physical port no from interrupt pin register. */ /* Get adapter physical port no from interrupt pin register. */
pci_read_config_byte(ha->pdev, PCI_INTERRUPT_PIN, &ha->port_no); pci_read_config_byte(ha->pdev, PCI_INTERRUPT_PIN, &ha->port_no);
if (IS_QLA27XX(ha))
ha->port_no--;
else
ha->port_no = !(ha->port_no & 1);
}
if (ha->port_no & 1)
ha->flags.port0 = 1;
else
ha->flags.port0 = 0;
ql_dbg_pci(ql_dbg_init, ha->pdev, 0x000b, ql_dbg_pci(ql_dbg_init, ha->pdev, 0x000b,
"device_type=0x%x port=%d fw_srisc_address=0x%x.\n", "device_type=0x%x port=%d fw_srisc_address=0x%x.\n",
ha->device_type, ha->flags.port0, ha->fw_srisc_address); ha->device_type, ha->port_no, ha->fw_srisc_address);
} }
static void static void
...@@ -2297,7 +2343,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2297,7 +2343,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2031 || pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2031 ||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8031 || pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8031 ||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISPF001 || pdev->device == PCI_DEVICE_ID_QLOGIC_ISPF001 ||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8044) { pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8044 ||
pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2071) {
bars = pci_select_bars(pdev, IORESOURCE_MEM); bars = pci_select_bars(pdev, IORESOURCE_MEM);
mem_only = 1; mem_only = 1;
ql_dbg_pci(ql_dbg_init, pdev, 0x0007, ql_dbg_pci(ql_dbg_init, pdev, 0x0007,
...@@ -2341,7 +2388,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2341,7 +2388,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* Set EEH reset type to fundamental if required by hba */ /* Set EEH reset type to fundamental if required by hba */
if (IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha) || if (IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha) ||
IS_QLA83XX(ha)) IS_QLA83XX(ha) || IS_QLA27XX(ha))
pdev->needs_freset = 1; pdev->needs_freset = 1;
ha->prev_topology = 0; ha->prev_topology = 0;
...@@ -2497,6 +2544,22 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2497,6 +2544,22 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
ha->mr.fw_hbt_en = 1; ha->mr.fw_hbt_en = 1;
ha->mr.host_info_resend = false; ha->mr.host_info_resend = false;
ha->mr.hinfo_resend_timer_tick = QLAFX00_HINFO_RESEND_INTERVAL; ha->mr.hinfo_resend_timer_tick = QLAFX00_HINFO_RESEND_INTERVAL;
} else if (IS_QLA27XX(ha)) {
ha->portnum = PCI_FUNC(ha->pdev->devfn);
ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
ha->mbx_count = MAILBOX_REGISTER_COUNT;
req_length = REQUEST_ENTRY_CNT_24XX;
rsp_length = RESPONSE_ENTRY_CNT_2300;
ha->max_loop_id = SNS_LAST_LOOP_ID_2300;
ha->init_cb_size = sizeof(struct mid_init_cb_81xx);
ha->gid_list_info_size = 8;
ha->optrom_size = OPTROM_SIZE_83XX;
ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX;
ha->isp_ops = &qla27xx_isp_ops;
ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX;
ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX;
ha->nvram_conf_off = ~0;
ha->nvram_data_off = ~0;
} }
ql_dbg_pci(ql_dbg_init, pdev, 0x001e, ql_dbg_pci(ql_dbg_init, pdev, 0x001e,
...@@ -2637,7 +2700,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2637,7 +2700,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
req->req_q_out = &ha->iobase->isp24.req_q_out; req->req_q_out = &ha->iobase->isp24.req_q_out;
rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in; rsp->rsp_q_in = &ha->iobase->isp24.rsp_q_in;
rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out; rsp->rsp_q_out = &ha->iobase->isp24.rsp_q_out;
if (ha->mqenable || IS_QLA83XX(ha)) { if (ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
req->req_q_in = &ha->mqiobase->isp25mq.req_q_in; req->req_q_in = &ha->mqiobase->isp25mq.req_q_in;
req->req_q_out = &ha->mqiobase->isp25mq.req_q_out; req->req_q_out = &ha->mqiobase->isp25mq.req_q_out;
rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in; rsp->rsp_q_in = &ha->mqiobase->isp25mq.rsp_q_in;
...@@ -2888,9 +2951,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -2888,9 +2951,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
iospace_config_failed: iospace_config_failed:
if (IS_P3P_TYPE(ha)) { if (IS_P3P_TYPE(ha)) {
if (!ha->nx_pcibase) if (!ha->nx_pcibase)
iounmap((device_reg_t __iomem *)ha->nx_pcibase); iounmap((device_reg_t *)ha->nx_pcibase);
if (!ql2xdbwr) if (!ql2xdbwr)
iounmap((device_reg_t __iomem *)ha->nxdb_wr_ptr); iounmap((device_reg_t *)ha->nxdb_wr_ptr);
} else { } else {
if (ha->iobase) if (ha->iobase)
iounmap(ha->iobase); iounmap(ha->iobase);
...@@ -3021,9 +3084,9 @@ qla2x00_unmap_iobases(struct qla_hw_data *ha) ...@@ -3021,9 +3084,9 @@ qla2x00_unmap_iobases(struct qla_hw_data *ha)
{ {
if (IS_QLA82XX(ha)) { if (IS_QLA82XX(ha)) {
iounmap((device_reg_t __iomem *)ha->nx_pcibase); iounmap((device_reg_t *)ha->nx_pcibase);
if (!ql2xdbwr) if (!ql2xdbwr)
iounmap((device_reg_t __iomem *)ha->nxdb_wr_ptr); iounmap((device_reg_t *)ha->nxdb_wr_ptr);
} else { } else {
if (ha->iobase) if (ha->iobase)
iounmap(ha->iobase); iounmap(ha->iobase);
...@@ -3034,7 +3097,7 @@ qla2x00_unmap_iobases(struct qla_hw_data *ha) ...@@ -3034,7 +3097,7 @@ qla2x00_unmap_iobases(struct qla_hw_data *ha)
if (ha->mqiobase) if (ha->mqiobase)
iounmap(ha->mqiobase); iounmap(ha->mqiobase);
if (IS_QLA83XX(ha) && ha->msixbase) if ((IS_QLA83XX(ha) || IS_QLA27XX(ha)) && ha->msixbase)
iounmap(ha->msixbase); iounmap(ha->msixbase);
} }
} }
...@@ -3448,7 +3511,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len, ...@@ -3448,7 +3511,7 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
ha->npiv_info = NULL; ha->npiv_info = NULL;
/* Get consistent memory allocated for EX-INIT-CB. */ /* Get consistent memory allocated for EX-INIT-CB. */
if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha)) { if (IS_CNA_CAPABLE(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha)) {
ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, ha->ex_init_cb = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL,
&ha->ex_init_cb_dma); &ha->ex_init_cb_dma);
if (!ha->ex_init_cb) if (!ha->ex_init_cb)
...@@ -3563,22 +3626,28 @@ static void ...@@ -3563,22 +3626,28 @@ static void
qla2x00_free_fw_dump(struct qla_hw_data *ha) qla2x00_free_fw_dump(struct qla_hw_data *ha)
{ {
if (ha->fce) if (ha->fce)
dma_free_coherent(&ha->pdev->dev, FCE_SIZE, ha->fce, dma_free_coherent(&ha->pdev->dev,
ha->fce_dma); FCE_SIZE, ha->fce, ha->fce_dma);
if (ha->fw_dump) { if (ha->eft)
if (ha->eft) dma_free_coherent(&ha->pdev->dev,
dma_free_coherent(&ha->pdev->dev, EFT_SIZE, ha->eft, ha->eft_dma);
ntohl(ha->fw_dump->eft_size), ha->eft, ha->eft_dma);
if (ha->fw_dump)
vfree(ha->fw_dump); vfree(ha->fw_dump);
} if (ha->fw_dump_template)
vfree(ha->fw_dump_template);
ha->fce = NULL; ha->fce = NULL;
ha->fce_dma = 0; ha->fce_dma = 0;
ha->eft = NULL; ha->eft = NULL;
ha->eft_dma = 0; ha->eft_dma = 0;
ha->fw_dump = NULL;
ha->fw_dumped = 0; ha->fw_dumped = 0;
ha->fw_dump_reading = 0; ha->fw_dump_reading = 0;
ha->fw_dump = NULL;
ha->fw_dump_len = 0;
ha->fw_dump_template = NULL;
ha->fw_dump_template_len = 0;
} }
/* /*
...@@ -5243,7 +5312,7 @@ qla2x00_timer(scsi_qla_host_t *vha) ...@@ -5243,7 +5312,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
/* Firmware interface routines. */ /* Firmware interface routines. */
#define FW_BLOBS 10 #define FW_BLOBS 11
#define FW_ISP21XX 0 #define FW_ISP21XX 0
#define FW_ISP22XX 1 #define FW_ISP22XX 1
#define FW_ISP2300 2 #define FW_ISP2300 2
...@@ -5254,6 +5323,7 @@ qla2x00_timer(scsi_qla_host_t *vha) ...@@ -5254,6 +5323,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
#define FW_ISP82XX 7 #define FW_ISP82XX 7
#define FW_ISP2031 8 #define FW_ISP2031 8
#define FW_ISP8031 9 #define FW_ISP8031 9
#define FW_ISP2071 10
#define FW_FILE_ISP21XX "ql2100_fw.bin" #define FW_FILE_ISP21XX "ql2100_fw.bin"
#define FW_FILE_ISP22XX "ql2200_fw.bin" #define FW_FILE_ISP22XX "ql2200_fw.bin"
...@@ -5265,6 +5335,8 @@ qla2x00_timer(scsi_qla_host_t *vha) ...@@ -5265,6 +5335,8 @@ qla2x00_timer(scsi_qla_host_t *vha)
#define FW_FILE_ISP82XX "ql8200_fw.bin" #define FW_FILE_ISP82XX "ql8200_fw.bin"
#define FW_FILE_ISP2031 "ql2600_fw.bin" #define FW_FILE_ISP2031 "ql2600_fw.bin"
#define FW_FILE_ISP8031 "ql8300_fw.bin" #define FW_FILE_ISP8031 "ql8300_fw.bin"
#define FW_FILE_ISP2071 "ql2700_fw.bin"
static DEFINE_MUTEX(qla_fw_lock); static DEFINE_MUTEX(qla_fw_lock);
...@@ -5279,6 +5351,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { ...@@ -5279,6 +5351,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = {
{ .name = FW_FILE_ISP82XX, }, { .name = FW_FILE_ISP82XX, },
{ .name = FW_FILE_ISP2031, }, { .name = FW_FILE_ISP2031, },
{ .name = FW_FILE_ISP8031, }, { .name = FW_FILE_ISP8031, },
{ .name = FW_FILE_ISP2071, },
}; };
struct fw_blob * struct fw_blob *
...@@ -5307,6 +5380,8 @@ qla2x00_request_firmware(scsi_qla_host_t *vha) ...@@ -5307,6 +5380,8 @@ qla2x00_request_firmware(scsi_qla_host_t *vha)
blob = &qla_fw_blobs[FW_ISP2031]; blob = &qla_fw_blobs[FW_ISP2031];
} else if (IS_QLA8031(ha)) { } else if (IS_QLA8031(ha)) {
blob = &qla_fw_blobs[FW_ISP8031]; blob = &qla_fw_blobs[FW_ISP8031];
} else if (IS_QLA2071(ha)) {
blob = &qla_fw_blobs[FW_ISP2071];
} else { } else {
return NULL; return NULL;
} }
...@@ -5636,6 +5711,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { ...@@ -5636,6 +5711,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8031) }, { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8031) },
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISPF001) }, { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISPF001) },
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8044) }, { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP8044) },
{ PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2071) },
{ 0 }, { 0 },
}; };
MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl);
......
...@@ -568,7 +568,7 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start) ...@@ -568,7 +568,7 @@ qla2xxx_find_flt_start(scsi_qla_host_t *vha, uint32_t *start)
else if (IS_P3P_TYPE(ha)) { else if (IS_P3P_TYPE(ha)) {
*start = FA_FLASH_LAYOUT_ADDR_82; *start = FA_FLASH_LAYOUT_ADDR_82;
goto end; goto end;
} else if (IS_QLA83XX(ha)) { } else if (IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
*start = FA_FLASH_LAYOUT_ADDR_83; *start = FA_FLASH_LAYOUT_ADDR_83;
goto end; goto end;
} }
...@@ -682,7 +682,7 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) ...@@ -682,7 +682,7 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
/* Assign FCP prio region since older adapters may not have FLT, or /* Assign FCP prio region since older adapters may not have FLT, or
FCP prio region in it's FLT. FCP prio region in it's FLT.
*/ */
ha->flt_region_fcp_prio = ha->flags.port0 ? ha->flt_region_fcp_prio = (ha->port_no == 0) ?
fcp_prio_cfg0[def] : fcp_prio_cfg1[def]; fcp_prio_cfg0[def] : fcp_prio_cfg1[def];
ha->flt_region_flt = flt_addr; ha->flt_region_flt = flt_addr;
...@@ -743,47 +743,71 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) ...@@ -743,47 +743,71 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
ha->flt_region_vpd_nvram = start; ha->flt_region_vpd_nvram = start;
if (IS_P3P_TYPE(ha)) if (IS_P3P_TYPE(ha))
break; break;
if (ha->flags.port0) if (ha->port_no == 0)
ha->flt_region_vpd = start; ha->flt_region_vpd = start;
break; break;
case FLT_REG_VPD_1: case FLT_REG_VPD_1:
if (IS_P3P_TYPE(ha) || IS_QLA8031(ha)) if (IS_P3P_TYPE(ha) || IS_QLA8031(ha))
break; break;
if (!ha->flags.port0) if (ha->port_no == 1)
ha->flt_region_vpd = start;
break;
case FLT_REG_VPD_2:
if (!IS_QLA27XX(ha))
break;
if (ha->port_no == 2)
ha->flt_region_vpd = start;
break;
case FLT_REG_VPD_3:
if (!IS_QLA27XX(ha))
break;
if (ha->port_no == 3)
ha->flt_region_vpd = start; ha->flt_region_vpd = start;
break; break;
case FLT_REG_NVRAM_0: case FLT_REG_NVRAM_0:
if (IS_QLA8031(ha)) if (IS_QLA8031(ha))
break; break;
if (ha->flags.port0) if (ha->port_no == 0)
ha->flt_region_nvram = start; ha->flt_region_nvram = start;
break; break;
case FLT_REG_NVRAM_1: case FLT_REG_NVRAM_1:
if (IS_QLA8031(ha)) if (IS_QLA8031(ha))
break; break;
if (!ha->flags.port0) if (ha->port_no == 1)
ha->flt_region_nvram = start;
break;
case FLT_REG_NVRAM_2:
if (!IS_QLA27XX(ha))
break;
if (ha->port_no == 2)
ha->flt_region_nvram = start;
break;
case FLT_REG_NVRAM_3:
if (!IS_QLA27XX(ha))
break;
if (ha->port_no == 3)
ha->flt_region_nvram = start; ha->flt_region_nvram = start;
break; break;
case FLT_REG_FDT: case FLT_REG_FDT:
ha->flt_region_fdt = start; ha->flt_region_fdt = start;
break; break;
case FLT_REG_NPIV_CONF_0: case FLT_REG_NPIV_CONF_0:
if (ha->flags.port0) if (ha->port_no == 0)
ha->flt_region_npiv_conf = start; ha->flt_region_npiv_conf = start;
break; break;
case FLT_REG_NPIV_CONF_1: case FLT_REG_NPIV_CONF_1:
if (!ha->flags.port0) if (ha->port_no == 1)
ha->flt_region_npiv_conf = start; ha->flt_region_npiv_conf = start;
break; break;
case FLT_REG_GOLD_FW: case FLT_REG_GOLD_FW:
ha->flt_region_gold_fw = start; ha->flt_region_gold_fw = start;
break; break;
case FLT_REG_FCP_PRIO_0: case FLT_REG_FCP_PRIO_0:
if (ha->flags.port0) if (ha->port_no == 0)
ha->flt_region_fcp_prio = start; ha->flt_region_fcp_prio = start;
break; break;
case FLT_REG_FCP_PRIO_1: case FLT_REG_FCP_PRIO_1:
if (!ha->flags.port0) if (ha->port_no == 1)
ha->flt_region_fcp_prio = start; ha->flt_region_fcp_prio = start;
break; break;
case FLT_REG_BOOT_CODE_82XX: case FLT_REG_BOOT_CODE_82XX:
...@@ -813,13 +837,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) ...@@ -813,13 +837,13 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
case FLT_REG_FCOE_NVRAM_0: case FLT_REG_FCOE_NVRAM_0:
if (!(IS_QLA8031(ha) || IS_QLA8044(ha))) if (!(IS_QLA8031(ha) || IS_QLA8044(ha)))
break; break;
if (ha->flags.port0) if (ha->port_no == 0)
ha->flt_region_nvram = start; ha->flt_region_nvram = start;
break; break;
case FLT_REG_FCOE_NVRAM_1: case FLT_REG_FCOE_NVRAM_1:
if (!(IS_QLA8031(ha) || IS_QLA8044(ha))) if (!(IS_QLA8031(ha) || IS_QLA8044(ha)))
break; break;
if (!ha->flags.port0) if (ha->port_no == 1)
ha->flt_region_nvram = start; ha->flt_region_nvram = start;
break; break;
} }
...@@ -832,12 +856,12 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr) ...@@ -832,12 +856,12 @@ qla2xxx_get_flt_info(scsi_qla_host_t *vha, uint32_t flt_addr)
ha->flt_region_fw = def_fw[def]; ha->flt_region_fw = def_fw[def];
ha->flt_region_boot = def_boot[def]; ha->flt_region_boot = def_boot[def];
ha->flt_region_vpd_nvram = def_vpd_nvram[def]; ha->flt_region_vpd_nvram = def_vpd_nvram[def];
ha->flt_region_vpd = ha->flags.port0 ? ha->flt_region_vpd = (ha->port_no == 0) ?
def_vpd0[def] : def_vpd1[def]; def_vpd0[def] : def_vpd1[def];
ha->flt_region_nvram = ha->flags.port0 ? ha->flt_region_nvram = (ha->port_no == 0) ?
def_nvram0[def] : def_nvram1[def]; def_nvram0[def] : def_nvram1[def];
ha->flt_region_fdt = def_fdt[def]; ha->flt_region_fdt = def_fdt[def];
ha->flt_region_npiv_conf = ha->flags.port0 ? ha->flt_region_npiv_conf = (ha->port_no == 0) ?
def_npiv_conf0[def] : def_npiv_conf1[def]; def_npiv_conf0[def] : def_npiv_conf1[def];
done: done:
ql_dbg(ql_dbg_init, vha, 0x004a, ql_dbg(ql_dbg_init, vha, 0x004a,
...@@ -989,7 +1013,7 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha) ...@@ -989,7 +1013,7 @@ qla2xxx_get_flash_info(scsi_qla_host_t *vha)
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) && if (!IS_QLA24XX_TYPE(ha) && !IS_QLA25XX(ha) &&
!IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha)) !IS_CNA_CAPABLE(ha) && !IS_QLA2031(ha) && !IS_QLA27XX(ha))
return QLA_SUCCESS; return QLA_SUCCESS;
ret = qla2xxx_find_flt_start(vha, &flt_addr); ret = qla2xxx_find_flt_start(vha, &flt_addr);
...@@ -1192,7 +1216,8 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr, ...@@ -1192,7 +1216,8 @@ qla24xx_write_flash_data(scsi_qla_host_t *vha, uint32_t *dwptr, uint32_t faddr,
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
/* Prepare burst-capable write on supported ISPs. */ /* Prepare burst-capable write on supported ISPs. */
if ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha)) && if ((IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA83XX(ha) ||
IS_QLA27XX(ha)) &&
!(faddr & 0xfff) && dwords > OPTROM_BURST_DWORDS) { !(faddr & 0xfff) && dwords > OPTROM_BURST_DWORDS) {
optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE, optrom = dma_alloc_coherent(&ha->pdev->dev, OPTROM_BURST_SIZE,
&optrom_dma, GFP_KERNEL); &optrom_dma, GFP_KERNEL);
...@@ -1675,7 +1700,7 @@ qla83xx_select_led_port(struct qla_hw_data *ha) ...@@ -1675,7 +1700,7 @@ qla83xx_select_led_port(struct qla_hw_data *ha)
if (!IS_QLA83XX(ha)) if (!IS_QLA83XX(ha))
goto out; goto out;
if (ha->flags.port0) if (ha->port_no == 0)
led_select_value = QLA83XX_LED_PORT0; led_select_value = QLA83XX_LED_PORT0;
else else
led_select_value = QLA83XX_LED_PORT1; led_select_value = QLA83XX_LED_PORT1;
...@@ -2332,7 +2357,7 @@ qla2x00_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ...@@ -2332,7 +2357,7 @@ qla2x00_write_optrom_data(struct scsi_qla_host *vha, uint8_t *buf,
*/ */
rest_addr = 0xffff; rest_addr = 0xffff;
sec_mask = 0x10000; sec_mask = 0x10000;
break; break;
} }
/* /*
* ST m29w010b part - 16kb sector size * ST m29w010b part - 16kb sector size
...@@ -2558,7 +2583,7 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf, ...@@ -2558,7 +2583,7 @@ qla25xx_read_optrom_data(struct scsi_qla_host *vha, uint8_t *buf,
uint32_t faddr, left, burst; uint32_t faddr, left, burst;
struct qla_hw_data *ha = vha->hw; struct qla_hw_data *ha = vha->hw;
if (IS_QLA25XX(ha) || IS_QLA81XX(ha)) if (IS_QLA25XX(ha) || IS_QLA81XX(ha) || IS_QLA27XX(ha))
goto try_fast; goto try_fast;
if (offset & 0xfff) if (offset & 0xfff)
goto slow_read; goto slow_read;
......
This diff is collapsed.
/*
* QLogic Fibre Channel HBA Driver
* Copyright (c) 2003-2013 QLogic Corporation
*
* See LICENSE.qla2xxx for copyright and licensing details.
*/
#ifndef __QLA_DMP27_H__
#define __QLA_DMP27_H__
#define IOBASE_ADDR offsetof(struct device_reg_24xx, iobase_addr)
struct __packed qla27xx_fwdt_template {
uint32_t template_type;
uint32_t entry_offset;
uint32_t template_size;
uint32_t reserved_1;
uint32_t entry_count;
uint32_t template_version;
uint32_t capture_timestamp;
uint32_t template_checksum;
uint32_t reserved_2;
uint32_t driver_info[3];
uint32_t saved_state[16];
uint32_t reserved_3[8];
uint32_t firmware_version[5];
};
#define TEMPLATE_TYPE_FWDUMP 99
#define ENTRY_TYPE_NOP 0
#define ENTRY_TYPE_TMP_END 255
#define ENTRY_TYPE_RD_IOB_T1 256
#define ENTRY_TYPE_WR_IOB_T1 257
#define ENTRY_TYPE_RD_IOB_T2 258
#define ENTRY_TYPE_WR_IOB_T2 259
#define ENTRY_TYPE_RD_PCI 260
#define ENTRY_TYPE_WR_PCI 261
#define ENTRY_TYPE_RD_RAM 262
#define ENTRY_TYPE_GET_QUEUE 263
#define ENTRY_TYPE_GET_FCE 264
#define ENTRY_TYPE_PSE_RISC 265
#define ENTRY_TYPE_RST_RISC 266
#define ENTRY_TYPE_DIS_INTR 267
#define ENTRY_TYPE_GET_HBUF 268
#define ENTRY_TYPE_SCRATCH 269
#define ENTRY_TYPE_RDREMREG 270
#define ENTRY_TYPE_WRREMREG 271
#define ENTRY_TYPE_RDREMRAM 272
#define ENTRY_TYPE_PCICFG 273
#define CAPTURE_FLAG_PHYS_ONLY BIT_0
#define CAPTURE_FLAG_PHYS_VIRT BIT_1
#define DRIVER_FLAG_SKIP_ENTRY BIT_7
struct __packed qla27xx_fwdt_entry {
struct __packed {
uint32_t entry_type;
uint32_t entry_size;
uint32_t reserved_1;
uint8_t capture_flags;
uint8_t reserved_2[2];
uint8_t driver_flags;
} hdr;
union __packed {
struct __packed {
} t0;
struct __packed {
} t255;
struct __packed {
uint32_t base_addr;
uint8_t reg_width;
uint16_t reg_count;
uint8_t pci_offset;
} t256;
struct __packed {
uint32_t base_addr;
uint32_t write_data;
uint8_t pci_offset;
uint8_t reserved[3];
} t257;
struct __packed {
uint32_t base_addr;
uint8_t reg_width;
uint16_t reg_count;
uint8_t pci_offset;
uint8_t banksel_offset;
uint8_t reserved[3];
uint32_t bank;
} t258;
struct __packed {
uint32_t base_addr;
uint32_t write_data;
uint8_t reserved[2];
uint8_t pci_offset;
uint8_t banksel_offset;
uint32_t bank;
} t259;
struct __packed {
uint8_t pci_addr;
uint8_t reserved[3];
} t260;
struct __packed {
uint8_t pci_addr;
uint8_t reserved[3];
uint32_t write_data;
} t261;
struct __packed {
uint8_t ram_area;
uint8_t reserved[3];
uint32_t start_addr;
uint32_t end_addr;
} t262;
struct __packed {
uint32_t num_queues;
uint8_t queue_type;
uint8_t reserved[3];
} t263;
struct __packed {
uint32_t fce_trace_size;
uint64_t write_pointer;
uint64_t base_pointer;
uint32_t fce_enable_mb0;
uint32_t fce_enable_mb2;
uint32_t fce_enable_mb3;
uint32_t fce_enable_mb4;
uint32_t fce_enable_mb5;
uint32_t fce_enable_mb6;
} t264;
struct __packed {
} t265;
struct __packed {
} t266;
struct __packed {
uint8_t pci_offset;
uint8_t reserved[3];
uint32_t data;
} t267;
struct __packed {
uint8_t buf_type;
uint8_t reserved[3];
uint32_t buf_size;
uint64_t start_addr;
} t268;
struct __packed {
uint32_t scratch_size;
} t269;
struct __packed {
uint32_t addr;
uint32_t count;
} t270;
struct __packed {
uint32_t addr;
uint32_t data;
} t271;
struct __packed {
uint32_t addr;
uint32_t count;
} t272;
struct __packed {
uint32_t addr;
uint32_t count;
} t273;
};
};
#define T262_RAM_AREA_CRITICAL_RAM 1
#define T262_RAM_AREA_EXTERNAL_RAM 2
#define T262_RAM_AREA_SHARED_RAM 3
#define T262_RAM_AREA_DDR_RAM 4
#define T263_QUEUE_TYPE_REQ 1
#define T263_QUEUE_TYPE_RSP 2
#define T263_QUEUE_TYPE_ATIO 3
#define T268_BUF_TYPE_EXTD_TRACE 1
#define T268_BUF_TYPE_EXCH_BUFOFF 2
#define T268_BUF_TYPE_EXTD_LOGIN 3
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment