Print this page
NEX-5979 QLogic 2322 flash bug
Reviewed by: Saso Kiselkov <saso.kiselkov@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
Reviewed by: Marcel Telka <marcel.telka@nexenta.com>
NEX-5717 import QLogic 16G FC drivers
Reviewed by: Steve Peng <steve.peng@nexenta.com>
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>
@@ -17,29 +17,29 @@
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
-/* Copyright 2010 QLogic Corporation */
+/* Copyright 2015 QLogic Corporation */
/*
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
-#pragma ident "Copyright 2010 QLogic Corporation; ql_xioctl.c"
+#pragma ident "Copyright 2015 QLogic Corporation; ql_xioctl.c"
/*
* ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file.
*
* ***********************************************************************
* * **
* * NOTICE **
- * * COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION **
+ * * COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION **
* * ALL RIGHTS RESERVED **
* * **
* ***********************************************************************
*
*/
@@ -49,10 +49,11 @@
#include <ql_debug.h>
#include <ql_init.h>
#include <ql_iocb.h>
#include <ql_ioctl.h>
#include <ql_mbx.h>
+#include <ql_nx.h>
#include <ql_xioctl.h>
/*
* Local data
*/
@@ -94,11 +95,11 @@
static int ql_lun_count(ql_adapter_state_t *, ql_tgt_t *);
static int ql_report_lun(ql_adapter_state_t *, ql_tgt_t *);
static int ql_inq_scan(ql_adapter_state_t *, ql_tgt_t *, int);
static int ql_inq(ql_adapter_state_t *, ql_tgt_t *, int, ql_mbx_iocb_t *,
- uint8_t);
+ uint32_t);
static uint32_t ql_get_buffer_data(caddr_t, caddr_t, uint32_t, int);
static uint32_t ql_send_buffer_data(caddr_t, caddr_t, uint32_t, int);
static int ql_24xx_flash_desc(ql_adapter_state_t *);
static int ql_setup_flash(ql_adapter_state_t *);
static ql_tgt_t *ql_find_port(ql_adapter_state_t *, uint8_t *, uint16_t);
@@ -114,12 +115,12 @@
static void ql_get_statistics_fc(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_statistics_fc4(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_set_led_state(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_led_state(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_drive_led(ql_adapter_state_t *, uint32_t);
-static uint32_t ql_setup_led(ql_adapter_state_t *);
-static uint32_t ql_wrapup_led(ql_adapter_state_t *);
+static int ql_setup_led(ql_adapter_state_t *);
+static int ql_wrapup_led(ql_adapter_state_t *);
static void ql_get_port_summary(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_target_id(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_sfp(ql_adapter_state_t *, EXT_IOCTL *, int);
static int ql_dump_sfp(ql_adapter_state_t *, void *, int);
static ql_fcache_t *ql_setup_fnode(ql_adapter_state_t *);
@@ -150,11 +151,18 @@
static void ql_get_dcbx_parameters(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_xgmac_statistics(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_fcf_list(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_get_resource_counts(ql_adapter_state_t *, EXT_IOCTL *, int);
static void ql_qry_adapter_versions(ql_adapter_state_t *, EXT_IOCTL *, int);
-static int ql_set_loop_point(ql_adapter_state_t *, uint16_t);
+static void ql_get_temperature(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_dump_cmd(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_serdes_reg(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_serdes_reg_ex(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_els_passthru(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_flash_update_caps(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_get_bbcr_data(ql_adapter_state_t *, EXT_IOCTL *, int);
+static void ql_get_priv_stats(ql_adapter_state_t *, EXT_IOCTL *, int);
/* ******************************************************************** */
/* External IOCTL support. */
/* ******************************************************************** */
@@ -174,14 +182,14 @@
int
ql_alloc_xioctl_resource(ql_adapter_state_t *ha)
{
ql_xioctl_t *xp;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (ha->xioctl != NULL) {
- QL_PRINT_9(CE_CONT, "(%d): already allocated done\n",
+ QL_PRINT_9(ha, "already allocated done\n",
ha->instance);
return (0);
}
xp = kmem_zalloc(sizeof (ql_xioctl_t), KM_SLEEP);
@@ -198,11 +206,11 @@
EL(ha, "failed, kmem_zalloc-2\n");
ql_free_xioctl_resource(ha);
return (ENOMEM);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (0);
}
/*
@@ -218,14 +226,14 @@
void
ql_free_xioctl_resource(ql_adapter_state_t *ha)
{
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (xp == NULL) {
- QL_PRINT_9(CE_CONT, "(%d): already freed\n", ha->instance);
+ QL_PRINT_9(ha, "already freed\n");
return;
}
if (xp->aen_tracking_queue != NULL) {
kmem_free(xp->aen_tracking_queue, EXT_DEF_MAX_AEN_QUEUE *
@@ -234,11 +242,11 @@
}
kmem_free(xp, sizeof (ql_xioctl_t));
ha->xioctl = NULL;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_xioctl
* External IOCTL processing.
@@ -264,14 +272,14 @@
ql_xioctl(ql_adapter_state_t *ha, int cmd, intptr_t arg, int mode,
cred_t *cred_p, int *rval_p)
{
int rval;
- QL_PRINT_9(CE_CONT, "(%d): started, cmd=%d\n", ha->instance, cmd);
+ QL_PRINT_9(ha, "started, cmd=%d\n", cmd);
if (ha->xioctl == NULL) {
- QL_PRINT_9(CE_CONT, "(%d): no context\n", ha->instance);
+ QL_PRINT_9(ha, "no context\n");
return (ENXIO);
}
switch (cmd) {
case EXT_CC_QUERY:
@@ -304,19 +312,27 @@
case EXT_CC_GET_VP_CNT_ID:
case EXT_CC_VPORT_CMD:
case EXT_CC_ACCESS_FLASH:
case EXT_CC_RESET_FW:
case EXT_CC_MENLO_MANAGE_INFO:
+ case EXT_CC_I2C_DATA:
+ case EXT_CC_DUMP:
+ case EXT_CC_SERDES_REG_OP:
+ case EXT_CC_VF_STATE:
+ case EXT_CC_SERDES_REG_OP_EX:
+ case EXT_CC_ELS_PASSTHRU_OS:
+ case EXT_CC_FLASH_UPDATE_CAPS_OS:
+ case EXT_CC_GET_BBCR_DATA_OS:
rval = ql_sdm_ioctl(ha, cmd, (void *)arg, mode);
break;
default:
/* function not supported. */
EL(ha, "function=%d not supported\n", cmd);
rval = ENOPROTOOPT;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -346,11 +362,11 @@
{
EXT_IOCTL *cmd;
int rval;
ql_adapter_state_t *vha;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Copy argument structure (EXT_IOCTL) from application land. */
if ((rval = ql_sdm_setup(ha, &cmd, arg, mode,
ql_validate_signature)) != 0) {
/*
@@ -366,12 +382,11 @@
* Map the physical ha ptr (which the ioctl is called with)
* to the virtual ha that the caller is addressing.
*/
if (ha->flags & VP_ENABLED) {
/* Check that it is within range. */
- if (cmd->HbaSelect > (CFG_IST(ha, CFG_CTRL_2422) ?
- MAX_24_VIRTUAL_PORTS : MAX_25_VIRTUAL_PORTS)) {
+ if (cmd->HbaSelect > ha->max_vports) {
EL(ha, "Invalid HbaSelect vp index: %xh\n",
cmd->HbaSelect);
cmd->Status = EXT_STATUS_INVALID_VPINDEX;
cmd->ResponseLen = 0;
return (EFAULT);
@@ -391,11 +406,11 @@
/*
* The specified vp index may be valid(within range)
* but it's not in the list. Currently this is all
* we can say.
*/
- if (vha == NULL) {
+ if (vha == NULL || !(vha->flags & VP_ENABLED)) {
cmd->Status = EXT_STATUS_INVALID_VPINDEX;
cmd->ResponseLen = 0;
return (EFAULT);
}
}
@@ -403,15 +418,18 @@
/*
* If driver is suspended, stalled, or powered down rtn BUSY
*/
if (ha->flags & ADAPTER_SUSPENDED ||
- ha->task_daemon_flags & DRIVER_STALL ||
+ (ha->task_daemon_flags & (DRIVER_STALL | ISP_ABORT_NEEDED |
+ ABORT_ISP_ACTIVE | LOOP_RESYNC_NEEDED | LOOP_RESYNC_ACTIVE)) ||
ha->power_level != PM_LEVEL_D0) {
EL(ha, " %s\n", ha->flags & ADAPTER_SUSPENDED ?
"driver suspended" :
- (ha->task_daemon_flags & DRIVER_STALL ? "driver stalled" :
+ (ha->task_daemon_flags & (DRIVER_STALL | ISP_ABORT_NEEDED |
+ ABORT_ISP_ACTIVE | LOOP_RESYNC_NEEDED |
+ LOOP_RESYNC_ACTIVE) ? "driver stalled" :
"FCA powered down"));
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
rval = EBUSY;
@@ -523,10 +541,31 @@
ql_access_flash(ha, cmd, mode);
break;
case EXT_CC_RESET_FW_OS:
ql_reset_cmd(ha, cmd);
break;
+ case EXT_CC_I2C_DATA:
+ ql_get_temperature(ha, cmd, mode);
+ break;
+ case EXT_CC_DUMP_OS:
+ ql_dump_cmd(ha, cmd, mode);
+ break;
+ case EXT_CC_SERDES_REG_OP:
+ ql_serdes_reg(ha, cmd, mode);
+ break;
+ case EXT_CC_SERDES_REG_OP_EX:
+ ql_serdes_reg_ex(ha, cmd, mode);
+ break;
+ case EXT_CC_ELS_PASSTHRU_OS:
+ ql_els_passthru(ha, cmd, mode);
+ break;
+ case EXT_CC_FLASH_UPDATE_CAPS_OS:
+ ql_flash_update_caps(ha, cmd, mode);
+ break;
+ case EXT_CC_GET_BBCR_DATA_OS:
+ ql_get_bbcr_data(ha, cmd, mode);
+ break;
default:
/* function not supported. */
EL(ha, "failed, function not supported=%d\n", ioctl_code);
cmd->Status = EXT_STATUS_INVALID_REQUEST;
@@ -538,11 +577,11 @@
if (ql_sdm_return(ha, cmd, arg, mode) == -1) {
EL(ha, "failed, sdm_return\n");
return (EFAULT);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (0);
}
/*
@@ -570,11 +609,11 @@
int mode, boolean_t (*val_sig)(EXT_IOCTL *))
{
int rval;
EXT_IOCTL *cmd;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Allocate local memory for EXT_IOCTL. */
*cmd_struct = NULL;
cmd = (EXT_IOCTL *)kmem_zalloc(sizeof (EXT_IOCTL), KM_SLEEP);
if (cmd == NULL) {
@@ -602,11 +641,11 @@
rval = EINVAL;
}
}
if (rval == 0) {
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
*cmd_struct = cmd;
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = 0;
} else {
kmem_free((void *)cmd, sizeof (EXT_IOCTL));
@@ -638,11 +677,11 @@
* If signature is not valid then neither is the rest of
* the structure (e.g., can't trust it), so don't attempt
* to return any error status other than the errno.
*/
if (bcmp(&cmd_struct->Signature, "QLOGIC", 6) != 0) {
- QL_PRINT_2(CE_CONT, "failed,\n");
+ QL_PRINT_2(NULL, "failed,\n");
return (B_FALSE);
}
return (B_TRUE);
}
@@ -670,11 +709,11 @@
static int
ql_sdm_return(ql_adapter_state_t *ha, EXT_IOCTL *cmd, void *arg, int mode)
{
int rval = 0;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
rval |= ddi_copyout((void *)&cmd->ResponseLen,
(void *)&(((EXT_IOCTL*)arg)->ResponseLen), sizeof (uint32_t),
mode);
@@ -691,11 +730,11 @@
/* Some copyout operation failed */
EL(ha, "failed, ddi_copyout\n");
return (EFAULT);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (0);
}
/*
@@ -714,11 +753,11 @@
* Kernel context.
*/
static void
ql_query(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started, cmd=%d\n", ha->instance,
+ QL_PRINT_9(ha, "started, cmd=%d\n",
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_SC_QUERY_HBA_NODE:
@@ -755,11 +794,11 @@
EL(ha, "failed, Unsupported Subcode=%xh\n",
cmd->SubCode);
break;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_qry_hba_node
* Performs EXT_SC_QUERY_HBA_NODE subfunction.
@@ -780,11 +819,11 @@
{
EXT_HBA_NODE tmp_node = {0};
uint_t len;
caddr_t bufp;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_HBA_NODE)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_HBA_NODE);
EL(ha, "failed, ResponseLen < EXT_HBA_NODE, "
@@ -817,11 +856,11 @@
} else {
w = (uint16_t)ddi_get16(ha->sbus_fpga_dev_handle,
(uint16_t *)
(ha->sbus_fpga_iobase + FPGA_REVISION));
- tmpptr = (char *)&(tmp_node.DriverVersion[verlen+1]);
+ tmpptr = (char *)&(tmp_node.DriverVersion[verlen + 1]);
if (tmpptr == NULL) {
EL(ha, "Unable to insert fpga version str\n");
} else {
(void) sprintf(tmpptr, "%d.%d",
((w & 0xf0) >> 4), (w & 0x0f));
@@ -832,11 +871,11 @@
(void) sprintf((char *)(tmp_node.FWVersion), "%01d.%02d.%02d",
ha->fw_major_version, ha->fw_minor_version,
ha->fw_subminor_version);
- if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
switch (ha->fw_attributes) {
case FWATTRIB_EF:
(void) strcat((char *)(tmp_node.FWVersion), " EF");
break;
case FWATTRIB_TP:
@@ -877,19 +916,25 @@
(void) sprintf((char *)tmp_node.OptRomVersion, "0");
}
tmp_node.PortCount = 1;
tmp_node.InterfaceType = EXT_DEF_FC_INTF_TYPE;
+ tmp_node.MpiVersion[0] = ha->mpi_fw_major_version;
+ tmp_node.MpiVersion[1] = ha->mpi_fw_minor_version;
+ tmp_node.MpiVersion[2] = ha->mpi_fw_subminor_version;
+ tmp_node.PepFwVersion[0] = ha->phy_fw_major_version;
+ tmp_node.PepFwVersion[1] = ha->phy_fw_minor_version;
+ tmp_node.PepFwVersion[2] = ha->phy_fw_subminor_version;
if (ddi_copyout((void *)&tmp_node,
(void *)(uintptr_t)(cmd->ResponseAdr),
sizeof (EXT_HBA_NODE), mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_HBA_NODE);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_hba_port
@@ -909,16 +954,16 @@
static void
ql_qry_hba_port(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
ql_link_t *link;
ql_tgt_t *tq;
- ql_mbx_data_t mr;
+ ql_mbx_data_t mr = {0};
EXT_HBA_PORT tmp_port = {0};
int rval;
uint16_t port_cnt, tgt_cnt, index;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_HBA_PORT)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_HBA_PORT);
EL(ha, "failed, ResponseLen < EXT_HBA_NODE, Len=%xh\n",
@@ -974,10 +1019,16 @@
tmp_port.PortSpeed = EXT_DEF_PORTSPEED_8GBIT;
break;
case IIDMA_RATE_10GB:
tmp_port.PortSpeed = EXT_DEF_PORTSPEED_10GBIT;
break;
+ case IIDMA_RATE_16GB:
+ tmp_port.PortSpeed = EXT_DEF_PORTSPEED_16GBIT;
+ break;
+ case IIDMA_RATE_32GB:
+ tmp_port.PortSpeed = EXT_DEF_PORTSPEED_32GBIT;
+ break;
default:
tmp_port.PortSpeed = EXT_DEF_PORTSPEED_UNKNOWN;
EL(ha, "failed, data rate=%xh\n", mr.mb[1]);
break;
}
@@ -1011,39 +1062,61 @@
default:
EL(ha, "sfp_stat: %xh\n", ha->sfp_stat);
break;
}
- } else if (CFG_IST(ha, CFG_CTRL_8081)) {
+ } else if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_10GBIT;
- } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+ } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_4GBIT |
EXT_DEF_PORTSPEED_2GBIT | EXT_DEF_PORTSPEED_1GBIT);
- } else if (CFG_IST(ha, CFG_CTRL_2300)) {
+ } else if (CFG_IST(ha, CFG_CTRL_23XX)) {
tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_2GBIT |
EXT_DEF_PORTSPEED_1GBIT);
- } else if (CFG_IST(ha, CFG_CTRL_6322)) {
+ } else if (CFG_IST(ha, CFG_CTRL_63XX)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT;
- } else if (CFG_IST(ha, CFG_CTRL_2200)) {
+ } else if (CFG_IST(ha, CFG_CTRL_22XX)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT;
+ } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+ tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_4GBIT |
+ EXT_DEF_PORTSPEED_8GBIT | EXT_DEF_PORTSPEED_16GBIT;
+ } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+ tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_4GBIT |
+ EXT_DEF_PORTSPEED_8GBIT | EXT_DEF_PORTSPEED_16GBIT |
+ EXT_DEF_PORTSPEED_32GBIT;
} else {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_UNKNOWN;
EL(ha, "unknown HBA type: %xh\n", ha->device_id);
}
+
+ if (ha->task_daemon_flags & LOOP_DOWN) {
+ (void) ql_get_firmware_state(ha, NULL);
+ }
+
+ tmp_port.LinkState1 = ha->fw_state[1];
tmp_port.LinkState2 = LSB(ha->sfp_stat);
+ tmp_port.LinkState3 = ha->fw_state[3];
+ tmp_port.LinkState6 = ha->fw_state[6];
+
port_cnt = 0;
tgt_cnt = 0;
for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
for (link = ha->dev[index].first; link != NULL;
link = link->next) {
tq = link->base_address;
- if (!VALID_TARGET_ID(ha, tq->loop_id)) {
+ if (!VALID_TARGET_ID(ha, tq->loop_id) ||
+ tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
continue;
}
+ if (tq->flags & (TQF_RSCN_RCVD | TQF_IIDMA_NEEDED |
+ TQF_NEED_AUTHENTICATION | TQF_PLOGI_PROGRS)) {
+ continue;
+ }
+
port_cnt++;
if ((tq->flags & TQF_INITIATOR_DEVICE) == 0) {
tgt_cnt++;
}
}
@@ -1061,11 +1134,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_HBA_PORT);
- QL_PRINT_9(CE_CONT, "(%d): done, ports=%d, targets=%d\n",
+ QL_PRINT_9(ha, "done, ports=%d, targets=%d\n",
ha->instance, port_cnt, tgt_cnt);
}
}
/*
@@ -1092,11 +1165,11 @@
ql_link_t *link;
ql_tgt_t *tq;
uint16_t index;
uint16_t inst = 0;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_DISC_PORT)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_DISC_PORT);
EL(ha, "failed, ResponseLen < EXT_DISC_PORT, Len=%xh\n",
@@ -1109,13 +1182,20 @@
index < DEVICE_HEAD_LIST_SIZE && link == NULL; index++) {
for (link = ha->dev[index].first; link != NULL;
link = link->next) {
tq = link->base_address;
- if (!VALID_TARGET_ID(ha, tq->loop_id)) {
+ if (!VALID_TARGET_ID(ha, tq->loop_id) ||
+ tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
continue;
}
+
+ if (tq->flags & (TQF_RSCN_RCVD | TQF_IIDMA_NEEDED |
+ TQF_NEED_AUTHENTICATION | TQF_PLOGI_PROGRS)) {
+ continue;
+ }
+
if (inst != cmd->Instance) {
inst++;
continue;
}
@@ -1169,11 +1249,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_DISC_PORT);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_disc_tgt
@@ -1199,11 +1279,11 @@
ql_link_t *link;
ql_tgt_t *tq;
uint16_t index;
uint16_t inst = 0;
- QL_PRINT_9(CE_CONT, "(%d): started, target=%d\n", ha->instance,
+ QL_PRINT_9(ha, "started, target=%d\n",
cmd->Instance);
if (cmd->ResponseLen < sizeof (EXT_DISC_TARGET)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_DISC_TARGET);
@@ -1219,11 +1299,12 @@
for (link = ha->dev[index].first; link != NULL;
link = link->next) {
tq = link->base_address;
if (!VALID_TARGET_ID(ha, tq->loop_id) ||
- tq->flags & TQF_INITIATOR_DEVICE) {
+ tq->flags & TQF_INITIATOR_DEVICE ||
+ tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
continue;
}
if (inst != cmd->Instance) {
inst++;
continue;
@@ -1281,11 +1362,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_DISC_TARGET);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_fw
@@ -1305,11 +1386,11 @@
static void
ql_qry_fw(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_FW fw_info = {0};
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_FW)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_FW);
EL(ha, "failed, ResponseLen < EXT_FW, Len=%xh\n",
@@ -1331,11 +1412,11 @@
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
return;
} else {
cmd->ResponseLen = sizeof (EXT_FW);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_chip
@@ -1354,12 +1435,13 @@
*/
static void
ql_qry_chip(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_CHIP chip = {0};
+ uint16_t PciDevNumber;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_CHIP)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_CHIP);
EL(ha, "failed, ResponseLen < EXT_CHIP, Len=%xh\n",
@@ -1375,23 +1457,28 @@
chip.IoAddr = ql_pci_config_get32(ha, PCI_CONF_BASE0);
chip.IoAddrLen = 0x100;
chip.MemAddr = ql_pci_config_get32(ha, PCI_CONF_BASE1);
chip.MemAddrLen = 0x100;
chip.ChipRevID = ha->rev_id;
- if (ha->flags & FUNCTION_1) {
- chip.FuncNo = 1;
- }
+ chip.FuncNo = ha->pci_function_number;
+ chip.PciBusNumber = (uint16_t)
+ ((ha->pci_bus_addr & PCI_REG_BUS_M) >> PCI_REG_BUS_SHIFT);
+ PciDevNumber = (uint16_t)
+ ((ha->pci_bus_addr & PCI_REG_DEV_M) >> PCI_REG_DEV_SHIFT);
+ chip.PciSlotNumber = (uint16_t)(((PciDevNumber << 3) & 0xF8) |
+ (chip.FuncNo & 0x7));
+
if (ddi_copyout((void *)&chip,
(void *)(uintptr_t)(cmd->ResponseAdr),
sizeof (EXT_CHIP), mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_CHIP);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_driver
@@ -1411,11 +1498,11 @@
static void
ql_qry_driver(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_DRIVER qd = {0};
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_DRIVER)) {
cmd->Status = EXT_STATUS_DATA_OVERRUN;
cmd->DetailStatus = sizeof (EXT_DRIVER);
EL(ha, "failed, ResponseLen < EXT_DRIVER, Len=%xh\n",
@@ -1425,11 +1512,11 @@
}
(void) strcpy((void *)&qd.Version[0], QL_VERSION);
qd.NumOfBus = 1; /* Fixed for Solaris */
qd.TargetsPerBus = (uint16_t)
- (CFG_IST(ha, (CFG_CTRL_24258081 | CFG_EXT_FW_INTERFACE)) ?
+ (CFG_IST(ha, (CFG_ISP_FW_TYPE_2 | CFG_EXT_FW_INTERFACE)) ?
MAX_24_FIBRE_DEVICES : MAX_22_FIBRE_DEVICES);
qd.LunsPerTarget = 2030;
qd.MaxTransferLen = QL_DMA_MAX_XFER_SIZE;
qd.MaxDataSegments = QL_DMA_SG_LIST_LENGTH;
@@ -1438,11 +1525,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_DRIVER);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_fcct
@@ -1471,14 +1558,14 @@
ql_ct_iu_preamble_t *ct;
ql_xioctl_t *xp = ha->xioctl;
ql_tgt_t tq;
uint16_t comp_status, loop_id;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Get CT argument structure. */
- if ((ha->topology & QL_SNS_CONNECTION) == 0) {
+ if ((ha->topology & QL_FABRIC_CONNECTION) == 0) {
EL(ha, "failed, No switch\n");
cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
cmd->ResponseLen = 0;
return;
}
@@ -1493,11 +1580,11 @@
/* Login management server device. */
if ((xp->flags & QL_MGMT_SERVER_LOGIN) == 0) {
tq.d_id.b.al_pa = 0xfa;
tq.d_id.b.area = 0xff;
tq.d_id.b.domain = 0xff;
- tq.loop_id = (uint16_t)(CFG_IST(ha, CFG_CTRL_24258081) ?
+ tq.loop_id = (uint16_t)(CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
MANAGEMENT_SERVER_24XX_LOOP_ID :
MANAGEMENT_SERVER_LOOP_ID);
rval = ql_login_fport(ha, &tq, tq.loop_id, LFF_NO_PRLI, &mr);
if (rval != QL_SUCCESS) {
EL(ha, "failed, server login\n");
@@ -1507,11 +1594,11 @@
} else {
xp->flags |= QL_MGMT_SERVER_LOGIN;
}
}
- QL_PRINT_9(CE_CONT, "(%d): cmd\n", ha->instance);
+ QL_PRINT_9(ha, "cmd\n");
QL_DUMP_9(cmd, 8, sizeof (EXT_IOCTL));
/* Allocate a DMA Memory Descriptor */
dma_mem = (dma_mem_t *)kmem_zalloc(sizeof (dma_mem_t), KM_SLEEP);
if (dma_mem == NULL) {
@@ -1549,12 +1636,12 @@
}
/* Get DMA memory for the IOCB */
if (ql_get_dma_mem(ha, dma_mem, pkt_size, LITTLE_ENDIAN_DMA,
QL_DMA_RING_ALIGN) != QL_SUCCESS) {
- cmn_err(CE_WARN, "%s(%d): DMA memory "
- "alloc failed", QL_NAME, ha->instance);
+ cmn_err(CE_WARN, "%sDMA memory "
+ "alloc failed", QL_NAME);
kmem_free(pkt, pkt_size);
kmem_free(dma_mem, sizeof (dma_mem_t));
cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
cmd->ResponseLen = 0;
return;
@@ -1570,11 +1657,11 @@
/*
* Setup IOCB
*/
ct = (ql_ct_iu_preamble_t *)pld;
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
pkt->ms24.entry_type = CT_PASSTHRU_TYPE;
pkt->ms24.entry_count = 1;
pkt->ms24.vp_index = ha->vp_index;
@@ -1595,11 +1682,11 @@
pkt->ms24.cmd_byte_count = LE_32(cmd->RequestLen);
/* Load ct rsp byte count. */
pkt->ms24.resp_byte_count = LE_32(cmd->ResponseLen);
- long_ptr = (uint32_t *)&pkt->ms24.dseg_0_address;
+ long_ptr = (uint32_t *)&pkt->ms24.dseg;
/* Load MS command entry data segments. */
*long_ptr++ = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
*long_ptr++ = (uint32_t)
@@ -1657,24 +1744,24 @@
pkt->ms.cmd_dseg_count_l = 1;
pkt->ms.total_dseg_count = LE_16(2);
/* Response total byte count. */
pkt->ms.resp_byte_count = LE_32(cmd->ResponseLen);
- pkt->ms.dseg_1_length = LE_32(cmd->ResponseLen);
+ pkt->ms.dseg[1].length = LE_32(cmd->ResponseLen);
/* Command total byte count. */
pkt->ms.cmd_byte_count = LE_32(cmd->RequestLen);
- pkt->ms.dseg_0_length = LE_32(cmd->RequestLen);
+ pkt->ms.dseg[0].length = LE_32(cmd->RequestLen);
/* Load command/response data segments. */
- pkt->ms.dseg_0_address[0] = (uint32_t)
+ pkt->ms.dseg[0].address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->ms.dseg_0_address[1] = (uint32_t)
+ pkt->ms.dseg[0].address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
- pkt->ms.dseg_1_address[0] = (uint32_t)
+ pkt->ms.dseg[1].address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->ms.dseg_1_address[1] = (uint32_t)
+ pkt->ms.dseg[1].address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
sizeof (ql_mbx_iocb_t));
@@ -1704,11 +1791,11 @@
(uint8_t *)dma_mem->bp, pld_byte_cnt,
DDI_DEV_AUTOINCR);
/* Copy response payload from DMA buffer to application. */
if (cmd->ResponseLen != 0) {
- QL_PRINT_9(CE_CONT, "(%d): ResponseLen=%d\n", ha->instance,
+ QL_PRINT_9(ha, "ResponseLen=%d\n",
cmd->ResponseLen);
QL_DUMP_9(pld, 8, cmd->ResponseLen);
/* Send response payload. */
if (ql_send_buffer_data(pld,
@@ -1722,11 +1809,11 @@
kmem_free(pkt, pkt_size);
ql_free_dma_resource(ha, dma_mem);
kmem_free(dma_mem, sizeof (dma_mem_t));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_aen_reg
* IOCTL management server Asynchronous Event Tracking Enable/Disable.
@@ -1747,11 +1834,11 @@
{
EXT_REG_AEN reg_struct;
int rval = 0;
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
rval = ddi_copyin((void*)(uintptr_t)cmd->RequestAdr, ®_struct,
cmd->RequestLen, mode);
if (rval == 0) {
@@ -1763,11 +1850,11 @@
INTR_LOCK(ha);
xp->aen_q_head = 0;
xp->aen_q_tail = 0;
INTR_UNLOCK(ha);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
} else {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, ddi_copyin\n");
}
}
@@ -1796,11 +1883,11 @@
uint8_t i;
uint8_t queue_cnt;
uint8_t request_cnt;
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Compute the number of events that can be returned */
request_cnt = (uint8_t)(cmd->ResponseLen / sizeof (EXT_ASYNC_EVENT));
if (request_cnt < EXT_DEF_MAX_AEN_QUEUE) {
@@ -1853,11 +1940,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = out_size;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_enqueue_aen
@@ -1877,15 +1964,15 @@
uint8_t new_entry; /* index to current entry */
uint16_t *mbx;
EXT_ASYNC_EVENT *aen_queue;
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started, event_code=%d\n", ha->instance,
+ QL_PRINT_9(ha, "started, event_code=%d\n",
event_code);
if (xp == NULL) {
- QL_PRINT_9(CE_CONT, "(%d): no context\n", ha->instance);
+ QL_PRINT_9(ha, "no context\n");
return;
}
aen_queue = (EXT_ASYNC_EVENT *)xp->aen_tracking_queue;
if (aen_queue[xp->aen_q_tail].AsyncEventCode != NULL) {
@@ -1947,11 +2034,11 @@
aen_queue[new_entry].AsyncEventCode = 0;
break;
}
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_scsi_passthru
* IOCTL SCSI passthrough.
@@ -2011,11 +2098,11 @@
uint8_t state_flags_h;
uint8_t scsi_status_l;
uint8_t scsi_status_h;
} sts;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Verify Sub Code and set cnt to needed request size. */
if (cmd->SubCode == EXT_SC_SEND_SCSI_PASSTHRU) {
pld_size = sizeof (EXT_SCSI_PASSTHRU);
} else if (cmd->SubCode == EXT_SC_SEND_FC_SCSI_PASSTHRU) {
@@ -2067,42 +2154,42 @@
scsi_req.u_sense = &usp_req->SenseData[0];
cmd->DetailStatus = EXT_DSTATUS_TARGET;
qlnt = QLNT_PORT;
name = (uint8_t *)&sp_req->TargetAddr.Target;
- QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, Target=%lld\n",
+ QL_PRINT_9(ha, "SubCode=%xh, Target=%lld\n",
ha->instance, cmd->SubCode, sp_req->TargetAddr.Target);
tq = ql_find_port(ha, name, qlnt);
} else {
/*
* Must be FC PASSTHRU, verified above.
*/
if (fc_req->FCScsiAddr.DestType == EXT_DEF_DESTTYPE_WWPN) {
qlnt = QLNT_PORT;
name = &fc_req->FCScsiAddr.DestAddr.WWPN[0];
- QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, "
+ QL_PRINT_9(ha, "SubCode=%xh, "
"wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
ha->instance, cmd->SubCode, name[0], name[1],
name[2], name[3], name[4], name[5], name[6],
name[7]);
tq = ql_find_port(ha, name, qlnt);
} else if (fc_req->FCScsiAddr.DestType ==
EXT_DEF_DESTTYPE_WWNN) {
qlnt = QLNT_NODE;
name = &fc_req->FCScsiAddr.DestAddr.WWNN[0];
- QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, "
+ QL_PRINT_9(ha, "SubCode=%xh, "
"wwnn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
ha->instance, cmd->SubCode, name[0], name[1],
name[2], name[3], name[4], name[5], name[6],
name[7]);
tq = ql_find_port(ha, name, qlnt);
} else if (fc_req->FCScsiAddr.DestType ==
EXT_DEF_DESTTYPE_PORTID) {
qlnt = QLNT_PID;
name = &fc_req->FCScsiAddr.DestAddr.Id[0];
- QL_PRINT_9(CE_CONT, "(%d): SubCode=%xh, PID="
- "%02x%02x%02x\n", ha->instance, cmd->SubCode,
+ QL_PRINT_9(ha, "SubCode=%xh, PID="
+ "%02x%02x%02x\n", cmd->SubCode,
name[0], name[1], name[2]);
tq = ql_find_port(ha, name, qlnt);
} else {
EL(ha, "failed, SubCode=%xh invalid DestType=%xh\n",
cmd->SubCode, fc_req->FCScsiAddr.DestType);
@@ -2149,25 +2236,25 @@
pld = (caddr_t)pkt + sizeof (ql_mbx_iocb_t);
/* Get DMA memory for the IOCB */
if (ql_get_dma_mem(ha, dma_mem, pld_size, LITTLE_ENDIAN_DMA,
QL_DMA_DATA_ALIGN) != QL_SUCCESS) {
- cmn_err(CE_WARN, "%s(%d): request queue DMA memory "
- "alloc failed", QL_NAME, ha->instance);
+ cmn_err(CE_WARN, "%srequest queue DMA memory "
+ "alloc failed", QL_NAME);
kmem_free(pkt, pkt_size);
cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
cmd->ResponseLen = 0;
return;
}
if (scsi_req.direction == EXT_DEF_SCSI_PASSTHRU_DATA_IN) {
scsi_req.direction = (uint8_t)
- (CFG_IST(ha, CFG_CTRL_24258081) ?
+ (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
CF_RD : CF_DATA_IN | CF_STAG);
} else {
scsi_req.direction = (uint8_t)
- (CFG_IST(ha, CFG_CTRL_24258081) ?
+ (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
CF_WR : CF_DATA_OUT | CF_STAG);
cmd->ResponseLen = 0;
/* Get command payload. */
if (ql_get_buffer_data(
@@ -2191,11 +2278,11 @@
(void) ddi_dma_sync(dma_mem->dma_handle, 0,
dma_mem->size, DDI_DMA_SYNC_FORDEV);
}
} else {
scsi_req.direction = (uint8_t)
- (CFG_IST(ha, CFG_CTRL_24258081) ? 0 : CF_STAG);
+ (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? 0 : CF_STAG);
cmd->ResponseLen = 0;
pkt_size = sizeof (ql_mbx_iocb_t);
pkt = kmem_zalloc(pkt_size, KM_SLEEP);
if (pkt == NULL) {
@@ -2210,27 +2297,47 @@
/* retries = ha->port_down_retry_count; */
retries = 1;
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = EXT_DSTATUS_NOADNL_INFO;
- QL_PRINT_9(CE_CONT, "(%d): SCSI cdb\n", ha->instance);
+ QL_PRINT_9(ha, "SCSI cdb\n");
QL_DUMP_9(scsi_req.cdbp, 8, scsi_req.cdb_len);
do {
if (DRIVER_SUSPENDED(ha)) {
sts.comp_status = CS_LOOP_DOWN_ABORT;
break;
}
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+ uint64_t lun_addr = 0;
+ fcp_ent_addr_t *fcp_ent_addr = 0;
+
pkt->cmd24.entry_type = IOCB_CMD_TYPE_7;
pkt->cmd24.entry_count = 1;
- /* Set LUN number */
- pkt->cmd24.fcp_lun[2] = LSB(scsi_req.lun);
- pkt->cmd24.fcp_lun[3] = MSB(scsi_req.lun);
+ /* Set LUN number and address method */
+ lun_addr = ql_get_lun_addr(tq, scsi_req.lun);
+ fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
+ pkt->cmd24.fcp_lun[2] =
+ lobyte(fcp_ent_addr->ent_addr_0);
+ pkt->cmd24.fcp_lun[3] =
+ hibyte(fcp_ent_addr->ent_addr_0);
+ pkt->cmd24.fcp_lun[0] =
+ lobyte(fcp_ent_addr->ent_addr_1);
+ pkt->cmd24.fcp_lun[1] =
+ hibyte(fcp_ent_addr->ent_addr_1);
+ pkt->cmd24.fcp_lun[6] =
+ lobyte(fcp_ent_addr->ent_addr_2);
+ pkt->cmd24.fcp_lun[7] =
+ hibyte(fcp_ent_addr->ent_addr_2);
+ pkt->cmd24.fcp_lun[4] =
+ lobyte(fcp_ent_addr->ent_addr_3);
+ pkt->cmd24.fcp_lun[5] =
+ hibyte(fcp_ent_addr->ent_addr_3);
+
/* Set N_port handle */
pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
/* Set VP Index */
pkt->cmd24.vp_index = ha->vp_index;
@@ -2242,13 +2349,13 @@
/* Set ISP command timeout. */
pkt->cmd24.timeout = (uint16_t)LE_16(15);
/* Load SCSI CDB */
- ddi_rep_put8(ha->hba_buf.acc_handle, scsi_req.cdbp,
- pkt->cmd24.scsi_cdb, scsi_req.cdb_len,
- DDI_DEV_AUTOINCR);
+ ddi_rep_put8(ha->req_q[0]->req_ring.acc_handle,
+ scsi_req.cdbp, pkt->cmd24.scsi_cdb,
+ scsi_req.cdb_len, DDI_DEV_AUTOINCR);
for (cnt = 0; cnt < MAX_CMDSZ;
cnt = (uint16_t)(cnt + 4)) {
ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
+ cnt, 4);
}
@@ -2265,15 +2372,15 @@
/* Load total byte count. */
pkt->cmd24.total_byte_count = LE_32(pld_size);
/* Load data descriptor. */
- pkt->cmd24.dseg_0_address[0] = (uint32_t)
+ pkt->cmd24.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->cmd24.dseg_0_address[1] = (uint32_t)
+ pkt->cmd24.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
- pkt->cmd24.dseg_0_length = LE_32(pld_size);
+ pkt->cmd24.dseg.length = LE_32(pld_size);
}
} else if (CFG_IST(ha, CFG_ENABLE_64BIT_ADDRESSING)) {
pkt->cmd3.entry_type = IOCB_CMD_TYPE_3;
pkt->cmd3.entry_count = 1;
if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
@@ -2290,15 +2397,15 @@
pkt->cmd3.scsi_cdb[cnt] = scsi_req.cdbp[cnt];
}
if (pld_size) {
pkt->cmd3.dseg_count = LE_16(1);
pkt->cmd3.byte_count = LE_32(pld_size);
- pkt->cmd3.dseg_0_address[0] = (uint32_t)
+ pkt->cmd3.dseg[0].address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->cmd3.dseg_0_address[1] = (uint32_t)
+ pkt->cmd3.dseg[0].address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
- pkt->cmd3.dseg_0_length = LE_32(pld_size);
+ pkt->cmd3.dseg[0].length = LE_32(pld_size);
}
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
pkt->cmd.entry_count = 1;
if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
@@ -2315,17 +2422,17 @@
pkt->cmd.scsi_cdb[cnt] = scsi_req.cdbp[cnt];
}
if (pld_size) {
pkt->cmd.dseg_count = LE_16(1);
pkt->cmd.byte_count = LE_32(pld_size);
- pkt->cmd.dseg_0_address = (uint32_t)
+ pkt->cmd.dseg[0].address = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->cmd.dseg_0_length = LE_32(pld_size);
+ pkt->cmd.dseg[0].length = LE_32(pld_size);
}
}
/* Go issue command and wait for completion. */
- QL_PRINT_9(CE_CONT, "(%d): request pkt\n", ha->instance);
+ QL_PRINT_9(ha, "request pkt\n");
QL_DUMP_9(pkt, 8, pkt_size);
status = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
if (pld_size) {
@@ -2336,11 +2443,11 @@
ddi_rep_get8(dma_mem->acc_handle, (uint8_t *)pld,
(uint8_t *)dma_mem->bp, pld_size,
DDI_DEV_AUTOINCR);
}
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
pkt->sts24.entry_status = (uint8_t)
(pkt->sts24.entry_status & 0x3c);
} else {
pkt->sts.entry_status = (uint8_t)
(pkt->sts.entry_status & 0x7e);
@@ -2350,11 +2457,12 @@
EL(ha, "failed, entry_status=%xh, d_id=%xh\n",
pkt->sts.entry_status, tq->d_id.b24);
status = QL_FUNCTION_PARAMETER_ERROR;
}
- sts.comp_status = (uint16_t)(CFG_IST(ha, CFG_CTRL_24258081) ?
+ sts.comp_status = (uint16_t)
+ (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ?
LE_16(pkt->sts24.comp_status) :
LE_16(pkt->sts.comp_status));
/*
* We have verified about all the request that can be so far.
@@ -2413,11 +2521,11 @@
cmd->ResponseLen = 0;
return;
}
/* Setup status. */
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
sts.scsi_status_l = pkt->sts24.scsi_status_l;
sts.scsi_status_h = pkt->sts24.scsi_status_h;
/* Setup residuals. */
sts.residual_length = LE_32(pkt->sts24.residual_length);
@@ -2488,11 +2596,11 @@
sts.req_sense_length = sts.scsi_status_h & FCP_SNS_LEN_VALID ?
LE_16(pkt->sts.req_sense_length) : 0;
sts.req_sense_data = &pkt->sts.req_sense_data[0];
}
- QL_PRINT_9(CE_CONT, "(%d): response pkt\n", ha->instance);
+ QL_PRINT_9(ha, "response pkt\n");
QL_DUMP_9(&pkt->sts, 8, sizeof (sts_entry_t));
switch (sts.comp_status) {
case CS_INCOMPLETE:
case CS_ABORTED:
@@ -2552,15 +2660,15 @@
}
/* Correct ISP completion status */
if (sts.comp_status == CS_COMPLETE && sts.scsi_status_l == 0 &&
(sts.scsi_status_h & FCP_RSP_MASK) == 0) {
- QL_PRINT_9(CE_CONT, "(%d): Correct completion\n",
+ QL_PRINT_9(ha, "Correct completion\n",
ha->instance);
scsi_req.resid = 0;
} else if (sts.comp_status == CS_DATA_UNDERRUN) {
- QL_PRINT_9(CE_CONT, "(%d): Correct UNDERRUN\n",
+ QL_PRINT_9(ha, "Correct UNDERRUN\n",
ha->instance);
scsi_req.resid = sts.residual_length;
if (sts.scsi_status_h & FCP_RESID_UNDER) {
cmd->Status = (uint32_t)EXT_STATUS_OK;
@@ -2570,12 +2678,12 @@
EL(ha, "failed, Transfer ERROR\n");
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
}
} else {
- QL_PRINT_9(CE_CONT, "(%d): error d_id=%xh, comp_status=%xh, "
- "scsi_status_h=%xh, scsi_status_l=%xh\n", ha->instance,
+ QL_PRINT_9(ha, "error d_id=%xh, comp_status=%xh, "
+ "scsi_status_h=%xh, scsi_status_l=%xh\n",
tq->d_id.b24, sts.comp_status, sts.scsi_status_h,
sts.scsi_status_l);
scsi_req.resid = pld_size;
/*
@@ -2636,12 +2744,12 @@
}
/* Copy response payload from DMA buffer to application. */
if (scsi_req.direction & (CF_RD | CF_DATA_IN) &&
cmd->ResponseLen != 0) {
- QL_PRINT_9(CE_CONT, "(%d): Data Return resid=%lu, "
- "byte_count=%u, ResponseLen=%xh\n", ha->instance,
+ QL_PRINT_9(ha, "Data Return resid=%lu, "
+ "byte_count=%u, ResponseLen=%xh\n",
scsi_req.resid, pld_size, cmd->ResponseLen);
QL_DUMP_9(pld, 8, cmd->ResponseLen);
/* Send response payload. */
if (ql_send_buffer_data(pld,
@@ -2656,11 +2764,11 @@
if (cmd->Status != EXT_STATUS_OK) {
EL(ha, "failed, cmd->Status=%xh, comp_status=%xh, "
"d_id=%xh\n", cmd->Status, sts.comp_status, tq->d_id.b24);
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done, ResponseLen=%d\n",
+ QL_PRINT_9(ha, "done, ResponseLen=%d\n",
ha->instance, cmd->ResponseLen);
}
kmem_free(pkt, pkt_size);
ql_free_dma_resource(ha, dma_mem);
@@ -2684,11 +2792,11 @@
int status;
uint8_t wwpn[EXT_DEF_WWN_NAME_SIZE];
EXT_SCSI_ADDR *tmp_addr;
ql_tgt_t *tq;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->RequestLen != EXT_DEF_WWN_NAME_SIZE) {
/* Return error */
EL(ha, "incorrect RequestLen\n");
cmd->Status = EXT_STATUS_INVALID_PARAM;
@@ -2722,11 +2830,11 @@
if (status != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->Status = EXT_STATUS_OK;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_host_idx
@@ -2746,11 +2854,11 @@
static void
ql_host_idx(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
uint16_t idx;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (uint16_t)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (uint16_t);
EL(ha, "failed, ResponseLen < Len=%xh\n", cmd->ResponseLen);
@@ -2765,11 +2873,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (uint16_t);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_host_drvname
@@ -2791,13 +2899,13 @@
{
char drvname[] = QL_NAME;
uint32_t qlnamelen;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- qlnamelen = (uint32_t)(strlen(QL_NAME)+1);
+ qlnamelen = (uint32_t)(strlen(QL_NAME) + 1);
if (cmd->ResponseLen < qlnamelen) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = qlnamelen;
EL(ha, "failed, ResponseLen: %xh, needed: %xh\n",
@@ -2811,14 +2919,14 @@
qlnamelen, mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
- cmd->ResponseLen = qlnamelen-1;
+ cmd->ResponseLen = qlnamelen - 1;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_read_nvram
* Get NVRAM contents.
@@ -2836,11 +2944,11 @@
*/
static void
ql_read_nvram(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < ha->nvram_cache->size) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = ha->nvram_cache->size;
EL(ha, "failed, ResponseLen != NVRAM, Len=%xh\n",
@@ -2855,11 +2963,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, copy error\n");
} else {
cmd->ResponseLen = ha->nvram_cache->size;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_write_nvram
@@ -2878,11 +2986,11 @@
*/
static void
ql_write_nvram(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->RequestLen < ha->nvram_cache->size) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = ha->nvram_cache->size;
EL(ha, "failed, RequestLen != NVRAM, Len=%xh\n",
@@ -2895,11 +3003,11 @@
mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, copy error\n");
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_write_vpd
@@ -2917,15 +3025,15 @@
* Kernel context.
*/
static void
ql_write_vpd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
int32_t rval = 0;
- if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
cmd->Status = EXT_STATUS_INVALID_REQUEST;
EL(ha, "failed, invalid request for HBA\n");
return;
}
@@ -2943,11 +3051,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = rval;
EL(ha, "failed, errno=%x\n", rval);
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_read_vpd
@@ -2965,13 +3073,13 @@
* Kernel context.
*/
static void
ql_read_vpd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
cmd->Status = EXT_STATUS_INVALID_REQUEST;
EL(ha, "failed, invalid request for HBA\n");
return;
}
@@ -2988,11 +3096,11 @@
mode)) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed,\n");
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_get_fcache
@@ -3013,29 +3121,25 @@
ql_get_fcache(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
uint32_t bsize, boff, types, cpsize, hsize;
ql_fcache_t *fptr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- CACHE_LOCK(ha);
-
if (ha->fcache == NULL) {
- CACHE_UNLOCK(ha);
cmd->Status = EXT_STATUS_ERR;
EL(ha, "failed, adapter fcache not setup\n");
return;
}
- if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
bsize = 100;
} else {
bsize = 400;
}
if (cmd->ResponseLen < bsize) {
- CACHE_UNLOCK(ha);
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = bsize;
EL(ha, "failed, ResponseLen < %d, len passed=%xh\n",
bsize, cmd->ResponseLen);
return;
@@ -3056,11 +3160,10 @@
cpsize = (fptr->buflen < 100 ? fptr->buflen : 100);
if (ddi_copyout(fptr->buf,
(void *)(uintptr_t)(cmd->ResponseAdr + boff),
cpsize, mode) != 0) {
- CACHE_UNLOCK(ha);
EL(ha, "ddicopy failed, done\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = 0;
return;
}
@@ -3077,11 +3180,10 @@
*/
if ((fptr = ql_get_fbuf(ha->fcache, FTYPE_FW)) != NULL) {
hsize = sizeof (pci_header_t) + sizeof (pci_data_t);
if (hsize > fptr->buflen) {
- CACHE_UNLOCK(ha);
EL(ha, "header size (%xh) exceeds buflen (%xh)\n",
hsize, fptr->buflen);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = 0;
return;
@@ -3088,27 +3190,25 @@
}
cpsize = ((fptr->buflen - hsize) < 100 ?
fptr->buflen - hsize : 100);
- if (ddi_copyout(fptr->buf+hsize,
+ if (ddi_copyout(fptr->buf + hsize,
(void *)(uintptr_t)(cmd->ResponseAdr + 300),
cpsize, mode) != 0) {
- CACHE_UNLOCK(ha);
EL(ha, "fw ddicopy failed, done\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = 0;
return;
}
bsize += 100;
}
- CACHE_UNLOCK(ha);
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = bsize;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fcache_ex
* Dumps flash cache contents.
@@ -3129,15 +3229,13 @@
{
uint32_t bsize = 0;
uint32_t boff = 0;
ql_fcache_t *fptr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- CACHE_LOCK(ha);
if (ha->fcache == NULL) {
- CACHE_UNLOCK(ha);
cmd->Status = EXT_STATUS_ERR;
EL(ha, "failed, adapter fcache not setup\n");
return;
}
@@ -3145,11 +3243,10 @@
for (fptr = ha->fcache; fptr != NULL; fptr = fptr->next) {
bsize += FBUFSIZE;
}
if (cmd->ResponseLen < bsize) {
- CACHE_UNLOCK(ha);
if (cmd->ResponseLen != 0) {
EL(ha, "failed, ResponseLen < %d, len passed=%xh\n",
bsize, cmd->ResponseLen);
}
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
@@ -3163,25 +3260,23 @@
/* Get the next image */
if (ddi_copyout(fptr->buf,
(void *)(uintptr_t)(cmd->ResponseAdr + boff),
(fptr->buflen < FBUFSIZE ? fptr->buflen : FBUFSIZE),
mode) != 0) {
- CACHE_UNLOCK(ha);
EL(ha, "failed, ddicopy at %xh, done\n", boff);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = 0;
return;
}
boff += FBUFSIZE;
fptr = fptr->next;
}
- CACHE_UNLOCK(ha);
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = bsize;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_read_flash
* Get flash contents.
@@ -3200,14 +3295,16 @@
static void
ql_read_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (ql_stall_driver(ha, 0) != QL_SUCCESS) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1) &&
+ ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "ql_stall_driver failed\n");
+ ql_restart_driver(ha);
cmd->Status = EXT_STATUS_BUSY;
cmd->DetailStatus = xp->fdesc.flash_size;
cmd->ResponseLen = 0;
return;
}
@@ -3235,19 +3332,17 @@
EL(ha, "failed,\n");
}
}
/* Resume I/O */
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
- ql_restart_driver(ha);
- } else {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
EL(ha, "isp_abort_needed for restart\n");
ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED,
DRIVER_STALL);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_write_flash
* Loads flash contents.
@@ -3266,14 +3361,16 @@
static void
ql_write_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (ql_stall_driver(ha, 0) != QL_SUCCESS) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1) &&
+ ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "ql_stall_driver failed\n");
+ ql_restart_driver(ha);
cmd->Status = EXT_STATUS_BUSY;
cmd->DetailStatus = xp->fdesc.flash_size;
cmd->ResponseLen = 0;
return;
}
@@ -3298,19 +3395,17 @@
EL(ha, "failed,\n");
}
}
/* Resume I/O */
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
- ql_restart_driver(ha);
- } else {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
EL(ha, "isp_abort_needed for restart\n");
ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED,
DRIVER_STALL);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_diagnostic_loopback
* Performs EXT_CC_LOOPBACK Command
@@ -3330,15 +3425,16 @@
ql_diagnostic_loopback(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_LOOPBACK_REQ plbreq;
EXT_LOOPBACK_RSP plbrsp;
ql_mbx_data_t mr;
- uint32_t rval;
- caddr_t bp;
+ uint32_t rval, timer, bpsize;
+ caddr_t bp, pld;
uint16_t opt;
+ boolean_t loop_up;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Get loop back request. */
if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
(void *)&plbreq, sizeof (EXT_LOOPBACK_REQ), mode) != 0) {
EL(ha, "failed, ddi_copyin\n");
@@ -3345,128 +3441,157 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
- opt = (uint16_t)(plbreq.Options & MBC_LOOPBACK_POINT_MASK);
-
/* Check transfer length fits in buffer. */
- if (plbreq.BufferLength < plbreq.TransferCount &&
- plbreq.TransferCount < MAILBOX_BUFFER_SIZE) {
- EL(ha, "failed, BufferLength=%d, xfercnt=%d, "
- "mailbox_buffer_size=%d\n", plbreq.BufferLength,
- plbreq.TransferCount, MAILBOX_BUFFER_SIZE);
+ if (plbreq.BufferLength < plbreq.TransferCount) {
+ EL(ha, "failed, BufferLength=%d, xfercnt=%d\n",
+
+ plbreq.BufferLength, plbreq.TransferCount);
cmd->Status = EXT_STATUS_INVALID_PARAM;
cmd->ResponseLen = 0;
return;
}
/* Allocate command memory. */
- bp = kmem_zalloc(plbreq.TransferCount, KM_SLEEP);
+ bpsize = plbreq.TransferCount + 4; /* Include opcode size */
+ bp = kmem_zalloc(bpsize, KM_SLEEP);
if (bp == NULL) {
EL(ha, "failed, kmem_zalloc\n");
cmd->Status = EXT_STATUS_NO_MEMORY;
cmd->ResponseLen = 0;
return;
}
+ pld = bp + 4;
+ *bp = 0x10; /* opcode */
/* Get loopback data. */
if (ql_get_buffer_data((caddr_t)(uintptr_t)plbreq.BufferAddress,
- bp, plbreq.TransferCount, mode) != plbreq.TransferCount) {
+ pld, plbreq.TransferCount, mode) != plbreq.TransferCount) {
EL(ha, "failed, ddi_copyin-2\n");
- kmem_free(bp, plbreq.TransferCount);
+ kmem_free(bp, bpsize);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
- if ((ha->task_daemon_flags & (QL_LOOP_TRANSITION | DRIVER_STALL)) ||
+ if (LOOP_RECONFIGURE(ha) ||
ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "failed, LOOP_NOT_READY\n");
- kmem_free(bp, plbreq.TransferCount);
+ ql_restart_driver(ha);
+ kmem_free(bp, bpsize);
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
return;
}
+ loop_up = ha->task_daemon_flags & LOOP_DOWN ? B_FALSE : B_TRUE;
/* Shutdown IP. */
if (ha->flags & IP_INITIALIZED) {
(void) ql_shutdown_ip(ha);
}
/* determine topology so we can send the loopback or the echo */
/* Echo is supported on 2300's only and above */
- if (CFG_IST(ha, CFG_CTRL_8081)) {
- if (!(ha->task_daemon_flags & LOOP_DOWN) && opt ==
- MBC_LOOPBACK_POINT_EXTERNAL) {
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags |= LOOPBACK_ACTIVE;
+ ADAPTER_STATE_UNLOCK(ha);
+
+ opt = plbreq.Options;
+
+ if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
+ opt = (uint16_t)(plbreq.Options & MBC_LOOPBACK_POINT_MASK);
+ if (loop_up && opt == MBC_LOOPBACK_POINT_EXTERNAL) {
if (plbreq.TransferCount > 252) {
EL(ha, "transfer count (%d) > 252\n",
plbreq.TransferCount);
- kmem_free(bp, plbreq.TransferCount);
+ ql_restart_driver(ha);
+ kmem_free(bp, bpsize);
cmd->Status = EXT_STATUS_INVALID_PARAM;
cmd->ResponseLen = 0;
return;
}
plbrsp.CommandSent = INT_DEF_LB_ECHO_CMD;
- rval = ql_diag_echo(ha, 0, bp, plbreq.TransferCount,
+ rval = ql_diag_echo(ha, pld, plbreq.TransferCount,
MBC_ECHO_ELS, &mr);
} else {
- if (CFG_IST(ha, CFG_CTRL_81XX)) {
+ if (CFG_IST(ha, CFG_LOOP_POINT_SUPPORT)) {
(void) ql_set_loop_point(ha, opt);
}
plbrsp.CommandSent = INT_DEF_LB_LOOPBACK_CMD;
- rval = ql_diag_loopback(ha, 0, bp, plbreq.TransferCount,
+ rval = ql_diag_loopback(ha, pld, plbreq.TransferCount,
opt, plbreq.IterationCount, &mr);
- if (CFG_IST(ha, CFG_CTRL_81XX)) {
+ if (mr.mb[0] == 0x4005 && mr.mb[1] == 0x17) {
+ (void) ql_abort_isp(ha);
+ }
+ if (CFG_IST(ha, CFG_LOOP_POINT_SUPPORT)) {
(void) ql_set_loop_point(ha, 0);
}
}
} else {
- if (!(ha->task_daemon_flags & LOOP_DOWN) &&
- (ha->topology & QL_F_PORT) &&
- ha->device_id >= 0x2300) {
- QL_PRINT_9(CE_CONT, "(%d): F_PORT topology -- using "
- "echo\n", ha->instance);
+ if (loop_up && (ha->topology & QL_F_PORT) &&
+ CFG_IST(ha, CFG_LB_ECHO_SUPPORT)) {
+ QL_PRINT_9(ha, "F_PORT topology -- using "
+ "echo\n");
plbrsp.CommandSent = INT_DEF_LB_ECHO_CMD;
- rval = ql_diag_echo(ha, 0, bp, plbreq.TransferCount,
- (uint16_t)(CFG_IST(ha, CFG_CTRL_8081) ?
- MBC_ECHO_ELS : MBC_ECHO_64BIT), &mr);
+ if ((rval = ql_diag_echo(ha, bp, bpsize,
+ (uint16_t)(CFG_IST(ha, CFG_ISP_FW_TYPE_1) ?
+ MBC_ECHO_64BIT : MBC_ECHO_ELS), &mr)) !=
+ QL_SUCCESS) {
+ rval = ql_diag_echo(ha, pld,
+ plbreq.TransferCount,
+ (uint16_t)(CFG_IST(ha, CFG_ISP_FW_TYPE_1) ?
+ MBC_ECHO_64BIT : 0), &mr);
+ }
} else {
plbrsp.CommandSent = INT_DEF_LB_LOOPBACK_CMD;
- rval = ql_diag_loopback(ha, 0, bp, plbreq.TransferCount,
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
+ opt = (uint16_t)(opt | MBC_LOOPBACK_64BIT);
+ }
+ rval = ql_diag_loopback(ha, pld, plbreq.TransferCount,
opt, plbreq.IterationCount, &mr);
}
}
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags &= ~LOOPBACK_ACTIVE;
+ ADAPTER_STATE_UNLOCK(ha);
ql_restart_driver(ha);
+ if (loop_up && opt == MBC_LOOPBACK_POINT_INTERNAL) {
+ timer = 30;
+ do {
+ delay(100);
+ } while (timer-- && LOOP_NOT_READY(ha));
+ }
/* Restart IP if it was shutdown. */
if (ha->flags & IP_ENABLED && !(ha->flags & IP_INITIALIZED)) {
(void) ql_initialize_ip(ha);
ql_isp_rcvbuf(ha);
}
if (rval != QL_SUCCESS) {
EL(ha, "failed, diagnostic_loopback_mbx=%xh\n", rval);
- kmem_free(bp, plbreq.TransferCount);
+ kmem_free(bp, bpsize);
cmd->Status = EXT_STATUS_MAILBOX;
cmd->DetailStatus = rval;
cmd->ResponseLen = 0;
return;
}
/* Return loopback data. */
- if (ql_send_buffer_data(bp, (caddr_t)(uintptr_t)plbreq.BufferAddress,
+ if (ql_send_buffer_data(pld, (caddr_t)(uintptr_t)plbreq.BufferAddress,
plbreq.TransferCount, mode) != plbreq.TransferCount) {
EL(ha, "failed, ddi_copyout\n");
- kmem_free(bp, plbreq.TransferCount);
+ kmem_free(bp, bpsize);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
- kmem_free(bp, plbreq.TransferCount);
+ kmem_free(bp, bpsize);
/* Return loopback results. */
plbrsp.BufferAddress = plbreq.BufferAddress;
plbrsp.BufferLength = plbreq.TransferCount;
plbrsp.CompletionStatus = mr.mb[0];
@@ -3478,11 +3603,12 @@
plbrsp.IterationCountLastError = 0;
} else {
plbrsp.CrcErrorCount = mr.mb[1];
plbrsp.DisparityErrorCount = mr.mb[2];
plbrsp.FrameLengthErrorCount = mr.mb[3];
- plbrsp.IterationCountLastError = (mr.mb[19] >> 16) | mr.mb[18];
+ plbrsp.IterationCountLastError =
+ SHORT_TO_LONG(mr.mb[18], mr.mb[19]);
}
rval = ddi_copyout((void *)&plbrsp,
(void *)(uintptr_t)cmd->ResponseAdr,
sizeof (EXT_LOOPBACK_RSP), mode);
@@ -3492,11 +3618,11 @@
cmd->ResponseLen = 0;
return;
}
cmd->ResponseLen = sizeof (EXT_LOOPBACK_RSP);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_set_loop_point
* Setup loop point for port configuration.
@@ -3509,18 +3635,18 @@
* ql local function return status code.
*
* Context:
* Kernel context.
*/
-static int
+int
ql_set_loop_point(ql_adapter_state_t *ha, uint16_t opt)
{
ql_mbx_data_t mr;
int rval;
uint32_t timer;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/*
* We get the current port config, modify the loopback field and
* write it back out.
*/
@@ -3528,16 +3654,17 @@
EL(ha, "get_port_config status=%xh\n", rval);
return (rval);
}
/*
* Set the loopback mode field while maintaining the others.
- * Currently only internal or none are supported.
*/
- mr.mb[1] = (uint16_t)(mr.mb[1] &~LOOPBACK_MODE_FIELD_MASK);
+ mr.mb[1] = (uint16_t)(mr.mb[1] & ~LOOPBACK_MODE_FIELD_MASK);
if (opt == MBC_LOOPBACK_POINT_INTERNAL) {
- mr.mb[1] = (uint16_t)(mr.mb[1] |
- LOOPBACK_MODE(LOOPBACK_MODE_INTERNAL));
+ mr.mb[1] = (uint16_t)(mr.mb[1] | LOOPBACK_MODE_INTERNAL);
+ } else if (CFG_IST(ha, CFG_CTRL_80XX) &&
+ opt == MBC_LOOPBACK_POINT_EXTERNAL) {
+ mr.mb[1] = (uint16_t)(mr.mb[1] | LOOPBACK_MODE_EXTERNAL);
}
/*
* Changing the port configuration will cause the port state to cycle
* down and back up. The indication that this has happened is that
* the point to point flag gets set.
@@ -3556,11 +3683,11 @@
}
/* Delay for 1000000 usec (1 second). */
ql_delay(ha, 1000000);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -3583,17 +3710,17 @@
{
EXT_RNID_REQ tmp_rnid;
port_id_t tmp_fcid;
caddr_t tmp_buf, bptr;
uint32_t copy_len;
- ql_tgt_t *tq;
+ ql_tgt_t *tq = NULL;
EXT_RNID_DATA rnid_data;
uint32_t loop_ready_wait = 10 * 60 * 10;
int rval = 0;
uint32_t local_hba = 0;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
@@ -3618,24 +3745,20 @@
return;
}
/* Find loop ID of the device */
if (tmp_rnid.Addr.Type == EXT_DEF_TYPE_WWNN) {
- bptr = CFG_IST(ha, CFG_CTRL_24258081) ?
- (caddr_t)&ha->init_ctrl_blk.cb24.node_name :
- (caddr_t)&ha->init_ctrl_blk.cb.node_name;
+ bptr = (caddr_t)ha->loginparams.node_ww_name.raw_wwn;
if (bcmp((void *)bptr, (void *)tmp_rnid.Addr.FcAddr.WWNN,
EXT_DEF_WWN_NAME_SIZE) == 0) {
local_hba = 1;
} else {
tq = ql_find_port(ha,
(uint8_t *)tmp_rnid.Addr.FcAddr.WWNN, QLNT_NODE);
}
} else if (tmp_rnid.Addr.Type == EXT_DEF_TYPE_WWPN) {
- bptr = CFG_IST(ha, CFG_CTRL_24258081) ?
- (caddr_t)&ha->init_ctrl_blk.cb24.port_name :
- (caddr_t)&ha->init_ctrl_blk.cb.port_name;
+ bptr = (caddr_t)ha->loginparams.nport_ww_name.raw_wwn;
if (bcmp((void *)bptr, (void *)tmp_rnid.Addr.FcAddr.WWPN,
EXT_DEF_WWN_NAME_SIZE) == 0) {
local_hba = 1;
} else {
tq = ql_find_port(ha,
@@ -3683,25 +3806,15 @@
/* Now build the Send RNID response */
tmp_buf[0] = (char)(EXT_DEF_RNID_DFORMAT_TOPO_DISC);
tmp_buf[1] = (2 * EXT_DEF_WWN_NAME_SIZE);
tmp_buf[2] = 0;
tmp_buf[3] = sizeof (EXT_RNID_DATA);
-
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
- bcopy(ha->init_ctrl_blk.cb24.port_name, &tmp_buf[4],
+ bcopy(ha->loginparams.nport_ww_name.raw_wwn, &tmp_buf[4],
EXT_DEF_WWN_NAME_SIZE);
- bcopy(ha->init_ctrl_blk.cb24.node_name,
+ bcopy(ha->loginparams.node_ww_name.raw_wwn,
&tmp_buf[4 + EXT_DEF_WWN_NAME_SIZE],
EXT_DEF_WWN_NAME_SIZE);
- } else {
- bcopy(ha->init_ctrl_blk.cb.port_name, &tmp_buf[4],
- EXT_DEF_WWN_NAME_SIZE);
- bcopy(ha->init_ctrl_blk.cb.node_name,
- &tmp_buf[4 + EXT_DEF_WWN_NAME_SIZE],
- EXT_DEF_WWN_NAME_SIZE);
- }
-
bcopy((uint8_t *)&rnid_data,
&tmp_buf[4 + 2 * EXT_DEF_WWN_NAME_SIZE],
sizeof (EXT_RNID_DATA));
} else {
if (tq == NULL) {
@@ -3760,11 +3873,11 @@
} else if (cmd->ResponseLen > SEND_RNID_RSP_SIZE) {
cmd->Status = EXT_STATUS_DATA_UNDERRUN;
EL(ha, "failed, EXT_STATUS_DATA_UNDERRUN\n");
} else {
cmd->Status = EXT_STATUS_OK;
- QL_PRINT_9(CE_CONT, "(%d): done\n",
+ QL_PRINT_9(ha, "done\n",
ha->instance);
}
}
kmem_free(tmp_buf, SEND_RNID_RSP_SIZE);
@@ -3786,11 +3899,11 @@
* Kernel context.
*/
static void
ql_set_host_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started, SubCode=%d\n", ha->instance,
+ QL_PRINT_9(ha, "started, SubCode=%d\n",
cmd->SubCode);
/*
* case off on command subcode
*/
@@ -3825,11 +3938,11 @@
if (cmd->Status != EXT_STATUS_OK) {
EL(ha, "failed, Status=%d\n", cmd->Status);
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_get_host_data
@@ -3849,11 +3962,11 @@
static void
ql_get_host_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int out_size = 0;
- QL_PRINT_9(CE_CONT, "(%d): started, SubCode=%d\n", ha->instance,
+ QL_PRINT_9(ha, "started, SubCode=%d\n",
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_SC_GET_STATISTICS:
@@ -3884,10 +3997,13 @@
out_size = sizeof (EXT_RESOURCE_CNTS);
break;
case EXT_SC_GET_FCF_LIST:
out_size = sizeof (EXT_FCF_LIST);
break;
+ case EXT_SC_GET_PRIV_STATS:
+ out_size = cmd->ResponseLen;
+ break;
case EXT_SC_GET_SCSI_ADDR:
case EXT_SC_GET_ERR_DETECTIONS:
case EXT_SC_GET_BUS_MODE:
case EXT_SC_GET_DR_DUMP_BUF:
case EXT_SC_GET_RISC_CODE:
@@ -3948,17 +4064,20 @@
ql_get_fcf_list(ha, cmd, mode);
break;
case EXT_SC_GET_RESOURCE_CNTS:
ql_get_resource_counts(ha, cmd, mode);
break;
+ case EXT_SC_GET_PRIV_STATS:
+ ql_get_priv_stats(ha, cmd, mode);
+ break;
}
if (cmd->Status != EXT_STATUS_OK) {
EL(ha, "failed, Status=%d\n", cmd->Status);
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/* ******************************************************************** */
/* Helper Functions */
@@ -3981,19 +4100,19 @@
static int
ql_lun_count(ql_adapter_state_t *ha, ql_tgt_t *tq)
{
int cnt;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Bypass LUNs that failed. */
cnt = ql_report_lun(ha, tq);
if (cnt == 0) {
cnt = ql_inq_scan(ha, tq, ha->maximum_luns_per_target);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (cnt);
}
/*
@@ -4020,11 +4139,11 @@
dma_mem_t dma_mem;
uint32_t pkt_size, cnt;
uint16_t comp_status;
uint8_t scsi_status_h, scsi_status_l, *reqs;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
return (0);
}
@@ -4038,18 +4157,18 @@
rpt = (ql_rpt_lun_lst_t *)((caddr_t)pkt + sizeof (ql_mbx_iocb_t));
/* Get DMA memory for the IOCB */
if (ql_get_dma_mem(ha, &dma_mem, sizeof (ql_rpt_lun_lst_t),
LITTLE_ENDIAN_DMA, QL_DMA_RING_ALIGN) != QL_SUCCESS) {
- cmn_err(CE_WARN, "%s(%d): DMA memory "
+ cmn_err(CE_WARN, "%s(%d) DMA memory "
"alloc failed", QL_NAME, ha->instance);
kmem_free(pkt, pkt_size);
return (0);
}
for (retries = 0; retries < 4; retries++) {
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
pkt->cmd24.entry_type = IOCB_CMD_TYPE_7;
pkt->cmd24.entry_count = 1;
/* Set N_port handle */
pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
@@ -4089,17 +4208,17 @@
/* Set data segment count. */
pkt->cmd24.dseg_count = LE_16(1);
/* Load total byte count. */
/* Load data descriptor. */
- pkt->cmd24.dseg_0_address[0] = (uint32_t)
+ pkt->cmd24.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd24.dseg_0_address[1] = (uint32_t)
+ pkt->cmd24.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
pkt->cmd24.total_byte_count =
LE_32(sizeof (ql_rpt_lun_lst_t));
- pkt->cmd24.dseg_0_length =
+ pkt->cmd24.dseg.length =
LE_32(sizeof (ql_rpt_lun_lst_t));
} else if (CFG_IST(ha, CFG_ENABLE_64BIT_ADDRESSING)) {
pkt->cmd3.entry_type = IOCB_CMD_TYPE_3;
pkt->cmd3.entry_count = 1;
if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
@@ -4120,15 +4239,15 @@
MSB(LSW(sizeof (ql_rpt_lun_lst_t)));
pkt->cmd3.scsi_cdb[9] =
LSB(LSW(sizeof (ql_rpt_lun_lst_t)));
pkt->cmd3.byte_count =
LE_32(sizeof (ql_rpt_lun_lst_t));
- pkt->cmd3.dseg_0_address[0] = (uint32_t)
+ pkt->cmd3.dseg[0].address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd3.dseg_0_address[1] = (uint32_t)
+ pkt->cmd3.dseg[0].address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd3.dseg_0_length =
+ pkt->cmd3.dseg[0].length =
LE_32(sizeof (ql_rpt_lun_lst_t));
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
pkt->cmd.entry_count = 1;
if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
@@ -4149,13 +4268,13 @@
MSB(LSW(sizeof (ql_rpt_lun_lst_t)));
pkt->cmd.scsi_cdb[9] =
LSB(LSW(sizeof (ql_rpt_lun_lst_t)));
pkt->cmd.byte_count =
LE_32(sizeof (ql_rpt_lun_lst_t));
- pkt->cmd.dseg_0_address = (uint32_t)
+ pkt->cmd.dseg[0].address = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd.dseg_0_length =
+ pkt->cmd.dseg[0].length =
LE_32(sizeof (ql_rpt_lun_lst_t));
}
rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
sizeof (ql_mbx_iocb_t));
@@ -4165,11 +4284,11 @@
DDI_DMA_SYNC_FORKERNEL);
/* Copy in coming DMA data. */
ddi_rep_get8(dma_mem.acc_handle, (uint8_t *)rpt,
(uint8_t *)dma_mem.bp, dma_mem.size, DDI_DEV_AUTOINCR);
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
pkt->sts24.entry_status = (uint8_t)
(pkt->sts24.entry_status & 0x3c);
comp_status = (uint16_t)LE_16(pkt->sts24.comp_status);
scsi_status_h = pkt->sts24.scsi_status_h;
scsi_status_l = pkt->sts24.scsi_status_l;
@@ -4233,19 +4352,19 @@
if (rval != QL_SUCCESS) {
EL(ha, "failed=%xh\n", rval);
rval = 0;
} else {
- QL_PRINT_9(CE_CONT, "(%d): LUN list\n", ha->instance);
+ QL_PRINT_9(ha, "LUN list\n");
QL_DUMP_9(rpt, 8, rpt->hdr.len + 8);
rval = (int)(BE_32(rpt->hdr.len) / 8);
}
kmem_free(pkt, pkt_size);
ql_free_dma_resource(ha, &dma_mem);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -4269,11 +4388,11 @@
int lun, cnt, rval;
ql_mbx_iocb_t *pkt;
uint8_t *inq;
uint32_t pkt_size;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
pkt_size = sizeof (ql_mbx_iocb_t) + INQ_DATA_SIZE;
pkt = kmem_zalloc(pkt_size, KM_SLEEP);
if (pkt == NULL) {
EL(ha, "failed, kmem_zalloc\n");
@@ -4306,13 +4425,13 @@
case DTYPE_SEQUENTIAL:
cnt++;
tq->flags |= TQF_TAPE_DEVICE;
break;
default:
- QL_PRINT_9(CE_CONT, "(%d): failed, "
+ QL_PRINT_9(ha, "failed, "
"unsupported device id=%xh, lun=%d, "
- "type=%xh\n", ha->instance, tq->loop_id,
+ "type=%xh\n", tq->loop_id,
lun, *inq);
break;
}
if (*inq == DTYPE_ESI || cnt >= count) {
@@ -4324,11 +4443,11 @@
}
}
kmem_free(pkt, pkt_size);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (cnt);
}
/*
@@ -4348,20 +4467,22 @@
* Context:
* Kernel context.
*/
static int
ql_inq(ql_adapter_state_t *ha, ql_tgt_t *tq, int lun, ql_mbx_iocb_t *pkt,
- uint8_t inq_len)
+ uint32_t inq_len)
{
dma_mem_t dma_mem;
int rval, retries;
uint32_t pkt_size, cnt;
uint16_t comp_status;
uint8_t scsi_status_h, scsi_status_l, *reqs;
caddr_t inq_data;
+ uint64_t lun_addr;
+ fcp_ent_addr_t *fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, loop down\n");
return (QL_FUNCTION_TIMEOUT);
}
@@ -4372,23 +4493,39 @@
inq_data = (caddr_t)pkt + sizeof (ql_mbx_iocb_t);
/* Get DMA memory for the IOCB */
if (ql_get_dma_mem(ha, &dma_mem, inq_len,
LITTLE_ENDIAN_DMA, QL_DMA_RING_ALIGN) != QL_SUCCESS) {
- cmn_err(CE_WARN, "%s(%d): DMA memory "
+ cmn_err(CE_WARN, "%s(%d) DMA memory "
"alloc failed", QL_NAME, ha->instance);
return (0);
}
for (retries = 0; retries < 4; retries++) {
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
pkt->cmd24.entry_type = IOCB_CMD_TYPE_7;
pkt->cmd24.entry_count = 1;
/* Set LUN number */
- pkt->cmd24.fcp_lun[2] = LSB(lun);
- pkt->cmd24.fcp_lun[3] = MSB(lun);
+ lun_addr = ql_get_lun_addr(tq, lun);
+ fcp_ent_addr = (fcp_ent_addr_t *)&lun_addr;
+ pkt->cmd24.fcp_lun[2] =
+ lobyte(fcp_ent_addr->ent_addr_0);
+ pkt->cmd24.fcp_lun[3] =
+ hibyte(fcp_ent_addr->ent_addr_0);
+ pkt->cmd24.fcp_lun[0] =
+ lobyte(fcp_ent_addr->ent_addr_1);
+ pkt->cmd24.fcp_lun[1] =
+ hibyte(fcp_ent_addr->ent_addr_1);
+ pkt->cmd24.fcp_lun[6] =
+ lobyte(fcp_ent_addr->ent_addr_2);
+ pkt->cmd24.fcp_lun[7] =
+ hibyte(fcp_ent_addr->ent_addr_2);
+ pkt->cmd24.fcp_lun[4] =
+ lobyte(fcp_ent_addr->ent_addr_3);
+ pkt->cmd24.fcp_lun[5] =
+ hibyte(fcp_ent_addr->ent_addr_3);
/* Set N_port handle */
pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
/* Set target ID */
@@ -4402,11 +4539,11 @@
/* Set ISP command timeout. */
pkt->cmd24.timeout = LE_16(15);
/* Load SCSI CDB */
pkt->cmd24.scsi_cdb[0] = SCMD_INQUIRY;
- pkt->cmd24.scsi_cdb[4] = inq_len;
+ pkt->cmd24.scsi_cdb[4] = LSB(LSW(inq_len));
for (cnt = 0; cnt < MAX_CMDSZ; cnt += 4) {
ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
+ cnt, 4);
}
@@ -4421,15 +4558,15 @@
/* Load total byte count. */
pkt->cmd24.total_byte_count = LE_32(inq_len);
/* Load data descriptor. */
- pkt->cmd24.dseg_0_address[0] = (uint32_t)
+ pkt->cmd24.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd24.dseg_0_address[1] = (uint32_t)
+ pkt->cmd24.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd24.dseg_0_length = LE_32(inq_len);
+ pkt->cmd24.dseg.length = LE_32(inq_len);
} else if (CFG_IST(ha, CFG_ENABLE_64BIT_ADDRESSING)) {
pkt->cmd3.entry_type = IOCB_CMD_TYPE_3;
cnt = CMD_TYPE_3_DATA_SEGMENTS;
pkt->cmd3.entry_count = 1;
@@ -4442,18 +4579,18 @@
pkt->cmd3.lun_l = LSB(lun);
pkt->cmd3.lun_h = MSB(lun);
pkt->cmd3.control_flags_l = CF_DATA_IN | CF_STAG;
pkt->cmd3.timeout = LE_16(15);
pkt->cmd3.scsi_cdb[0] = SCMD_INQUIRY;
- pkt->cmd3.scsi_cdb[4] = inq_len;
+ pkt->cmd3.scsi_cdb[4] = LSB(LSW(inq_len));
pkt->cmd3.dseg_count = LE_16(1);
pkt->cmd3.byte_count = LE_32(inq_len);
- pkt->cmd3.dseg_0_address[0] = (uint32_t)
+ pkt->cmd3.dseg[0].address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd3.dseg_0_address[1] = (uint32_t)
+ pkt->cmd3.dseg[0].address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd3.dseg_0_length = LE_32(inq_len);
+ pkt->cmd3.dseg[0].length = LE_32(inq_len);
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
cnt = CMD_TYPE_2_DATA_SEGMENTS;
pkt->cmd.entry_count = 1;
@@ -4466,16 +4603,16 @@
pkt->cmd.lun_l = LSB(lun);
pkt->cmd.lun_h = MSB(lun);
pkt->cmd.control_flags_l = CF_DATA_IN | CF_STAG;
pkt->cmd.timeout = LE_16(15);
pkt->cmd.scsi_cdb[0] = SCMD_INQUIRY;
- pkt->cmd.scsi_cdb[4] = inq_len;
+ pkt->cmd.scsi_cdb[4] = LSB(LSW(inq_len));
pkt->cmd.dseg_count = LE_16(1);
pkt->cmd.byte_count = LE_32(inq_len);
- pkt->cmd.dseg_0_address = (uint32_t)
+ pkt->cmd.dseg[0].address = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
- pkt->cmd.dseg_0_length = LE_32(inq_len);
+ pkt->cmd.dseg[0].length = LE_32(inq_len);
}
/* rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size); */
rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
sizeof (ql_mbx_iocb_t));
@@ -4485,11 +4622,11 @@
DDI_DMA_SYNC_FORKERNEL);
/* Copy in coming DMA data. */
ddi_rep_get8(dma_mem.acc_handle, (uint8_t *)inq_data,
(uint8_t *)dma_mem.bp, dma_mem.size, DDI_DEV_AUTOINCR);
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
pkt->sts24.entry_status = (uint8_t)
(pkt->sts24.entry_status & 0x3c);
comp_status = (uint16_t)LE_16(pkt->sts24.comp_status);
scsi_status_h = pkt->sts24.scsi_status_h;
scsi_status_l = pkt->sts24.scsi_status_l;
@@ -4540,11 +4677,11 @@
break;
}
}
ql_free_dma_resource(ha, &dma_mem);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -4568,11 +4705,11 @@
{
uint32_t cnt;
for (cnt = 0; cnt < size; cnt++) {
if (ddi_copyin(src++, dst++, 1, mode) != 0) {
- QL_PRINT_2(CE_CONT, "failed, ddi_copyin\n");
+ QL_PRINT_2(NULL, "failed, ddi_copyin\n");
break;
}
}
return (cnt);
@@ -4599,11 +4736,11 @@
{
uint32_t cnt;
for (cnt = 0; cnt < size; cnt++) {
if (ddi_copyout(src++, dst++, 1, mode) != 0) {
- QL_PRINT_2(CE_CONT, "failed, ddi_copyin\n");
+ QL_PRINT_2(NULL, "failed, ddi_copyin\n");
break;
}
}
return (cnt);
@@ -4689,14 +4826,14 @@
uint16_t chksum, *bp, data;
int rval;
flash_desc_t *fdesc;
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (ha->flash_desc_addr == 0) {
- QL_PRINT_9(CE_CONT, "(%d): desc ptr=0\n", ha->instance);
+ QL_PRINT_9(ha, "desc ptr=0\n");
return (QL_FUNCTION_FAILED);
}
if ((fdesc = kmem_zalloc(sizeof (flash_desc_t), KM_SLEEP)) == NULL) {
EL(ha, "kmem_zalloc=null\n");
@@ -4741,11 +4878,11 @@
}
bcopy(fdesc, &xp->fdesc, sizeof (flash_desc_t));
kmem_free(fdesc, sizeof (flash_desc_t));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (QL_SUCCESS);
}
/*
@@ -4770,20 +4907,22 @@
if (xp->fdesc.flash_size != 0) {
return (rval);
}
- if (CFG_IST(ha, CFG_CTRL_2200) && !ha->subven_id) {
+ if (CFG_IST(ha, CFG_CTRL_22XX) && !ha->subven_id) {
return (QL_FUNCTION_FAILED);
}
- if (CFG_IST(ha, CFG_CTRL_258081)) {
+ if (CFG_IST(ha, CFG_CTRL_252780818283)) {
/*
* Temporarily set the ha->xioctl->fdesc.flash_size to
* 25xx flash size to avoid failing of ql_dump_focde.
*/
- if (CFG_IST(ha, CFG_CTRL_8021)) {
+ if (CFG_IST(ha, CFG_CTRL_278083)) {
+ ha->xioctl->fdesc.flash_size = 0x1000000;
+ } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
ha->xioctl->fdesc.flash_size = 0x800000;
} else if (CFG_IST(ha, CFG_CTRL_25XX)) {
ha->xioctl->fdesc.flash_size = 0x200000;
} else {
ha->xioctl->fdesc.flash_size = 0x400000;
@@ -4791,19 +4930,19 @@
if (ql_24xx_flash_desc(ha) == QL_SUCCESS) {
EL(ha, "flash desc table ok, exit\n");
return (rval);
}
- if (CFG_IST(ha, CFG_CTRL_8021)) {
- xp->fdesc.flash_manuf = WINBOND_FLASH;
- xp->fdesc.flash_id = WINBOND_FLASHID;
+ if (CFG_IST(ha, CFG_CTRL_82XX)) {
+ xp->fdesc.flash_manuf = MXIC_FLASH;
+ xp->fdesc.flash_id = MXIC_FLASHID_25LXX;
xp->fdesc.flash_len = 0x17;
} else {
(void) ql_24xx_flash_id(ha);
}
- } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+ } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
(void) ql_24xx_flash_id(ha);
} else {
ql_flash_enable(ha);
ql_write_flash_byte(ha, 0x5555, 0xaa);
@@ -4835,17 +4974,24 @@
/* Default flash descriptor table. */
xp->fdesc.write_statusreg_cmd = 1;
xp->fdesc.write_enable_bits = 0;
xp->fdesc.unprotect_sector_cmd = 0;
xp->fdesc.protect_sector_cmd = 0;
- xp->fdesc.write_disable_bits = 0x9c;
+ xp->fdesc.write_disable_bits = 0xbc;
xp->fdesc.block_size = 0x10000;
xp->fdesc.erase_cmd = 0xd8;
switch (xp->fdesc.flash_manuf) {
case AMD_FLASH:
switch (xp->fdesc.flash_id) {
+ case SPAN_FLASHID_16384K:
+ if (xp->fdesc.flash_len == 0x18) {
+ xp->fdesc.flash_size = 0x1000000;
+ } else {
+ rval = QL_FUNCTION_FAILED;
+ }
+ break;
case SPAN_FLASHID_2048K:
xp->fdesc.flash_size = 0x200000;
break;
case AMD_FLASHID_1024K:
xp->fdesc.flash_size = 0x100000;
@@ -4882,10 +5028,17 @@
xp->fdesc.flash_size = 0x200000;
} else {
rval = QL_FUNCTION_FAILED;
}
break;
+ case ST_FLASHID_N25QXXX:
+ if (xp->fdesc.flash_len == 0x18) {
+ xp->fdesc.flash_size = 0x1000000;
+ } else {
+ rval = QL_FUNCTION_FAILED;
+ }
+ break;
default:
rval = QL_FUNCTION_FAILED;
break;
}
break;
@@ -4918,14 +5071,21 @@
break;
case MXIC_FLASHID_1024K:
xp->fdesc.flash_size = 0x100000;
break;
case MXIC_FLASHID_25LXX:
+ xp->fdesc.write_disable_bits = 0xbc;
if (xp->fdesc.flash_len == 0x14) {
xp->fdesc.flash_size = 0x100000;
} else if (xp->fdesc.flash_len == 0x15) {
xp->fdesc.flash_size = 0x200000;
+ } else if (xp->fdesc.flash_len == 0x16) {
+ xp->fdesc.flash_size = 0x400000;
+ } else if (xp->fdesc.flash_len == 0x17) {
+ xp->fdesc.flash_size = 0x800000;
+ } else if (xp->fdesc.flash_len == 0x18) {
+ xp->fdesc.flash_size = 0x1000000;
} else {
rval = QL_FUNCTION_FAILED;
}
break;
default:
@@ -4953,10 +5113,12 @@
xp->fdesc.flash_size = 0x200000;
} else if (xp->fdesc.flash_len == 0x16) {
xp->fdesc.flash_size = 0x400000;
} else if (xp->fdesc.flash_len == 0x17) {
xp->fdesc.flash_size = 0x800000;
+ } else if (xp->fdesc.flash_len == 0x18) {
+ xp->fdesc.flash_size = 0x1000000;
} else {
rval = QL_FUNCTION_FAILED;
}
break;
default:
@@ -4980,25 +5142,39 @@
default:
rval = QL_FUNCTION_FAILED;
break;
}
break;
+ case EON_FLASH:
+ switch (xp->fdesc.flash_id) {
+ case EON_FLASHID_EN25QXXX:
+ if (xp->fdesc.flash_len == 0x18) {
+ xp->fdesc.flash_size = 0x1000000;
+ } else {
+ rval = QL_FUNCTION_FAILED;
+ }
+ break;
default:
rval = QL_FUNCTION_FAILED;
break;
}
+ break;
+ default:
+ rval = QL_FUNCTION_FAILED;
+ break;
+ }
/* Try flash table later. */
- if (rval != QL_SUCCESS && CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (rval != QL_SUCCESS && CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
EL(ha, "no default id\n");
return (QL_SUCCESS);
}
/*
- * hack for non std 2312 and 6312 boards. hardware people need to
- * use either the 128k flash chip (original), or something larger.
- * For driver purposes, we'll treat it as a 128k flash chip.
+ * hack for non std 2312/2322 and 6312/6322 boards. hardware people
+ * need to use either the 128k flash chip (original), or something
+ * larger. For driver purposes, we'll treat it as a 128k flash chip.
*/
if ((ha->device_id == 0x2312 || ha->device_id == 0x6312 ||
ha->device_id == 0x2322 || ha->device_id == 0x6322) &&
(xp->fdesc.flash_size > 0x20000) &&
(CFG_IST(ha, CFG_SBUS_CARD) == 0)) {
@@ -5040,11 +5216,11 @@
{
uint8_t *bfp;
ql_xioctl_t *xp = ha->xioctl;
int rval = 0;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (bsize > xp->fdesc.flash_size) {
EL(ha, "failed, bufsize: %xh, flash size: %xh\n", bsize,
xp->fdesc.flash_size);
return (ENOMEM);
@@ -5066,11 +5242,11 @@
rval = 0;
}
kmem_free(bfp, bsize);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -5093,15 +5269,15 @@
ql_load_fcode(ql_adapter_state_t *ha, uint8_t *dp, uint32_t size, uint32_t addr)
{
uint32_t cnt;
int rval;
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
return (ql_24xx_load_flash(ha, dp, size, addr));
}
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (CFG_IST(ha, CFG_SBUS_CARD)) {
/*
* sbus has an additional check to make
* sure they don't brick the HBA.
@@ -5139,11 +5315,11 @@
if (rval != QL_SUCCESS) {
EL(ha, "failed, rval=%xh\n", rval);
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
return (rval);
}
/*
@@ -5168,11 +5344,11 @@
{
uint8_t *bfp;
int rval;
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* adjust max read size to flash size */
if (bsize > xp->fdesc.flash_size) {
EL(ha, "adjusting req=%xh, max=%xh\n", bsize,
xp->fdesc.flash_size);
@@ -5196,11 +5372,11 @@
rval = 0;
}
kmem_free(bfp, bsize);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -5227,20 +5403,20 @@
uint32_t cnt, data, addr;
uint8_t bp[4], *src;
int fp_rval, rval = QL_SUCCESS;
dma_mem_t mem;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* make sure startpos+size doesn't exceed flash */
if (size + startpos > ha->xioctl->fdesc.flash_size) {
EL(ha, "exceeded flash range, sz=%xh, stp=%xh, flsz=%xh\n",
size, startpos, ha->xioctl->fdesc.flash_size);
return (QL_FUNCTION_PARAMETER_ERROR);
}
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
/* check start addr is 32 bit aligned for 24xx */
if ((startpos & 0x3) != 0) {
rval = ql_24xx_read_flash(ha,
ha->flash_data_addr | startpos >> 2, &data);
if (rval != QL_SUCCESS) {
@@ -5255,11 +5431,11 @@
*dp++ = bp[startpos & 0x3];
startpos++;
size--;
}
if (size == 0) {
- QL_PRINT_9(CE_CONT, "(%d): done2\n",
+ QL_PRINT_9(ha, "done2\n",
ha->instance);
return (rval);
}
}
@@ -5268,11 +5444,11 @@
}
bzero(&mem, sizeof (dma_mem_t));
/* Check for Fast page is supported */
if ((ha->pha->task_daemon_flags & FIRMWARE_UP) &&
- (CFG_IST(ha, CFG_CTRL_2581))) {
+ (CFG_IST(ha, CFG_FLASH_DMA_SUPPORT))) {
fp_rval = QL_SUCCESS;
/* Setup DMA buffer. */
rval = ql_get_dma_mem(ha, &mem, size,
LITTLE_ENDIAN_DMA, QL_DMA_DATA_ALIGN);
if (rval != QL_SUCCESS) {
@@ -5285,21 +5461,21 @@
}
GLOBAL_HW_LOCK();
/* Enable Flash Read/Write. */
- if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
ql_flash_enable(ha);
}
/* Read fcode data from flash. */
while (size) {
/* Allow other system activity. */
if (size % 0x1000 == 0) {
- ql_delay(ha, 100000);
+ ql_delay(ha, 10000);
}
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
if (fp_rval == QL_SUCCESS && (addr & 0x3f) == 0) {
cnt = (size + 3) >> 2;
fp_rval = ql_rd_risc_ram(ha, addr,
mem.cookie.dmac_laddress, cnt);
if (fp_rval == QL_SUCCESS) {
@@ -5326,11 +5502,11 @@
*dp++ = (uint8_t)ql_read_flash_byte(ha, startpos++);
size--;
}
}
- if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
ql_flash_disable(ha);
}
GLOBAL_HW_UNLOCK();
@@ -5340,11 +5516,11 @@
if (rval != QL_SUCCESS) {
EL(ha, "failed, rval = %xh\n", rval);
} else {
/*EMPTY*/
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
return (rval);
}
/*
@@ -5402,11 +5578,11 @@
{
EXT_SET_RNID_REQ tmp_set;
EXT_RNID_DATA *tmp_buf;
int rval = 0;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
@@ -5467,11 +5643,11 @@
cmd->ResponseLen = 0;
}
kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_rnid_parameters
* Get RNID parameters.
@@ -5485,11 +5661,11 @@
ql_get_rnid_parameters(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_RNID_DATA *tmp_buf;
uint32_t rval;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
@@ -5523,11 +5699,11 @@
sizeof (EXT_RNID_DATA), mode) != sizeof (EXT_RNID_DATA)) {
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
} else {
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
cmd->ResponseLen = sizeof (EXT_RNID_DATA);
}
kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
}
@@ -5550,11 +5726,11 @@
ql_reset_statistics(ql_adapter_state_t *ha, EXT_IOCTL *cmd)
{
ql_xioctl_t *xp = ha->xioctl;
int rval = 0;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
@@ -5586,11 +5762,11 @@
xp->DeviceErrorCount = 0;
xp->TotalLipResets = 0;
xp->TotalInterrupts = 0;
INTR_UNLOCK(ha);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -5615,11 +5791,11 @@
ql_link_stats_t *ls;
int rval;
ql_xioctl_t *xp = ha->xioctl;
int retry = 10;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
while (ha->task_daemon_flags &
(ABORT_ISP_ACTIVE | LOOP_RESYNC_ACTIVE | DRIVER_STALL)) {
ql_delay(ha, 10000000); /* 10 second delay */
@@ -5683,11 +5859,11 @@
}
}
kmem_free(ls, sizeof (ql_link_stats_t));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_statistics_fc
* Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.
@@ -5713,11 +5889,11 @@
EXT_DEST_ADDR pextdestaddr;
uint8_t *name;
ql_tgt_t *tq = NULL;
int retry = 10;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
(void *)&pextdestaddr, sizeof (EXT_DEST_ADDR), mode) != 0) {
EL(ha, "failed, ddi_copyin\n");
cmd->Status = EXT_STATUS_COPY_ERR;
@@ -5726,11 +5902,11 @@
}
qlnt = QLNT_PORT;
name = pextdestaddr.DestAddr.WWPN;
- QL_PRINT_9(CE_CONT, "(%d): wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
+ QL_PRINT_9(ha, "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
ha->instance, name[0], name[1], name[2], name[3], name[4],
name[5], name[6], name[7]);
tq = ql_find_port(ha, name, qlnt);
@@ -5793,11 +5969,11 @@
}
}
kmem_free(ls, sizeof (ql_link_stats_t));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_statistics_fc4
* Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.
@@ -5818,11 +5994,11 @@
{
uint32_t rval;
EXT_HBA_FC4STATISTICS fc4stats = {0};
ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
fc4stats.InputRequests = xp->IOInputRequests;
fc4stats.OutputRequests = xp->IOOutputRequests;
fc4stats.ControlRequests = xp->IOControlRequests;
fc4stats.InputMegabytes = xp->IOInputMByteCnt;
@@ -5838,11 +6014,11 @@
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = sizeof (EXT_HBA_FC4STATISTICS);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_set_led_state
* Performs EXT_SET_BEACON_STATE subcommand of EXT_CC_SET_DATA.
@@ -5860,14 +6036,14 @@
*/
static void
ql_set_led_state(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_BEACON_CONTROL bstate;
- uint32_t rval;
- ql_xioctl_t *xp = ha->xioctl;
+ int rval;
+ ql_mbx_data_t mr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->RequestLen < sizeof (EXT_BEACON_CONTROL)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_BEACON_CONTROL);
EL(ha, "done - failed, RequestLen < EXT_BEACON_CONTROL,"
@@ -5874,11 +6050,11 @@
" Len=%xh\n", cmd->RequestLen);
cmd->ResponseLen = 0;
return;
}
- if (ha->device_id < 0x2300) {
+ if (!CFG_IST(ha, CFG_SET_LEDS_SUPPORT)) {
cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
cmd->DetailStatus = 0;
EL(ha, "done - failed, Invalid function for HBA model\n");
cmd->ResponseLen = 0;
return;
@@ -5893,56 +6069,88 @@
return;
}
switch (bstate.State) {
case EXT_DEF_GRN_BLINK_OFF: /* turn beacon off */
- if (xp->ledstate.BeaconState == BEACON_OFF) {
+ if (ha->ledstate.BeaconState == BEACON_OFF) {
/* not quite an error -- LED state is already off */
cmd->Status = EXT_STATUS_OK;
EL(ha, "LED off request -- LED is already off\n");
break;
}
- xp->ledstate.BeaconState = BEACON_OFF;
- xp->ledstate.LEDflags = LED_ALL_OFF;
+ if (CFG_IST(ha, CFG_CTRL_82XX)) {
+ rval = ql_diag_beacon(ha, QL_BEACON_DISABLE,
+ &mr);
+ if (rval == QL_SUCCESS) {
+ ha->ledstate.BeaconState = BEACON_OFF;
+ ha->ledstate.LEDflags = LED_ALL_OFF;
+ cmd->Status = EXT_STATUS_OK;
+ } else {
+ cmd->Status = EXT_STATUS_ERR;
+ EL(ha, "failed, disable beacon request %xh\n",
+ bstate.State);
+ }
+ break;
+ }
+
+ ha->ledstate.BeaconState = BEACON_OFF;
+ ha->ledstate.LEDflags = LED_ALL_OFF;
+
if ((rval = ql_wrapup_led(ha)) != QL_SUCCESS) {
cmd->Status = EXT_STATUS_MAILBOX;
} else {
cmd->Status = EXT_STATUS_OK;
}
break;
case EXT_DEF_GRN_BLINK_ON: /* turn beacon on */
- if (xp->ledstate.BeaconState == BEACON_ON) {
+ if (ha->ledstate.BeaconState == BEACON_ON) {
/* not quite an error -- LED state is already on */
cmd->Status = EXT_STATUS_OK;
EL(ha, "LED on request - LED is already on\n");
break;
}
+ if (CFG_IST(ha, CFG_CTRL_82XX)) {
+ rval = ql_diag_beacon(ha, QL_BEACON_ENABLE,
+ &mr);
+
+ if (rval == QL_SUCCESS) {
+ ha->ledstate.BeaconState = BEACON_ON;
+ ha->ledstate.LEDflags = LED_GREEN;
+ cmd->Status = EXT_STATUS_OK;
+ } else {
+ cmd->Status = EXT_STATUS_ERR;
+ EL(ha, "failed, enable beacon request %xh\n",
+ bstate.State);
+ }
+ break;
+ }
+
if ((rval = ql_setup_led(ha)) != QL_SUCCESS) {
cmd->Status = EXT_STATUS_MAILBOX;
break;
}
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
- xp->ledstate.LEDflags = LED_YELLOW_24 | LED_AMBER_24;
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+ ha->ledstate.LEDflags = LED_YELLOW_24 | LED_AMBER_24;
} else {
- xp->ledstate.LEDflags = LED_GREEN;
+ ha->ledstate.LEDflags = LED_GREEN;
}
- xp->ledstate.BeaconState = BEACON_ON;
+ ha->ledstate.BeaconState = BEACON_ON;
cmd->Status = EXT_STATUS_OK;
break;
default:
cmd->Status = EXT_STATUS_ERR;
EL(ha, "failed, unknown state request %xh\n", bstate.State);
break;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_led_state
* Performs EXT_GET_BEACON_STATE subcommand of EXT_CC_GET_DATA.
@@ -5961,13 +6169,12 @@
static void
ql_get_led_state(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_BEACON_CONTROL bstate = {0};
uint32_t rval;
- ql_xioctl_t *xp = ha->xioctl;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (cmd->ResponseLen < sizeof (EXT_BEACON_CONTROL)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_BEACON_CONTROL);
EL(ha, "done - failed, ResponseLen < EXT_BEACON_CONTROL,"
@@ -5974,11 +6181,11 @@
"Len=%xh\n", cmd->ResponseLen);
cmd->ResponseLen = 0;
return;
}
- if (ha->device_id < 0x2300) {
+ if (!CFG_IST(ha, CFG_SET_LEDS_SUPPORT)) {
cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
cmd->DetailStatus = 0;
EL(ha, "done - failed, Invalid function for HBA model\n");
cmd->ResponseLen = 0;
return;
@@ -5990,11 +6197,11 @@
cmd->ResponseLen = 0;
return;
}
/* inform the user of the current beacon state (off or on) */
- bstate.State = xp->ledstate.BeaconState;
+ bstate.State = ha->ledstate.BeaconState;
rval = ddi_copyout((void *)&bstate,
(void *)(uintptr_t)cmd->ResponseAdr,
sizeof (EXT_BEACON_CONTROL), mode);
@@ -6005,11 +6212,11 @@
} else {
cmd->Status = EXT_STATUS_OK;
cmd->ResponseLen = sizeof (EXT_BEACON_CONTROL);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_blink_led
* Determine the next state of the LED and drive it
@@ -6022,29 +6229,82 @@
*/
void
ql_blink_led(ql_adapter_state_t *ha)
{
uint32_t nextstate;
- ql_xioctl_t *xp = ha->xioctl;
+ ql_mbx_data_t mr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (xp->ledstate.BeaconState == BEACON_ON) {
+ if (ha->ledstate.BeaconState == BEACON_ON) {
+ if (CFG_IST(ha, CFG_CTRL_2363 | CFG_CTRL_2425)) {
/* determine the next led state */
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
- nextstate = (xp->ledstate.LEDflags) &
+ if (CFG_IST(ha, CFG_CTRL_2425)) {
+ nextstate = (ha->ledstate.LEDflags) &
(~(RD32_IO_REG(ha, gpiod)));
} else {
- nextstate = (xp->ledstate.LEDflags) &
+ nextstate = (ha->ledstate.LEDflags) &
(~(RD16_IO_REG(ha, gpiod)));
}
/* turn the led on or off */
ql_drive_led(ha, nextstate);
+ } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
+ if (ha->ledstate.flags & LED_ACTIVE) {
+ mr.mb[1] = 0x2000;
+ mr.mb[2] = 0x4000;
+ ha->ledstate.flags &= ~LED_ACTIVE;
+ } else {
+ mr.mb[1] = 0x4000;
+ mr.mb[2] = 0x2000;
+ ha->ledstate.flags |= LED_ACTIVE;
}
+ (void) ql_set_led_config(ha, &mr);
+ } else if (CFG_IST(ha, CFG_CTRL_80XX)) {
+ if (ha->ledstate.flags & LED_ACTIVE) {
+ mr.mb[1] = 0x4000;
+ mr.mb[2] = 0x2000;
+ mr.mb[3] = 0x4000;
+ mr.mb[4] = 0x4000;
+ mr.mb[5] = 0;
+ mr.mb[6] = 0x2000;
+ (void) ql_set_led_config(ha, &mr);
+ ha->ledstate.flags &= ~LED_ACTIVE;
+ } else {
+ mr.mb[1] = 0x4000;
+ mr.mb[2] = 0x4000;
+ mr.mb[3] = 0x4000;
+ mr.mb[4] = 0x2000;
+ mr.mb[5] = 0;
+ mr.mb[6] = 0x2000;
+ (void) ql_set_led_config(ha, &mr);
+ ha->ledstate.flags |= LED_ACTIVE;
+ }
+ } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+ if (ha->ledstate.flags & LED_ACTIVE) {
+ (void) ql_write_remote_reg(ha,
+ ha->ledstate.select,
+ 0x40004000);
+ (void) ql_write_remote_reg(ha,
+ ha->ledstate.select + 4,
+ 0x40004000);
+ ha->ledstate.flags &= ~LED_ACTIVE;
+ } else {
+ (void) ql_write_remote_reg(ha,
+ ha->ledstate.select,
+ 0x40002000);
+ (void) ql_write_remote_reg(ha,
+ ha->ledstate.select + 4,
+ 0x40002000);
+ ha->ledstate.flags |= LED_ACTIVE;
+ }
+ } else if (!CFG_IST(ha, CFG_CTRL_27XX)) {
+ EL(ha, "unsupported HBA: %xh\n", ha->device_id);
+ }
+ }
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_drive_led
* drive the led's as determined by LEDflags
@@ -6057,15 +6317,14 @@
* Kernel/Interrupt context.
*/
static void
ql_drive_led(ql_adapter_state_t *ha, uint32_t LEDflags)
{
+ QL_PRINT_9(ha, "started\n");
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ if (CFG_IST(ha, CFG_CTRL_2363)) {
- if (CFG_IST(ha, (CFG_CTRL_2300 | CFG_CTRL_6322))) {
-
uint16_t gpio_enable, gpio_data;
/* setup to send new data */
gpio_enable = (uint16_t)RD16_IO_REG(ha, gpioe);
gpio_enable = (uint16_t)(gpio_enable | LED_MASK);
@@ -6079,12 +6338,11 @@
gpio_data = (uint16_t)(gpio_data | LEDflags);
/* write out the new led data */
WRT16_IO_REG(ha, gpiod, gpio_data);
- } else if (CFG_IST(ha, CFG_CTRL_24258081)) {
-
+ } else if (CFG_IST(ha, CFG_CTRL_2425)) {
uint32_t gpio_data;
/* setup to send new data */
gpio_data = RD32_IO_REG(ha, gpiod);
gpio_data |= LED_MASK_UPDATE_24;
@@ -6099,14 +6357,14 @@
/* write out the new led data */
WRT32_IO_REG(ha, gpiod, gpio_data);
} else {
- EL(ha, "unsupported HBA: %xh", ha->device_id);
+ EL(ha, "unsupported HBA: %xh\n", ha->device_id);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_setup_led
* Setup LED for driver control
@@ -6115,18 +6373,19 @@
* ha: adapter state pointer.
*
* Context:
* Kernel/Interrupt context.
*/
-static uint32_t
+static int
ql_setup_led(ql_adapter_state_t *ha)
{
- uint32_t rval;
+ int rval = QL_SUCCESS;
ql_mbx_data_t mr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
+ if (CFG_IST(ha, CFG_CTRL_2363 | CFG_CTRL_2425)) {
/* decouple the LED control from the fw */
rval = ql_get_firmware_option(ha, &mr);
if (rval != QL_SUCCESS) {
EL(ha, "failed, get_firmware_option=%xh\n", rval);
return (rval);
@@ -6143,13 +6402,84 @@
}
/* initally, turn the LED's off */
ql_drive_led(ha, LED_ALL_OFF);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ } else if (CFG_IST(ha, CFG_CTRL_81XX)) {
+ (void) ql_get_led_config(ha, &ha->ledstate.cfg);
+ mr.mb[1] = 0x2000;
+ mr.mb[2] = 0x2000;
+ rval = ql_set_led_config(ha, &mr);
+ } else if (CFG_IST(ha, CFG_CTRL_80XX)) {
+ /* Save initial value */
+ rval = ql_get_led_config(ha, &ha->ledstate.cfg);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, get_led_config=%xh\n", rval);
return (rval);
+ }
+ mr.mb[1] = 0x4000;
+ mr.mb[2] = 0x4000;
+ mr.mb[3] = 0x4000;
+ mr.mb[4] = 0x2000;
+ mr.mb[5] = 0;
+ mr.mb[6] = 0x2000;
+ rval = ql_set_led_config(ha, &mr);
+
+ } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+ rval = ql_get_firmware_option(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, get_firmware_option=%xh\n", rval);
+ return (rval);
+ }
+
+ mr.mb[1] = (uint16_t)(mr.mb[1] | FO1_DISABLE_LEDS);
+
+ rval = ql_set_firmware_option(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, set_firmware_option=%xh\n", rval);
+ return (rval);
+ }
+
+ (void) ql_write_remote_reg(ha, ha->ledstate.select,
+ 0x40002000);
+ (void) ql_write_remote_reg(ha, ha->ledstate.select + 4,
+ 0x40002000);
+
+ } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+ /* take control of LED */
+ rval = ql_get_firmware_option(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, get_firmware_option=%xh\n", rval);
+ return (rval);
+ }
+
+ mr.mb[1] = (uint16_t)(mr.mb[1] | FO1_DISABLE_LEDS);
+
+ rval = ql_set_firmware_option(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, set_firmware_option=%xh\n", rval);
+ return (rval);
+ }
+
+ mr.mb[1] = 0xf;
+ mr.mb[2] = 0x230;
+ mr.mb[3] = 0x230;
+ mr.mb[4] = 0x4000;
+ rval = ql_led_config(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, led_config=%xh\n", rval);
+ return (rval);
+ }
+ } else {
+ EL(ha, "unsupported HBA: %xh\n", ha->device_id);
+ }
+ ha->ledstate.flags |= LED_ACTIVE;
+
+ QL_PRINT_9(ha, "done\n");
+
+ return (rval);
}
/*
* ql_wrapup_led
* Return LED control to the firmware
@@ -6158,50 +6488,72 @@
* ha: adapter state pointer.
*
* Context:
* Kernel/Interrupt context.
*/
-static uint32_t
+static int
ql_wrapup_led(ql_adapter_state_t *ha)
{
- uint32_t rval;
+ int rval = QL_SUCCESS;
ql_mbx_data_t mr;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- /* Turn all LED's off */
- ql_drive_led(ha, LED_ALL_OFF);
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
-
+ if (CFG_IST(ha, CFG_CTRL_2363 | CFG_CTRL_2425)) {
uint32_t gpio_data;
+ /* Turn all LED's off */
+ ql_drive_led(ha, LED_ALL_OFF);
+
+ if (CFG_IST(ha, CFG_CTRL_2425)) {
/* disable the LED update mask */
gpio_data = RD32_IO_REG(ha, gpiod);
gpio_data &= ~LED_MASK_UPDATE_24;
/* write out the data */
WRT32_IO_REG(ha, gpiod, gpio_data);
+ /* give LED control back to the f/w */
}
+ rval = ql_get_firmware_option(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, get_firmware_option=%xh\n", rval);
+ return (rval);
+ }
+ mr.mb[1] = (uint16_t)(mr.mb[1] & ~FO1_DISABLE_GPIO);
+
+ rval = ql_set_firmware_option(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, set_firmware_option=%xh\n", rval);
+ return (rval);
+ }
+ } else if (CFG_IST(ha, CFG_CTRL_8081)) {
+ rval = ql_set_led_config(ha, &ha->ledstate.cfg);
+
+ } else if (CFG_IST(ha, CFG_CTRL_2783)) {
/* give LED control back to the f/w */
rval = ql_get_firmware_option(ha, &mr);
if (rval != QL_SUCCESS) {
EL(ha, "failed, get_firmware_option=%xh\n", rval);
return (rval);
}
- mr.mb[1] = (uint16_t)(mr.mb[1] & ~FO1_DISABLE_GPIO);
+ mr.mb[1] = (uint16_t)(mr.mb[1] & ~FO1_DISABLE_LEDS);
rval = ql_set_firmware_option(ha, &mr);
if (rval != QL_SUCCESS) {
EL(ha, "failed, set_firmware_option=%xh\n", rval);
return (rval);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ } else {
+ EL(ha, "unsupported HBA: %xh\n", ha->device_id);
+ }
+ QL_PRINT_9(ha, "done\n");
+
return (rval);
}
/*
* ql_get_port_summary
@@ -6230,11 +6582,11 @@
ql_tgt_t *tq;
uint32_t rlen, dev_type, index;
int rval = 0;
EXT_DEVICEDATAENTRY *uddep, *ddep;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
ddep = &dd.EntryList[0];
/*
* Get the type of device the requestor is looking for.
@@ -6289,11 +6641,12 @@
for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
for (link = ha->dev[index].first; link != NULL;
link = link->next) {
tq = link->base_address;
if (tq->flags & TQF_INITIATOR_DEVICE ||
- !VALID_TARGET_ID(ha, tq->loop_id)) {
+ !VALID_TARGET_ID(ha, tq->loop_id) ||
+ tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
continue; /* Skip this one */
}
bzero((void *)ddep, sizeof (EXT_DEVICEDATAENTRY));
@@ -6307,11 +6660,11 @@
bcopy(tq->port_name,
(caddr_t)&ddep->TargetAddress.Target, 8);
ddep->DeviceFlags = tq->flags;
ddep->LoopID = tq->loop_id;
- QL_PRINT_9(CE_CONT, "(%d): Tgt=%lld, loop=%xh, "
+ QL_PRINT_9(ha, "Tgt=%lld, loop=%xh, "
"wwnn=%02x%02x%02x%02x%02x%02x%02x%02x, "
"wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
ha->instance, ddep->TargetAddress.Target,
ddep->LoopID, ddep->NodeWWN[0], ddep->NodeWWN[1],
ddep->NodeWWN[2], ddep->NodeWWN[3],
@@ -6343,11 +6696,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout-2\n");
} else {
cmd->ResponseLen += (uint32_t)sizeof (EXT_DEVICEDATAENTRY);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_get_target_id
@@ -6372,11 +6725,11 @@
EXT_DEST_ADDR extdestaddr = {0};
uint8_t *name;
uint8_t wwpn[EXT_DEF_WWN_NAME_SIZE];
ql_tgt_t *tq;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
(void*)wwpn, sizeof (EXT_DEST_ADDR), mode) != 0) {
EL(ha, "failed, ddi_copyin\n");
cmd->Status = EXT_STATUS_COPY_ERR;
@@ -6384,11 +6737,11 @@
return;
}
qlnt = QLNT_PORT;
name = wwpn;
- QL_PRINT_9(CE_CONT, "(%d): wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
+ QL_PRINT_9(ha, "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
ha->instance, name[0], name[1], name[2], name[3], name[4],
name[5], name[6], name[7]);
tq = ql_find_port(ha, name, qlnt);
if (tq == NULL || !VALID_TARGET_ID(ha, tq->loop_id)) {
@@ -6406,11 +6759,11 @@
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_setup_fcache
* Populates selected flash sections into the cache
@@ -6436,25 +6789,21 @@
uint32_t fw_done = 0;
ql_fcache_t *head = NULL;
ql_fcache_t *tail = NULL;
ql_fcache_t *ftmp;
- QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_10(ha, "started cfg=0x%llx\n", ha->cfg_flags);
- CACHE_LOCK(ha);
-
/* If we already have populated it, rtn */
if (ha->fcache != NULL) {
- CACHE_UNLOCK(ha);
EL(ha, "buffer already populated\n");
return (QL_SUCCESS);
}
ql_flash_nvram_defaults(ha);
if ((rval = ql_setup_flash(ha)) != QL_SUCCESS) {
- CACHE_UNLOCK(ha);
EL(ha, "unable to setup flash; rval=%xh\n", rval);
return (rval);
}
while (freadpos != 0xffffffff) {
@@ -6473,11 +6822,11 @@
tail = ftmp;
}
/* Do the firmware node first for 24xx/25xx's */
if (fw_done == 0) {
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
freadpos = ha->flash_fw_addr << 2;
}
fw_done = 1;
}
@@ -6508,13 +6857,12 @@
}
EL(ha, "failed, done\n");
} else {
ha->fcache = head;
- QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_10(ha, "done\n");
}
- CACHE_UNLOCK(ha);
return (rval);
}
/*
@@ -6541,11 +6889,11 @@
uint32_t fw_done = 0;
ql_fcache_t *head = NULL;
ql_fcache_t *tail = NULL;
ql_fcache_t *ftmp;
- QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_3(ha, "started\n");
while (freadpos != 0xffffffff) {
/* Allocate & populate this node */
@@ -6563,24 +6911,24 @@
tail = ftmp;
}
/* Do the firmware node first for 24xx's */
if (fw_done == 0) {
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
freadpos = ha->flash_fw_addr << 2;
}
fw_done = 1;
}
/* read in first FBUFSIZE bytes of this flash section */
- if (freadpos+FBUFSIZE > bsize) {
+ if (freadpos + FBUFSIZE > bsize) {
EL(ha, "passed buffer too small; fr=%xh, bsize=%xh\n",
freadpos, bsize);
rval = QL_FUNCTION_FAILED;
break;
}
- bcopy(bfp+freadpos, ftmp->buf, FBUFSIZE);
+ bcopy(bfp + freadpos, ftmp->buf, FBUFSIZE);
/* checkout the pci data / format */
if (ql_check_pci(ha, ftmp, &freadpos)) {
EL(ha, "flash header incorrect\n");
rval = QL_FUNCTION_FAILED;
@@ -6596,16 +6944,14 @@
EL(ha, "failed, done\n");
} else {
/*
* Release previous fcache resources and update with new
*/
- CACHE_LOCK(ha);
ql_fcache_rel(ha->fcache);
ha->fcache = head;
- CACHE_UNLOCK(ha);
- QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_3(ha, "done\n");
}
}
/*
* ql_setup_fnode
@@ -6689,11 +7035,11 @@
{
uint32_t len;
ql_link_t *link;
ql_adapter_state_t *ha2;
- QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_3(ha, "started\n");
/* Get base path length. */
for (len = (uint32_t)strlen(ha->devpath); len; len--) {
if (ha->devpath[len] == ',' ||
ha->devpath[len] == '@') {
@@ -6707,26 +7053,24 @@
if (strncmp(ha->devpath, ha2->devpath, len) != 0) {
continue;
}
- CACHE_LOCK(ha2);
ql_fcache_rel(ha2->fcache);
ha2->fcache = NULL;
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
if (ha2->vcache != NULL) {
kmem_free(ha2->vcache, QL_24XX_VPD_SIZE);
ha2->vcache = NULL;
}
}
- CACHE_UNLOCK(ha2);
(void) ql_setup_fcache(ha2);
}
- QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_3(ha, "done\n");
}
/*
* ql_get_fbuf
* Search the fcache list for the type specified
@@ -6782,11 +7126,11 @@
pci_header_t *pcih;
pci_data_t *pcid;
uint32_t doff;
uint8_t *pciinfo;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_3(ha, "started\n");
if (fcache != NULL) {
pciinfo = fcache->buf;
} else {
EL(ha, "failed, null fcache ptr passed\n");
@@ -6819,12 +7163,11 @@
kmem_free(bufp, len);
}
*nextpos = 0xffffffff;
- QL_PRINT_9(CE_CONT, "(%d): CFG_SBUS_CARD, done\n",
- ha->instance);
+ QL_PRINT_3(ha, "CFG_SBUS_CARD, done\n");
return (0);
}
if (*nextpos == ha->flash_fw_addr << 2) {
@@ -6869,20 +7212,14 @@
(void) snprintf(fcache->verstr, FCHBA_OPTION_ROM_VERSION_LEN,
"%d.%02d.%02d", fcache->buf[19], fcache->buf[23],
fcache->buf[27]);
- if (CFG_IST(ha, CFG_CTRL_81XX)) {
- *nextpos = 0x200000;
- } else if (CFG_IST(ha, CFG_CTRL_8021)) {
- *nextpos = 0x80000;
- } else {
- *nextpos = 0;
- }
+ *nextpos = ha->boot_code_addr << 2;
kmem_free(buf, FBUFSIZE);
- QL_PRINT_9(CE_CONT, "(%d): FTYPE_FW, done\n", ha->instance);
+ QL_PRINT_3(ha, "FTYPE_FW, done\n");
return (0);
}
/* get to the pci header image length */
@@ -6906,12 +7243,12 @@
EL(ha, "failed, data sig mismatch!\n");
return (1);
}
if (pcid->indicator == PCI_IND_LAST_IMAGE) {
- QL_PRINT_9(CE_CONT, "(%d): last image\n", ha->instance);
- if (CFG_IST(ha, CFG_CTRL_24258081)) {
+ QL_PRINT_3(ha, "last image\n");
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
ql_flash_layout_table(ha, *nextpos +
(pcid->imagelength[0] | (pcid->imagelength[1] <<
8)) * PCI_SECTOR_SIZE);
(void) ql_24xx_flash_desc(ha);
}
@@ -6941,11 +7278,11 @@
}
(void) snprintf(fcache->verstr, FCHBA_OPTION_ROM_VERSION_LEN,
"%d.%02d", pcid->revisionlevel[1], pcid->revisionlevel[0]);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_3(ha, "done\n");
return (0);
}
/*
@@ -6966,11 +7303,11 @@
uint8_t *bp;
int rval;
uint32_t len, faddr, cnt;
uint16_t chksum, w16;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Process flash layout table header */
len = sizeof (ql_flt_ptr_t);
if ((bp = kmem_zalloc(len, KM_SLEEP)) == NULL) {
EL(ha, "kmem_zalloc=null\n");
@@ -6991,11 +7328,12 @@
w16 = (uint16_t)CHAR_TO_SHORT(bp[cnt], bp[cnt + 1]);
chksum += w16;
}
if (chksum != 0 || fptr->sig[0] != 'Q' || fptr->sig[1] != 'F' ||
fptr->sig[2] != 'L' || fptr->sig[3] != 'T') {
- EL(ha, "ptr chksum=%xh, sig=%c%c%c%c\n", chksum, fptr->sig[0],
+ EL(ha, "ptr chksum=%xh, sig=%c%c%c%c \n",
+ chksum, fptr->sig[0],
fptr->sig[1], fptr->sig[2], fptr->sig[3]);
kmem_free(bp, len);
return;
}
faddr = CHAR_TO_LONG(fptr->addr[0], fptr->addr[1], fptr->addr[2],
@@ -7003,11 +7341,11 @@
kmem_free(bp, len);
ql_process_flt(ha, faddr);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_process_flt
* Obtains flash addresses from flash layout table
@@ -7027,11 +7365,11 @@
uint8_t *bp, *eaddr, nv_rg, vpd_rg;
int rval;
uint32_t len, cnt, fe_addr;
uint16_t chksum, w16;
- QL_PRINT_9(CE_CONT, "(%d): started faddr=%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "started faddr=%xh\n", faddr);
/* Process flash layout table header */
if ((bp = kmem_zalloc(FLASH_LAYOUT_TABLE_SIZE, KM_SLEEP)) == NULL) {
EL(ha, "kmem_zalloc=null\n");
return;
@@ -7065,11 +7403,11 @@
}
eaddr = bp + len;
/* Process Function/Port Configuration Map. */
nv_rg = vpd_rg = 0;
- if (CFG_IST(ha, CFG_CTRL_8021)) {
+ if (CFG_IST(ha, CFG_CTRL_82XX)) {
uint16_t i;
uint8_t *mbp = eaddr;
ql_fp_cfg_map_t *cmp = (ql_fp_cfg_map_t *)mbp;
len = (uint32_t)(CHAR_TO_SHORT(cmp->hdr.len[0],
@@ -7088,11 +7426,11 @@
cmp->hdr.Signature[0] != 'F' ||
cmp->hdr.Signature[1] != 'P' ||
cmp->hdr.Signature[2] != 'C' ||
cmp->hdr.Signature[3] != 'M') {
EL(ha, "cfg_map chksum=%xh, version=%d, "
- "sig=%c%c%c%c\n", chksum, w16,
+ "sig=%c%c%c%c \n", chksum, w16,
cmp->hdr.Signature[0], cmp->hdr.Signature[1],
cmp->hdr.Signature[2], cmp->hdr.Signature[3]);
} else {
cnt = (uint16_t)
(CHAR_TO_SHORT(cmp->hdr.NumberEntries[0],
@@ -7099,11 +7437,11 @@
cmp->hdr.NumberEntries[1]));
/* Locate entry for function. */
for (i = 0; i < cnt; i++) {
if (cmp->cfg[i].FunctionType == FT_FC &&
cmp->cfg[i].FunctionNumber[0] ==
- ha->function_number &&
+ ha->pci_function_number &&
cmp->cfg[i].FunctionNumber[1] == 0) {
nv_rg = cmp->cfg[i].ConfigRegion;
vpd_rg = cmp->cfg[i].VpdRegion;
break;
}
@@ -7129,127 +7467,127 @@
switch (frgn->region) {
case FLASH_8021_BOOTLOADER_REGION:
ha->bootloader_addr = faddr;
ha->bootloader_size = (fe_addr - faddr) + 1;
- QL_PRINT_9(CE_CONT, "(%d): bootloader_addr=%xh, "
- "size=%xh\n", ha->instance, faddr,
+ QL_PRINT_9(ha, "bootloader_addr=%xh, "
+ "size=%xh\n", faddr,
ha->bootloader_size);
break;
case FLASH_FW_REGION:
case FLASH_8021_FW_REGION:
ha->flash_fw_addr = faddr;
ha->flash_fw_size = (fe_addr - faddr) + 1;
- QL_PRINT_9(CE_CONT, "(%d): flash_fw_addr=%xh, "
- "size=%xh\n", ha->instance, faddr,
+ QL_PRINT_9(ha, "flash_fw_addr=%xh, "
+ "size=%xh\n", faddr,
ha->flash_fw_size);
break;
case FLASH_GOLDEN_FW_REGION:
case FLASH_8021_GOLDEN_FW_REGION:
ha->flash_golden_fw_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_golden_fw_addr=%xh\n",
+ QL_PRINT_9(ha, "flash_golden_fw_addr=%xh\n",
ha->instance, faddr);
break;
case FLASH_8021_VPD_REGION:
if (!vpd_rg || vpd_rg == FLASH_8021_VPD_REGION) {
ha->flash_vpd_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): 8021_flash_vpd_"
- "addr=%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "8021_flash_vpd_"
+ "addr=%xh\n", faddr);
}
break;
case FLASH_VPD_0_REGION:
if (vpd_rg) {
if (vpd_rg == FLASH_VPD_0_REGION) {
ha->flash_vpd_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): vpd_rg "
+ QL_PRINT_9(ha, "vpd_rg "
"flash_vpd_addr=%xh\n",
ha->instance, faddr);
}
- } else if (!(ha->flags & FUNCTION_1) &&
- !(CFG_IST(ha, CFG_CTRL_8021))) {
+ } else if (ha->function_number == 0 &&
+ !(CFG_IST(ha, CFG_CTRL_82XX))) {
ha->flash_vpd_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_vpd_addr=%xh"
- "\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_vpd_addr=%xh"
+ "\n", faddr);
}
break;
case FLASH_NVRAM_0_REGION:
if (nv_rg) {
if (nv_rg == FLASH_NVRAM_0_REGION) {
ADAPTER_STATE_LOCK(ha);
- ha->flags &= ~FUNCTION_1;
+ ha->function_number = 0;
ADAPTER_STATE_UNLOCK(ha);
ha->flash_nvram_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): nv_rg "
+ QL_PRINT_9(ha, "nv_rg "
"flash_nvram_addr=%xh\n",
ha->instance, faddr);
}
- } else if (!(ha->flags & FUNCTION_1)) {
+ } else if (ha->function_number == 0) {
ha->flash_nvram_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_nvram_addr="
- "%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_nvram_addr="
+ "%xh\n", faddr);
}
break;
case FLASH_VPD_1_REGION:
if (vpd_rg) {
if (vpd_rg == FLASH_VPD_1_REGION) {
ha->flash_vpd_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): vpd_rg "
+ QL_PRINT_9(ha, "vpd_rg "
"flash_vpd_addr=%xh\n",
ha->instance, faddr);
}
- } else if (ha->flags & FUNCTION_1 &&
- !(CFG_IST(ha, CFG_CTRL_8021))) {
+ } else if (ha->function_number &&
+ !(CFG_IST(ha, CFG_CTRL_82XX))) {
ha->flash_vpd_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_vpd_addr=%xh"
- "\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_vpd_addr=%xh"
+ "\n", faddr);
}
break;
case FLASH_NVRAM_1_REGION:
if (nv_rg) {
if (nv_rg == FLASH_NVRAM_1_REGION) {
ADAPTER_STATE_LOCK(ha);
- ha->flags |= FUNCTION_1;
+ ha->function_number = 1;
ADAPTER_STATE_UNLOCK(ha);
ha->flash_nvram_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): nv_rg "
+ QL_PRINT_9(ha, "nv_rg "
"flash_nvram_addr=%xh\n",
ha->instance, faddr);
}
- } else if (ha->flags & FUNCTION_1) {
+ } else if (ha->function_number) {
ha->flash_nvram_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_nvram_addr="
- "%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_nvram_addr="
+ "%xh\n", faddr);
}
break;
case FLASH_DESC_TABLE_REGION:
- if (!(CFG_IST(ha, CFG_CTRL_8021))) {
+ if (!(CFG_IST(ha, CFG_CTRL_82XX))) {
ha->flash_desc_addr = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_desc_addr="
- "%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_desc_addr="
+ "%xh\n", faddr);
}
break;
case FLASH_ERROR_LOG_0_REGION:
- if (!(ha->flags & FUNCTION_1)) {
+ if (ha->function_number == 0) {
ha->flash_errlog_start = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_errlog_addr="
- "%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_errlog_addr="
+ "%xh\n", faddr);
}
break;
case FLASH_ERROR_LOG_1_REGION:
- if (ha->flags & FUNCTION_1) {
+ if (ha->function_number) {
ha->flash_errlog_start = faddr;
- QL_PRINT_9(CE_CONT, "(%d): flash_errlog_addr="
- "%xh\n", ha->instance, faddr);
+ QL_PRINT_9(ha, "flash_errlog_addr="
+ "%xh\n", faddr);
}
break;
default:
break;
}
}
kmem_free(bp, FLASH_LAYOUT_TABLE_SIZE);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_flash_nvram_defaults
* Flash default addresses.
@@ -7264,93 +7602,181 @@
* Kernel context.
*/
static void
ql_flash_nvram_defaults(ql_adapter_state_t *ha)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_10(ha, "started\n");
- if (ha->flags & FUNCTION_1) {
- if (CFG_IST(ha, CFG_CTRL_2300)) {
+ if (ha->function_number == 3) {
+ if (CFG_IST(ha, CFG_CTRL_27XX)) {
+ ha->flash_nvram_addr = NVRAM_2700_FUNC3_ADDR;
+ ha->flash_vpd_addr = VPD_2700_FUNC3_ADDR;
+ ha->ledstate.select = BEACON_2700_FUNC3_ADDR;
+ ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+ ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+ ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+ ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+ ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
+ } else {
+ EL(ha, "unassigned flash fn%d addr: %x\n",
+ ha->function_number, ha->device_id);
+ }
+ } else if (ha->function_number == 2) {
+ if (CFG_IST(ha, CFG_CTRL_27XX)) {
+ ha->flash_nvram_addr = NVRAM_2700_FUNC2_ADDR;
+ ha->flash_vpd_addr = VPD_2700_FUNC2_ADDR;
+ ha->ledstate.select = BEACON_2700_FUNC2_ADDR;
+ ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+ ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+ ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+ ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+ ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
+ } else {
+ EL(ha, "unassigned flash fn%d addr: %x\n",
+ ha->function_number, ha->device_id);
+ }
+ } else if (ha->function_number == 1) {
+ if (CFG_IST(ha, CFG_CTRL_23XX) ||
+ (CFG_IST(ha, CFG_CTRL_63XX))) {
ha->flash_nvram_addr = NVRAM_2300_FUNC1_ADDR;
ha->flash_fw_addr = FLASH_2300_FIRMWARE_ADDR;
- } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+ ha->boot_code_addr = FLASH_2300_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
ha->flash_nvram_addr = NVRAM_2400_FUNC1_ADDR;
ha->flash_vpd_addr = VPD_2400_FUNC1_ADDR;
ha->flash_errlog_start = FLASH_2400_ERRLOG_START_ADDR_1;
ha->flash_desc_addr = FLASH_2400_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_2400_FIRMWARE_ADDR;
+ ha->boot_code_addr = FLASH_2400_BOOT_CODE_ADDR;
} else if (CFG_IST(ha, CFG_CTRL_25XX)) {
ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
ha->flash_nvram_addr = NVRAM_2500_FUNC1_ADDR;
ha->flash_vpd_addr = VPD_2500_FUNC1_ADDR;
ha->flash_errlog_start = FLASH_2500_ERRLOG_START_ADDR_1;
ha->flash_desc_addr = FLASH_2500_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_2500_FIRMWARE_ADDR;
+ ha->boot_code_addr = FLASH_2500_BOOT_CODE_ADDR;
} else if (CFG_IST(ha, CFG_CTRL_81XX)) {
ha->flash_data_addr = FLASH_8100_DATA_ADDR;
ha->flash_nvram_addr = NVRAM_8100_FUNC1_ADDR;
ha->flash_vpd_addr = VPD_8100_FUNC1_ADDR;
ha->flash_errlog_start = FLASH_8100_ERRLOG_START_ADDR_1;
ha->flash_desc_addr = FLASH_8100_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_8100_FIRMWARE_ADDR;
- } else if (CFG_IST(ha, CFG_CTRL_8021)) {
+ ha->boot_code_addr = FLASH_8100_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
ha->flash_data_addr = 0;
ha->flash_nvram_addr = NVRAM_8021_FUNC1_ADDR;
ha->flash_vpd_addr = VPD_8021_FUNC1_ADDR;
ha->flash_errlog_start = 0;
ha->flash_desc_addr = FLASH_8021_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_8021_FIRMWARE_ADDR;
ha->flash_fw_size = FLASH_8021_FIRMWARE_SIZE;
ha->bootloader_addr = FLASH_8021_BOOTLOADER_ADDR;
ha->bootloader_size = FLASH_8021_BOOTLOADER_SIZE;
- }
+ ha->boot_code_addr = FLASH_8021_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+ ha->flash_nvram_addr = NVRAM_8300_FC_FUNC1_ADDR;
+ ha->flash_vpd_addr = VPD_8300_FC_FUNC1_ADDR;
+ ha->ledstate.select = BEACON_8300_FC_FUNC1_ADDR;
+ ha->flash_errlog_start = FLASH_8300_ERRLOG_START_ADDR_1;
+ ha->flash_data_addr = FLASH_8300_DATA_ADDR;
+ ha->flash_desc_addr = FLASH_8300_DESCRIPTOR_TABLE;
+ ha->flash_fw_addr = FLASH_8300_FC_FIRMWARE_ADDR;
+ ha->flash_fw_size = FLASH_8300_FIRMWARE_SIZE;
+ ha->bootloader_addr = FLASH_8300_BOOTLOADER_ADDR;
+ ha->bootloader_size = FLASH_8300_BOOTLOADER_SIZE;
+ ha->boot_code_addr = FLASH_8300_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+ ha->flash_nvram_addr = NVRAM_2700_FUNC1_ADDR;
+ ha->flash_vpd_addr = VPD_2700_FUNC1_ADDR;
+ ha->ledstate.select = BEACON_2700_FUNC1_ADDR;
+ ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+ ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+ ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+ ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+ ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
} else {
- if (CFG_IST(ha, CFG_CTRL_2200)) {
+ EL(ha, "unassigned flash fn%d addr: %x\n",
+ ha->function_number, ha->device_id);
+ }
+ } else if (ha->function_number == 0) {
+ if (CFG_IST(ha, CFG_CTRL_22XX)) {
ha->flash_nvram_addr = NVRAM_2200_FUNC0_ADDR;
ha->flash_fw_addr = FLASH_2200_FIRMWARE_ADDR;
- } else if (CFG_IST(ha, CFG_CTRL_2300) ||
- (CFG_IST(ha, CFG_CTRL_6322))) {
+ ha->boot_code_addr = FLASH_2200_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_23XX) ||
+ (CFG_IST(ha, CFG_CTRL_63XX))) {
ha->flash_nvram_addr = NVRAM_2300_FUNC0_ADDR;
ha->flash_fw_addr = FLASH_2300_FIRMWARE_ADDR;
- } else if (CFG_IST(ha, CFG_CTRL_2422)) {
+ ha->boot_code_addr = FLASH_2300_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_24XX)) {
ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
ha->flash_nvram_addr = NVRAM_2400_FUNC0_ADDR;
ha->flash_vpd_addr = VPD_2400_FUNC0_ADDR;
ha->flash_errlog_start = FLASH_2400_ERRLOG_START_ADDR_0;
ha->flash_desc_addr = FLASH_2400_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_2400_FIRMWARE_ADDR;
+ ha->boot_code_addr = FLASH_2400_BOOT_CODE_ADDR;
} else if (CFG_IST(ha, CFG_CTRL_25XX)) {
ha->flash_data_addr = FLASH_24_25_DATA_ADDR;
ha->flash_nvram_addr = NVRAM_2500_FUNC0_ADDR;
ha->flash_vpd_addr = VPD_2500_FUNC0_ADDR;
ha->flash_errlog_start = FLASH_2500_ERRLOG_START_ADDR_0;
ha->flash_desc_addr = FLASH_2500_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_2500_FIRMWARE_ADDR;
+ ha->boot_code_addr = FLASH_2500_BOOT_CODE_ADDR;
} else if (CFG_IST(ha, CFG_CTRL_81XX)) {
ha->flash_data_addr = FLASH_8100_DATA_ADDR;
ha->flash_nvram_addr = NVRAM_8100_FUNC0_ADDR;
ha->flash_vpd_addr = VPD_8100_FUNC0_ADDR;
ha->flash_errlog_start = FLASH_8100_ERRLOG_START_ADDR_0;
ha->flash_desc_addr = FLASH_8100_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_8100_FIRMWARE_ADDR;
- } else if (CFG_IST(ha, CFG_CTRL_8021)) {
+ ha->boot_code_addr = FLASH_8100_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_82XX)) {
ha->flash_data_addr = 0;
ha->flash_nvram_addr = NVRAM_8021_FUNC0_ADDR;
ha->flash_vpd_addr = VPD_8021_FUNC0_ADDR;
ha->flash_errlog_start = 0;
ha->flash_desc_addr = FLASH_8021_DESCRIPTOR_TABLE;
ha->flash_fw_addr = FLASH_8021_FIRMWARE_ADDR;
ha->flash_fw_size = FLASH_8021_FIRMWARE_SIZE;
ha->bootloader_addr = FLASH_8021_BOOTLOADER_ADDR;
ha->bootloader_size = FLASH_8021_BOOTLOADER_SIZE;
+ ha->boot_code_addr = FLASH_8021_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_83XX)) {
+ ha->flash_nvram_addr = NVRAM_8300_FC_FUNC0_ADDR;
+ ha->flash_vpd_addr = VPD_8300_FC_FUNC0_ADDR;
+ ha->ledstate.select = BEACON_8300_FCOE_FUNC0_ADDR;
+ ha->flash_errlog_start = FLASH_8300_ERRLOG_START_ADDR_0;
+ ha->flash_data_addr = FLASH_8300_DATA_ADDR;
+ ha->flash_desc_addr = FLASH_8300_DESCRIPTOR_TABLE;
+ ha->flash_fw_addr = FLASH_8300_FC_FIRMWARE_ADDR;
+ ha->flash_fw_size = FLASH_8300_FIRMWARE_SIZE;
+ ha->bootloader_addr = FLASH_8300_BOOTLOADER_ADDR;
+ ha->bootloader_size = FLASH_8300_BOOTLOADER_SIZE;
+ ha->boot_code_addr = FLASH_8300_BOOT_CODE_ADDR;
+ } else if (CFG_IST(ha, CFG_CTRL_27XX)) {
+ ha->flash_nvram_addr = NVRAM_2700_FUNC0_ADDR;
+ ha->flash_vpd_addr = VPD_2700_FUNC0_ADDR;
+ ha->ledstate.select = BEACON_2700_FUNC0_ADDR;
+ ha->flash_data_addr = FLASH_2700_DATA_ADDR;
+ ha->flash_desc_addr = FLASH_2700_DESCRIPTOR_TABLE;
+ ha->flash_fw_addr = FLASH_2700_FIRMWARE_ADDR;
+ ha->flash_fw_size = FLASH_2700_FIRMWARE_SIZE;
+ ha->boot_code_addr = FLASH_2700_BOOT_CODE_ADDR;
} else {
- EL(ha, "unassigned flash fn0 addr: %x\n",
- ha->device_id);
+ EL(ha, "unassigned flash fn%d addr: %x\n",
+ ha->function_number, ha->device_id);
}
+ } else {
+ EL(ha, "known function=%d, device_id=%x\n",
+ ha->function_number, ha->device_id);
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_10(ha, "done\n");
}
/*
* ql_get_sfp
* Returns sfp data to sdmapi caller
@@ -7367,13 +7793,13 @@
* Kernel context.
*/
static void
ql_get_sfp(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
cmd->Status = EXT_STATUS_INVALID_REQUEST;
EL(ha, "failed, invalid request for HBA\n");
return;
}
@@ -7392,11 +7818,11 @@
EL(ha, "failed, copy error\n");
} else {
cmd->Status = EXT_STATUS_OK;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_dump_sfp
* Dumps SFP.
@@ -7417,11 +7843,11 @@
dma_mem_t mem;
uint32_t cnt;
int rval2, rval = 0;
uint32_t dxfer;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Get memory for SFP. */
if ((rval2 = ql_get_dma_mem(ha, &mem, 64, LITTLE_ENDIAN_DMA,
QL_DMA_DATA_ALIGN)) != QL_SUCCESS) {
@@ -7452,11 +7878,11 @@
bp = (caddr_t)bp + mem.size;
}
ql_free_phys(ha, &mem);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
@@ -7482,13 +7908,13 @@
ql_tgt_t *tq;
EXT_PORT_PARAM port_param = {0};
uint32_t rval = QL_SUCCESS;
uint32_t idma_rate;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (CFG_IST(ha, CFG_CTRL_242581) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
EL(ha, "invalid request for this HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -7516,16 +7942,17 @@
return;
}
name = port_param.FCScsiAddr.DestAddr.WWPN;
- QL_PRINT_9(CE_CONT, "(%d): wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
+ QL_PRINT_9(ha, "wwpn=%02x%02x%02x%02x%02x%02x%02x%02x\n",
ha->instance, name[0], name[1], name[2], name[3], name[4],
name[5], name[6], name[7]);
tq = ql_find_port(ha, name, (uint16_t)QLNT_PORT);
- if (tq == NULL || !VALID_TARGET_ID(ha, tq->loop_id)) {
+ if (tq == NULL || !VALID_TARGET_ID(ha, tq->loop_id) ||
+ tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
EL(ha, "failed, fc_port not found\n");
cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
cmd->ResponseLen = 0;
return;
}
@@ -7566,10 +7993,18 @@
break;
case IIDMA_RATE_10GB:
port_param.Speed =
EXT_DEF_PORTSPEED_10GBIT;
break;
+ case IIDMA_RATE_16GB:
+ port_param.Speed =
+ EXT_DEF_PORTSPEED_16GBIT;
+ break;
+ case IIDMA_RATE_32GB:
+ port_param.Speed =
+ EXT_DEF_PORTSPEED_32GBIT;
+ break;
default:
port_param.Speed =
EXT_DEF_PORTSPEED_UNKNOWN;
EL(ha, "failed, Port speed rate=%xh\n",
idma_rate);
@@ -7608,12 +8043,18 @@
break;
case EXT_DEF_PORTSPEED_8GBIT:
idma_rate = IIDMA_RATE_8GB;
break;
case EXT_DEF_PORTSPEED_10GBIT:
- port_param.Speed = IIDMA_RATE_10GB;
+ idma_rate = IIDMA_RATE_10GB;
break;
+ case EXT_DEF_PORTSPEED_16GBIT:
+ idma_rate = IIDMA_RATE_16GB;
+ break;
+ case EXT_DEF_PORTSPEED_32GBIT:
+ idma_rate = IIDMA_RATE_32GB;
+ break;
default:
EL(ha, "invalid set iidma rate: %x\n",
port_param.Speed);
cmd->Status = EXT_STATUS_INVALID_PARAM;
cmd->ResponseLen = 0;
@@ -7638,11 +8079,11 @@
cmd->ResponseLen = 0;
cmd->DetailStatus = 0;
break;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fwexttrace
* Dumps f/w extended trace buffer
@@ -7662,13 +8103,13 @@
ql_get_fwexttrace(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int rval;
caddr_t payload;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
EL(ha, "invalid request for this HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -7689,21 +8130,23 @@
cmd->ResponseLen = 0;
return;
}
/* Time Stamp */
- rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_INSERT_TIME_STAMP);
+ rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_INSERT_TIME_STAMP,
+ NULL);
if (rval != QL_SUCCESS) {
EL(ha, "f/w extended trace insert"
"time stamp failed: %xh\n", rval);
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
return;
}
/* Disable Tracing */
- rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_EXT_TRACE_DISABLE);
+ rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_EXT_TRACE_DISABLE,
+ NULL);
if (rval != QL_SUCCESS) {
EL(ha, "f/w extended trace disable failed: %xh\n", rval);
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
return;
@@ -7737,11 +8180,11 @@
cmd->Status = EXT_STATUS_OK;
}
kmem_free(payload, FWEXTSIZE);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fwfcetrace
* Dumps f/w fibre channel event trace buffer
@@ -7759,15 +8202,19 @@
/* ARGSUSED */
static void
ql_get_fwfcetrace(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int rval;
- caddr_t payload;
+ caddr_t fce_trace_p;
+ ql_mbx_data_t mr;
+ EXT_FW_FCE_TRACE *fce_trace;
+ size_t cnt;
+ uint32_t *bp;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
EL(ha, "invalid request for this HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -7788,49 +8235,87 @@
cmd->ResponseLen = 0;
return;
}
/* Disable Tracing */
- rval = ql_fw_etrace(ha, &ha->fwfcetracebuf, FTO_FCE_TRACE_DISABLE);
+ rval = ql_fw_etrace(ha, &ha->fwfcetracebuf, FTO_FCE_TRACE_DISABLE, &mr);
if (rval != QL_SUCCESS) {
EL(ha, "f/w FCE trace disable failed: %xh\n", rval);
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
return;
}
/* Allocate payload buffer */
- payload = kmem_zalloc(FWEXTSIZE, KM_SLEEP);
- if (payload == NULL) {
+ fce_trace = kmem_zalloc(FWFCESIZE, KM_SLEEP);
+ if (fce_trace == NULL) {
EL(ha, "failed, kmem_zalloc\n");
cmd->Status = EXT_STATUS_NO_MEMORY;
cmd->ResponseLen = 0;
return;
}
+ fce_trace_p = (caddr_t)&fce_trace->TraceData[0];
+ /* Copy In Ponter and Base Pointer values */
+ fce_trace->Registers[0] = mr.mb[2];
+ fce_trace->Registers[1] = mr.mb[3];
+ fce_trace->Registers[2] = mr.mb[4];
+ fce_trace->Registers[3] = mr.mb[5];
+
+ fce_trace->Registers[4] = LSW(ha->fwexttracebuf.cookies->dmac_address);
+ fce_trace->Registers[5] = MSW(ha->fwexttracebuf.cookies->dmac_address);
+ fce_trace->Registers[6] = LSW(ha->fwexttracebuf.cookies->dmac_notused);
+ fce_trace->Registers[7] = MSW(ha->fwexttracebuf.cookies->dmac_notused);
+
+ /* Copy FCE Trace Enable Registers */
+ fce_trace->Registers[8] = ha->fw_fce_trace_enable.mb[0];
+ fce_trace->Registers[9] = ha->fw_fce_trace_enable.mb[2];
+ fce_trace->Registers[10] = ha->fw_fce_trace_enable.mb[3];
+ fce_trace->Registers[11] = ha->fw_fce_trace_enable.mb[4];
+ fce_trace->Registers[12] = ha->fw_fce_trace_enable.mb[5];
+ fce_trace->Registers[13] = ha->fw_fce_trace_enable.mb[6];
+
/* Sync DMA buffer. */
(void) ddi_dma_sync(ha->fwfcetracebuf.dma_handle, 0,
FWFCESIZE, DDI_DMA_SYNC_FORKERNEL);
/* Copy trace buffer data. */
- ddi_rep_get8(ha->fwfcetracebuf.acc_handle, (uint8_t *)payload,
+ ddi_rep_get8(ha->fwfcetracebuf.acc_handle, (uint8_t *)fce_trace_p,
(uint8_t *)ha->fwfcetracebuf.bp, FWFCESIZE,
DDI_DEV_AUTOINCR);
+ /* Swap bytes in buffer in case of Big Endian */
+ bp = (uint32_t *)&fce_trace->TraceData[0];
+ for (cnt = 0; cnt < (FWFCESIZE / sizeof (uint32_t)); cnt++) {
+ LITTLE_ENDIAN_32(bp);
+ bp++;
+ }
+
/* Send payload to application. */
- if (ql_send_buffer_data(payload, (caddr_t)(uintptr_t)cmd->ResponseAdr,
+ if (ql_send_buffer_data((caddr_t)fce_trace,
+ (caddr_t)(uintptr_t)cmd->ResponseAdr,
cmd->ResponseLen, mode) != cmd->ResponseLen) {
EL(ha, "failed, send_buffer_data\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
} else {
cmd->Status = EXT_STATUS_OK;
}
- kmem_free(payload, FWFCESIZE);
+ /* Re-enable Tracing */
+ bzero(ha->fwfcetracebuf.bp, ha->fwfcetracebuf.size);
+ if ((rval = ql_fw_etrace(ha, &ha->fwfcetracebuf,
+ FTO_FCE_TRACE_ENABLE, &mr)) != QL_SUCCESS) {
+ EL(ha, "fcetrace enable failed: %xh\n", rval);
+ } else {
+ ha->fw_fce_trace_enable = mr;
+ EL(ha, "FCE Trace Re-Enabled\n");
+ }
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ kmem_free(fce_trace, FWFCESIZE);
+
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_pci_data
* Retrieves pci config space data
@@ -7852,11 +8337,11 @@
{
uint8_t cap_ptr;
uint8_t cap_id;
uint32_t buf_size = 256;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/*
* First check the "Capabilities List" bit of the status register.
*/
if (ql_pci_config_get16(ha, PCI_CONF_STAT) & PCI_STAT_CAP) {
@@ -7895,11 +8380,11 @@
} else {
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = buf_size;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_pci_dump
* Dumps PCI config data to application buffer.
@@ -7917,11 +8402,11 @@
ql_pci_dump(ql_adapter_state_t *ha, uint32_t *bp, uint32_t pci_size, int mode)
{
uint32_t pci_os;
uint32_t *ptr32, *org_ptr32;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
ptr32 = kmem_zalloc(pci_size, KM_SLEEP);
if (ptr32 == NULL) {
EL(ha, "failed kmem_zalloc\n");
return (ENOMEM);
@@ -7944,11 +8429,11 @@
QL_DUMP_9(org_ptr32, 8, pci_size);
kmem_free(org_ptr32, pci_size);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
return (0);
}
/*
@@ -7970,11 +8455,11 @@
{
EXT_MENLO_RESET rst;
ql_mbx_data_t mr;
int rval;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if ((CFG_IST(ha, CFG_CTRL_MENLO)) == 0) {
EL(ha, "failed, invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
@@ -8027,11 +8512,11 @@
cmd->ResponseLen = 0;
}
ql_restart_hba(ha);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_menlo_get_fw_version
* Get Menlo firmware version.
@@ -8051,11 +8536,11 @@
{
int rval;
ql_mbx_iocb_t *pkt;
EXT_MENLO_GET_FW_VERSION ver = {0};
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if ((CFG_IST(ha, CFG_CTRL_MENLO)) == 0) {
EL(ha, "failed, invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
@@ -8109,11 +8594,11 @@
cmd->ResponseLen = sizeof (EXT_MENLO_GET_FW_VERSION);
}
kmem_free(pkt, sizeof (ql_mbx_iocb_t));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_menlo_update_fw
* Get Menlo update firmware.
@@ -8135,11 +8620,11 @@
dma_mem_t *dma_mem;
EXT_MENLO_UPDATE_FW fw;
uint32_t *ptr32;
int rval;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
if ((CFG_IST(ha, CFG_CTRL_MENLO)) == 0) {
EL(ha, "failed, invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
@@ -8198,12 +8683,12 @@
}
/* Get DMA memory for the IOCB */
if (ql_get_dma_mem(ha, dma_mem, fw.TotalByteCount, LITTLE_ENDIAN_DMA,
QL_DMA_DATA_ALIGN) != QL_SUCCESS) {
- cmn_err(CE_WARN, "%s(%d): request queue DMA memory "
- "alloc failed", QL_NAME, ha->instance);
+ cmn_err(CE_WARN, "%srequest queue DMA memory "
+ "alloc failed", QL_NAME);
kmem_free(pkt, sizeof (ql_mbx_iocb_t));
kmem_free(dma_mem, sizeof (dma_mem_t));
ql_restart_hba(ha);
cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
cmd->ResponseLen = 0;
@@ -8233,15 +8718,15 @@
ptr32 = dma_mem->bp;
pkt->mvfy.fw_version = LE_32(ptr32[2]);
pkt->mvfy.fw_size = LE_32(fw.TotalByteCount);
pkt->mvfy.fw_sequence_size = LE_32(fw.TotalByteCount);
pkt->mvfy.dseg_count = LE_16(1);
- pkt->mvfy.dseg_0_address[0] = (uint32_t)
+ pkt->mvfy.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->mvfy.dseg_0_address[1] = (uint32_t)
+ pkt->mvfy.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
- pkt->mvfy.dseg_0_length = LE_32(fw.TotalByteCount);
+ pkt->mvfy.dseg.length = LE_32(fw.TotalByteCount);
rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt, sizeof (ql_mbx_iocb_t));
LITTLE_ENDIAN_16(&pkt->mvfy.options_status);
LITTLE_ENDIAN_16(&pkt->mvfy.failure_code);
@@ -8260,11 +8745,11 @@
ql_free_dma_resource(ha, dma_mem);
kmem_free(pkt, sizeof (ql_mbx_iocb_t));
kmem_free(dma_mem, sizeof (dma_mem_t));
ql_restart_hba(ha);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_menlo_manage_info
* Get Menlo manage info.
@@ -8285,22 +8770,21 @@
ql_mbx_iocb_t *pkt;
dma_mem_t *dma_mem = NULL;
EXT_MENLO_MANAGE_INFO info;
int rval;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* The call is only supported for Schultz right now */
- if (CFG_IST(ha, CFG_CTRL_8081)) {
+ if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
ql_get_xgmac_statistics(ha, cmd, mode);
- QL_PRINT_9(CE_CONT, "(%d): CFG_CTRL_81XX done\n",
- ha->instance);
+ QL_PRINT_9(ha, "CFG_FCOE_SUPPORT done\n");
return;
}
- if (!CFG_IST(ha, CFG_CTRL_8081) || !CFG_IST(ha, CFG_CTRL_MENLO)) {
+ if (!CFG_IST(ha, CFG_CTRL_MENLO)) {
EL(ha, "failed, invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -8354,12 +8838,12 @@
cmd->ResponseLen = 0;
return;
}
if (ql_get_dma_mem(ha, dma_mem, info.TotalByteCount,
LITTLE_ENDIAN_DMA, QL_DMA_DATA_ALIGN) != QL_SUCCESS) {
- cmn_err(CE_WARN, "%s(%d): request queue DMA memory "
- "alloc failed", QL_NAME, ha->instance);
+ cmn_err(CE_WARN, "%srequest queue DMA memory "
+ "alloc failed", QL_NAME);
kmem_free(dma_mem, sizeof (dma_mem_t));
kmem_free(pkt, sizeof (ql_mbx_iocb_t));
cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
cmd->ResponseLen = 0;
return;
@@ -8380,15 +8864,15 @@
}
(void) ddi_dma_sync(dma_mem->dma_handle, 0,
dma_mem->size, DDI_DMA_SYNC_FORDEV);
}
pkt->mdata.dseg_count = LE_16(1);
- pkt->mdata.dseg_0_address[0] = (uint32_t)
+ pkt->mdata.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
- pkt->mdata.dseg_0_address[1] = (uint32_t)
+ pkt->mdata.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
- pkt->mdata.dseg_0_length = LE_32(info.TotalByteCount);
+ pkt->mdata.dseg.length = LE_32(info.TotalByteCount);
} else if (info.Operation & MENLO_OP_CHANGE_CONFIG) {
pkt->mdata.parameter_1 =
LE_32(info.Parameters.ap.MenloConfig.ConfigParamID);
pkt->mdata.parameter_2 =
LE_32(info.Parameters.ap.MenloConfig.ConfigParamData0);
@@ -8428,11 +8912,11 @@
ql_free_dma_resource(ha, dma_mem);
kmem_free(dma_mem, sizeof (dma_mem_t));
kmem_free(pkt, sizeof (ql_mbx_iocb_t));
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_suspend_hba
* Suspends all adapter ports.
@@ -8523,11 +9007,11 @@
PEXT_VPORT_ID_CNT ptmp_vp;
int id = 0;
int rval;
char name[MAXPATHLEN];
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/*
* To be backward compatible with older API
* check for the size of old EXT_VPORT_ID_CNT
*/
@@ -8551,11 +9035,12 @@
vha = ha->vp_next;
while (vha != NULL) {
ptmp_vp->VpCnt++;
ptmp_vp->VpId[id] = vha->vp_index;
(void) ddi_pathname(vha->dip, name);
- (void) strcpy((char *)ptmp_vp->vp_path[id], name);
+ (void) strncpy((char *)ptmp_vp->vp_path[id], name,
+ (sizeof (ptmp_vp->vp_path[id]) -1));
ptmp_vp->VpDrvInst[id] = (int32_t)vha->instance;
id++;
vha = vha->vp_next;
}
rval = ddi_copyout((void *)ptmp_vp,
@@ -8565,14 +9050,14 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_VPORT_ID_CNT);
- QL_PRINT_9(CE_CONT, "(%d): done, vport_cnt=%d\n",
+ QL_PRINT_9(ha, "done, vport_cnt=%d\n",
ha->instance, ptmp_vp->VpCnt);
}
-
+ kmem_free(ptmp_vp, sizeof (EXT_VPORT_ID_CNT));
}
/*
* ql_vp_ioctl
* Performs all EXT_CC_VPORT_CMD functions.
@@ -8589,11 +9074,11 @@
* Kernel context.
*/
static void
ql_vp_ioctl(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
- QL_PRINT_9(CE_CONT, "(%d): started, cmd=%d\n", ha->instance,
+ QL_PRINT_9(ha, "started, cmd=%d\n",
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_VF_SC_VPORT_GETINFO:
@@ -8605,11 +9090,11 @@
EL(ha, "failed, Unsupported Subcode=%xh\n",
cmd->SubCode);
break;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_qry_vport
* Performs EXT_VF_SC_VPORT_GETINFO subfunction.
@@ -8628,13 +9113,12 @@
static void
ql_qry_vport(ql_adapter_state_t *vha, EXT_IOCTL *cmd, int mode)
{
ql_adapter_state_t *tmp_vha;
EXT_VPORT_INFO tmp_vport = {0};
- int max_vport;
- QL_PRINT_9(CE_CONT, "(%d): started\n", vha->instance);
+ QL_PRINT_9(vha, "started\n", vha->instance);
if (cmd->ResponseLen < sizeof (EXT_VPORT_INFO)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_VPORT_INFO);
EL(vha, "failed, ResponseLen < EXT_VPORT_INFO, Len=%xh\n",
@@ -8655,14 +9139,12 @@
while (tmp_vha != NULL) {
tmp_vport.used++;
tmp_vha = tmp_vha->vp_next;
}
- max_vport = (CFG_IST(vha, CFG_CTRL_2422) ? MAX_24_VIRTUAL_PORTS :
- MAX_25_VIRTUAL_PORTS);
- if (max_vport > tmp_vport.used) {
- tmp_vport.free = max_vport - tmp_vport.used;
+ if (vha->max_vports > tmp_vport.used) {
+ tmp_vport.free = vha->max_vports - tmp_vport.used;
}
if (ddi_copyout((void *)&tmp_vport,
(void *)(uintptr_t)(cmd->ResponseAdr),
sizeof (EXT_VPORT_INFO), mode) != 0) {
@@ -8669,11 +9151,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(vha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_VPORT_INFO);
- QL_PRINT_9(CE_CONT, "(%d): done\n", vha->instance);
+ QL_PRINT_9(vha, "done\n", vha->instance);
}
}
/*
* ql_access_flash
@@ -8693,12 +9175,21 @@
static void
ql_access_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int rval;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1) &&
+ ql_stall_driver(ha, 0) != QL_SUCCESS) {
+ EL(ha, "ql_stall_driver failed\n");
+ ql_restart_driver(ha);
+ cmd->Status = EXT_STATUS_BUSY;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
switch (cmd->SubCode) {
case EXT_SC_FLASH_READ:
if ((rval = ql_flash_fcode_dump(ha,
(void *)(uintptr_t)(cmd->ResponseAdr),
(size_t)(cmd->ResponseLen), cmd->Reserved1, mode)) != 0) {
@@ -8725,11 +9216,18 @@
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
break;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ /* Resume I/O */
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
+ EL(ha, "isp_abort_needed for restart\n");
+ ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED,
+ DRIVER_STALL);
+ }
+
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_reset_cmd
* Performs all EXT_CC_RESET_FW_OS functions.
@@ -8745,33 +9243,52 @@
* Kernel context.
*/
static void
ql_reset_cmd(ql_adapter_state_t *ha, EXT_IOCTL *cmd)
{
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ uint8_t timer;
+ QL_PRINT_9(ha, "started\n");
+
switch (cmd->SubCode) {
case EXT_SC_RESET_FC_FW:
+ if (CFG_IST(ha, CFG_CTRL_82XX)) {
+ (void) ql_8021_reset_fw(ha);
+ } else {
EL(ha, "isp_abort_needed\n");
ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED, 0);
+ }
+ for (timer = 180; timer; timer--) {
+ ql_awaken_task_daemon(ha, NULL, 0, 0);
+ /* Delay for 1 second. */
+ delay(100);
+ if (!(ha->task_daemon_flags & (ISP_ABORT_NEEDED |
+ ABORT_ISP_ACTIVE | LOOP_RESYNC_NEEDED |
+ LOOP_RESYNC_ACTIVE))) {
break;
+ }
+ }
+ break;
case EXT_SC_RESET_MPI_FW:
- if (!(CFG_IST(ha, CFG_CTRL_81XX))) {
+ if (!(CFG_IST(ha, CFG_CTRL_8081))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
} else {
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags |= DISABLE_NIC_FW_DMP;
+ ADAPTER_STATE_UNLOCK(ha);
+
/* Wait for I/O to stop and daemon to stall. */
if (ql_suspend_hba(ha, 0) != QL_SUCCESS) {
EL(ha, "ql_suspend_hba failed\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
} else if (ql_restart_mpi(ha) != QL_SUCCESS) {
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
} else {
- uint8_t timer;
/*
* While the restart_mpi mailbox cmd may be
* done the MPI is not. Wait at least 6 sec. or
* exit if the loop comes up.
*/
@@ -8783,20 +9300,24 @@
/* Delay for 1 second. */
ql_delay(ha, 1000000);
}
}
ql_restart_hba(ha);
+
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags &= ~DISABLE_NIC_FW_DMP;
+ ADAPTER_STATE_UNLOCK(ha);
}
break;
default:
EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
break;
}
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_dcbx_parameters
* Get DCBX parameters.
@@ -8810,13 +9331,13 @@
ql_get_dcbx_parameters(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
uint8_t *tmp_buf;
int rval;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (!(CFG_IST(ha, CFG_CTRL_8081))) {
+ if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -8848,11 +9369,11 @@
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = EXT_DEF_DCBX_PARAM_BUF_SIZE;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
kmem_free(tmp_buf, EXT_DEF_DCBX_PARAM_BUF_SIZE);
}
@@ -8874,13 +9395,13 @@
static void
ql_qry_cna_port(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_CNA_PORT cna_port = {0};
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (!(CFG_IST(ha, CFG_CTRL_8081))) {
+ if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -8905,11 +9426,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_CNA_PORT);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_adapter_versions
@@ -8932,11 +9453,11 @@
{
uint8_t is_8142, mpi_cap;
uint32_t ver_len, transfer_size;
PEXT_ADAPTERREGIONVERSION padapter_ver = NULL;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* 8142s do not have a EDC PHY firmware. */
mpi_cap = (uint8_t)(ha->mpi_capability_list >> 8);
is_8142 = 0;
@@ -9006,11 +9527,11 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = ver_len;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
kmem_free(padapter_ver, ver_len);
}
@@ -9035,11 +9556,11 @@
int rval;
uint32_t size;
int8_t *tmp_buf;
EXT_MENLO_MANAGE_INFO info;
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
/* Verify the size of request structure. */
if (cmd->RequestLen < sizeof (EXT_MENLO_MANAGE_INFO)) {
/* Return error */
EL(ha, "RequestLen=%d < %d\n", cmd->RequestLen,
@@ -9102,14 +9623,14 @@
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = info.TotalByteCount;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
kmem_free(tmp_buf, size);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fcf_list
* Get FCF list.
@@ -9125,13 +9646,13 @@
uint8_t *tmp_buf;
int rval;
EXT_FCF_LIST fcf_list = {0};
ql_fcf_list_desc_t mb_fcf_list = {0};
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (!(CFG_IST(ha, CFG_CTRL_81XX))) {
+ if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
@@ -9187,11 +9708,11 @@
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = mb_fcf_list.buffer_size;
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
kmem_free(tmp_buf, fcf_list.BufSize);
}
@@ -9209,19 +9730,12 @@
{
int rval;
ql_mbx_data_t mr;
EXT_RESOURCE_CNTS tmp_rc_cnt = {0};
- QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
+ QL_PRINT_9(ha, "started\n");
- if (!(CFG_IST(ha, CFG_CTRL_242581))) {
- EL(ha, "invalid request for HBA\n");
- cmd->Status = EXT_STATUS_INVALID_REQUEST;
- cmd->ResponseLen = 0;
- return;
- }
-
if (cmd->ResponseLen < sizeof (EXT_RESOURCE_CNTS)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_RESOURCE_CNTS);
EL(ha, "failed, ResponseLen < EXT_RESOURCE_CNTS, "
"Len=%xh\n", cmd->ResponseLen);
@@ -9241,12 +9755,16 @@
tmp_rc_cnt.CurTgtXchgCtrlCnt = (uint32_t)mr.mb[2];
tmp_rc_cnt.CurXchgCtrlCnt = (uint32_t)mr.mb[3];
tmp_rc_cnt.OrgXchgCtrlCnt = (uint32_t)mr.mb[6];
tmp_rc_cnt.CurIocbBufCnt = (uint32_t)mr.mb[7];
tmp_rc_cnt.OrgIocbBufCnt = (uint32_t)mr.mb[10];
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
tmp_rc_cnt.NoOfSupVPs = (uint32_t)mr.mb[11];
+ }
+ if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
tmp_rc_cnt.NoOfSupFCFs = (uint32_t)mr.mb[12];
+ }
rval = ddi_copyout((void *)&tmp_rc_cnt,
(void *)(uintptr_t)(cmd->ResponseAdr),
sizeof (EXT_RESOURCE_CNTS), mode);
if (rval != 0) {
@@ -9253,8 +9771,954 @@
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_RESOURCE_CNTS);
- QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
+ QL_PRINT_9(ha, "done\n");
}
+}
+
+/*
+ * ql_get_temperature
+ * Get ASIC temperature data
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: EXT_IOCTL cmd struct pointer.
+ * mode: flags
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_get_temperature(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ ql_mbx_data_t mr;
+ int rval = 0;
+ EXT_BOARD_TEMP board_temp = {0};
+
+ QL_PRINT_9(ha, "started\n");
+
+ if (!(ha->fw_ext_attributes & TEMP_SUPPORT_ISP)) {
+ EL(ha, "invalid request for HBA\n");
+ cmd->Status = EXT_STATUS_INVALID_REQUEST;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ if (cmd->ResponseLen < sizeof (EXT_BOARD_TEMP)) {
+ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+ cmd->DetailStatus = sizeof (EXT_BOARD_TEMP);
+ EL(ha, "failed, ResponseLen < EXT_BOARD_TEMP, "
+ "Len=%xh \n", cmd->ResponseLen);
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ switch (cmd->SubCode) {
+ case EXT_SC_GET_BOARD_TEMP:
+ rval = ql_get_temp(ha, &mr);
+ if (rval != QL_SUCCESS) {
+ /* error */
+ EL(ha, "failed, get_temperature_mbx=%xh\n", rval);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ break;
+ }
+ board_temp.IntTemp = mr.mb[1];
+
+ rval = ddi_copyout((void *)&board_temp,
+ (void *)(uintptr_t)(cmd->ResponseAdr),
+ sizeof (EXT_BOARD_TEMP), mode);
+ if (rval != 0) {
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ EL(ha, "failed, ddi_copyout\n");
+ } else {
+ cmd->ResponseLen = sizeof (EXT_BOARD_TEMP);
+ }
+ break;
+ default:
+ EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ break;
+ }
+
+ QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_dump_cmd
+ * Performs all EXT_CC_DUMP_OS functions.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: Local EXT_IOCTL cmd struct pointer.
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_dump_cmd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ caddr_t dump;
+ uint32_t sdm_valid_dump = 0;
+ int rval = 0;
+
+ QL_PRINT_9(ha, "started\n");
+
+ if (ha->ql_dump_state & QL_DUMP_VALID &&
+ !(ha->ql_dump_state & QL_DUMP_UPLOADED) &&
+ ha->ql_dump_state != NULL) {
+ sdm_valid_dump = 1;
+ } else {
+ EL(ha, "dump does not exist for instance %d (%x, %p)\n",
+ ha->instance, ha->ql_dump_state, ha->ql_dump_ptr);
+ }
+
+ cmd->Status = EXT_STATUS_OK;
+ cmd->DetailStatus = 0;
+
+ switch (cmd->SubCode) {
+ case EXT_SC_DUMP_SIZE:
+ cmd->ResponseLen = 0;
+ if (sdm_valid_dump) {
+ cmd->DetailStatus = ha->risc_dump_size;
+ }
+ break;
+ case EXT_SC_DUMP_READ:
+ if (!sdm_valid_dump) {
+ cmd->Status = EXT_STATUS_INVALID_REQUEST;
+ cmd->ResponseLen = 0;
+ break;
+ }
+
+ if (cmd->ResponseLen < ha->risc_dump_size) {
+ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+ cmd->DetailStatus = ha->risc_dump_size;
+ EL(ha, "failed, ResponseLen < %x, "
+ "Len=%xh\n", ha->risc_dump_size,
+ cmd->ResponseLen);
+ break;
+ }
+
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags |= DISABLE_NIC_FW_DMP;
+ ADAPTER_STATE_UNLOCK(ha);
+
+ QL_DUMP_LOCK(ha);
+
+ dump = kmem_zalloc(ha->risc_dump_size, KM_SLEEP);
+ cmd->ResponseLen = (uint32_t)ql_ascii_fw_dump(ha, dump);
+
+ if ((rval = ddi_copyout((void *)dump,
+ (void *)(uintptr_t)(cmd->ResponseAdr), cmd->ResponseLen,
+ mode)) != 0) {
+ ha->ql_dump_state &= ~QL_DUMP_UPLOADED;
+ EL(ha, "failed, ddi_copyout\n");
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ } else {
+ ha->ql_dump_state |= QL_DUMP_UPLOADED;
+ }
+
+ kmem_free(dump, ha->risc_dump_size);
+
+ QL_DUMP_UNLOCK(ha);
+
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags &= ~DISABLE_NIC_FW_DMP;
+ ADAPTER_STATE_UNLOCK(ha);
+ break;
+ case EXT_SC_DUMP_TRIGGER:
+ cmd->ResponseLen = 0;
+
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags |= DISABLE_NIC_FW_DMP;
+ ADAPTER_STATE_UNLOCK(ha);
+
+ if (sdm_valid_dump) {
+ cmd->Status = EXT_STATUS_INVALID_REQUEST;
+ EL(ha, "Existing dump file needs to be retrieved.\n");
+ } else {
+ rval = ql_dump_firmware(ha);
+
+ if (rval != QL_SUCCESS && rval != QL_DATA_EXISTS) {
+ cmd->Status = EXT_STATUS_ERR;
+ }
+ }
+
+ ADAPTER_STATE_LOCK(ha);
+ ha->flags &= ~DISABLE_NIC_FW_DMP;
+ ADAPTER_STATE_UNLOCK(ha);
+ break;
+ default:
+ EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+ cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+ cmd->ResponseLen = 0;
+ break;
+ }
+
+ QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_serdes_reg
+ * Performs all EXT_CC_SERDES_REG_OP functions.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: EXT_IOCTL cmd struct pointer.
+ * mode: flags
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_serdes_reg(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ ql_mbx_data_t mr = {0};
+ int rval = 0;
+ EXT_SERDES_REG serdes_reg = {0};
+
+ QL_PRINT_9(ha, "started\n");
+
+ /* Check if request valid for HBA */
+ if (!(CFG_IST(ha, CFG_SERDES_SUPPORT))) {
+ EL(ha, "invalid request for HBA\n");
+ cmd->Status = EXT_STATUS_INVALID_REQUEST;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Copy in the request structure. */
+ if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
+ (void *)&serdes_reg, sizeof (EXT_SERDES_REG), mode) != 0) {
+ EL(ha, "failed, ddi_copyin\n");
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ switch (cmd->SubCode) {
+ case EXT_SC_WRITE_SERDES_REG:
+ mr.mb[1] = serdes_reg.addr;
+ mr.mb[2] = LSB(serdes_reg.val);
+ mr.mb[3] = 0;
+ mr.mb[4] = MSB(serdes_reg.val);
+ if ((rval = ql_write_serdes(ha, &mr)) != QL_SUCCESS) {
+ /* error */
+ EL(ha, "failed, write_serdes_mbx=%xh\n", rval);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ break;
+ } else {
+ cmd->Status = EXT_STATUS_OK;
+ }
+ break;
+ case EXT_SC_READ_SERDES_REG:
+ /* Verify the size of response structure. */
+ if (cmd->ResponseLen < sizeof (EXT_SERDES_REG)) {
+ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+ cmd->DetailStatus = sizeof (EXT_SERDES_REG);
+ EL(ha, "failed, ResponseLen < EXT_SERDES_REG, "
+ "Len=%xh \n", cmd->ResponseLen);
+ cmd->ResponseLen = 0;
+ break;
+ }
+ mr.mb[1] = serdes_reg.addr;
+ if ((rval = ql_read_serdes(ha, &mr)) != QL_SUCCESS) {
+ /* error */
+ EL(ha, "failed, read_serdes_mbx=%xh\n", rval);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ break;
+ }
+ serdes_reg.val = CHAR_TO_SHORT(LSB(mr.mb[1]), LSB(mr.mb[2]));
+ /* Copy back the response data */
+ if (ddi_copyout((void *)&serdes_reg,
+ (void *)(uintptr_t)(cmd->ResponseAdr),
+ sizeof (EXT_SERDES_REG), mode) != 0) {
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ EL(ha, "failed, ddi_copyout\n");
+ } else {
+ cmd->Status = EXT_STATUS_OK;
+ cmd->ResponseLen = sizeof (EXT_SERDES_REG);
+ }
+ break;
+ default:
+ /* Subcode not supported. */
+ EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+ cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+ cmd->ResponseLen = 0;
+ break;
+ }
+
+ QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_serdes_reg_ex
+ * Performs all EXT_CC_SERDES_REG_OP_EX functions.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: EXT_IOCTL cmd struct pointer.
+ * mode: flags
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_serdes_reg_ex(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ ql_mbx_data_t mr = {0};
+ int rval = 0;
+ EXT_SERDES_REG_EX serdes_reg_ex = {0};
+
+ QL_PRINT_9(ha, "started\n");
+
+ /* Check if request valid for HBA */
+ if (!(CFG_IST(ha, CFG_SERDES_SUPPORT))) {
+ EL(ha, "invalid request for HBA\n");
+ cmd->Status = EXT_STATUS_INVALID_REQUEST;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Copy in the request structure. */
+ if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
+ (void *)&serdes_reg_ex, sizeof (EXT_SERDES_REG_EX), mode) != 0) {
+ EL(ha, "failed, ddi_copyin\n");
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ switch (cmd->SubCode) {
+ case EXT_SC_WRITE_SERDES_REG:
+ mr.mb[3] = LSW(serdes_reg_ex.addr);
+ mr.mb[4] = MSW(serdes_reg_ex.addr);
+ mr.mb[5] = LSW(serdes_reg_ex.val);
+ mr.mb[6] = MSW(serdes_reg_ex.val);
+ if ((rval = ql_write_serdes(ha, &mr)) != QL_SUCCESS) {
+ /* error */
+ EL(ha, "failed, write_serdes_mbx=%xh\n", rval);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ break;
+ } else {
+ cmd->Status = EXT_STATUS_OK;
+ }
+ break;
+ case EXT_SC_READ_SERDES_REG:
+ /* Verify the size of response structure. */
+ if (cmd->ResponseLen < sizeof (EXT_SERDES_REG_EX)) {
+ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+ cmd->DetailStatus = sizeof (EXT_SERDES_REG_EX);
+ EL(ha, "failed, ResponseLen < EXT_SERDES_REG_EX, "
+ "Len=%xh\n", cmd->ResponseLen);
+ cmd->ResponseLen = 0;
+ break;
+ }
+ mr.mb[3] = LSW(serdes_reg_ex.addr);
+ mr.mb[4] = MSW(serdes_reg_ex.addr);
+ if ((rval = ql_read_serdes(ha, &mr)) != QL_SUCCESS) {
+ /* error */
+ EL(ha, "failed, read_serdes_mbx=%xh\n", rval);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ break;
+ }
+ serdes_reg_ex.val = SHORT_TO_LONG(mr.mb[1], mr.mb[2]);
+ /* Copy back the response data */
+ if (ddi_copyout((void *)&serdes_reg_ex,
+ (void *)(uintptr_t)(cmd->ResponseAdr),
+ sizeof (EXT_SERDES_REG_EX), mode) != 0) {
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ EL(ha, "failed, ddi_copyout\n");
+ } else {
+ cmd->Status = EXT_STATUS_OK;
+ cmd->ResponseLen = sizeof (EXT_SERDES_REG_EX);
+ }
+ break;
+ default:
+ /* Subcode not supported. */
+ EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+ cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+ cmd->ResponseLen = 0;
+ break;
+ }
+
+ QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_els_passthru
+ * IOCTL for extended link service passthru command.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: User space CT arguments pointer.
+ * mode: flags.
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_els_passthru(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ ql_mbx_iocb_t *pkt;
+ dma_mem_t *dma_mem;
+ caddr_t bp, pld;
+ uint32_t pkt_size, pld_byte_cnt, cmd_size, *long_ptr;
+ EXT_ELS_PT_REQ *pt_req;
+ boolean_t local_hba = B_FALSE;
+ ql_tgt_t *tq = NULL;
+ port_id_t tmp_fcid;
+ int rval;
+ uint16_t comp_status;
+
+ QL_PRINT_9(ha, "started\n");
+
+ if (DRIVER_SUSPENDED(ha)) {
+ EL(ha, "failed, LOOP_NOT_READY\n");
+ cmd->Status = EXT_STATUS_BUSY;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ if (cmd->RequestLen < sizeof (EXT_ELS_PT_REQ)) {
+ /* parameter error */
+ EL(ha, "failed, RequestLen < EXT_ELS_PT_REQ, Len=%xh\n",
+ cmd->RequestLen);
+ cmd->Status = EXT_STATUS_INVALID_PARAM;
+ cmd->DetailStatus = EXT_DSTATUS_REQUEST_LEN;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Allocate memory for command. */
+ bp = kmem_zalloc(cmd->RequestLen, KM_SLEEP);
+
+ if (ddi_copyin((void*)(uintptr_t)cmd->RequestAdr,
+ bp, cmd->RequestLen, mode) != 0) {
+ EL(ha, "failed, ddi_copyin\n");
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+ pt_req = (EXT_ELS_PT_REQ *)bp;
+
+ QL_PRINT_9(ha, "EXT_ELS_PT_REQ\n");
+ QL_DUMP_9((uint8_t *)pt_req, 8, sizeof (EXT_ELS_PT_REQ));
+
+ /* Find loop ID of the device */
+ if (pt_req->ValidMask & EXT_DEF_WWPN_VALID) {
+ if (bcmp(ha->loginparams.nport_ww_name.raw_wwn, pt_req->WWPN,
+ EXT_DEF_WWN_NAME_SIZE) == 0) {
+ local_hba = B_TRUE;
+ } else {
+ tq = ql_find_port(ha, pt_req->WWPN, QLNT_PORT);
+ }
+ } else if (pt_req->ValidMask & EXT_DEF_PID_VALID) {
+ /*
+ * Copy caller's d_id to tmp space.
+ */
+ bcopy(&pt_req->Id[1], tmp_fcid.r.d_id,
+ EXT_DEF_PORTID_SIZE_ACTUAL);
+ BIG_ENDIAN_24(&tmp_fcid.r.d_id[0]);
+
+ if (bcmp((void *)&ha->d_id, (void *)tmp_fcid.r.d_id,
+ EXT_DEF_PORTID_SIZE_ACTUAL) == 0) {
+ local_hba = B_TRUE;
+ } else {
+ tq = ql_find_port(ha, (uint8_t *)tmp_fcid.r.d_id,
+ QLNT_PID);
+ }
+ } else if (pt_req->ValidMask & EXT_DEF_WWNN_VALID) {
+ if (bcmp(ha->loginparams.node_ww_name.raw_wwn, pt_req->WWNN,
+ EXT_DEF_WWN_NAME_SIZE) == 0) {
+ local_hba = B_TRUE;
+ } else {
+ tq = ql_find_port(ha, pt_req->WWNN, QLNT_NODE);
+ }
+ }
+
+ if (local_hba == B_TRUE) {
+ EL(ha, "failed, els to adapter\n");
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ if (tq == NULL) {
+ /* no matching device */
+ EL(ha, "failed, device not found\n");
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
+ cmd->DetailStatus = EXT_DSTATUS_TARGET;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Allocate a DMA Memory Descriptor */
+ dma_mem = (dma_mem_t *)kmem_zalloc(sizeof (dma_mem_t), KM_SLEEP);
+ if (dma_mem == NULL) {
+ EL(ha, "failed, kmem_zalloc\n");
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_NO_MEMORY;
+ cmd->ResponseLen = 0;
+ return;
+ }
+ /* Determine maximum buffer size. */
+ cmd_size = cmd->RequestLen - sizeof (EXT_ELS_PT_REQ);
+ pld_byte_cnt = cmd_size < cmd->ResponseLen ? cmd->ResponseLen :
+ cmd_size;
+ pld = (caddr_t)(bp + sizeof (EXT_ELS_PT_REQ));
+
+ /* Allocate command block. */
+ pkt_size = (uint32_t)(sizeof (ql_mbx_iocb_t));
+ pkt = kmem_zalloc(pkt_size, KM_SLEEP);
+ if (pkt == NULL) {
+ EL(ha, "failed, kmem_zalloc\n");
+ kmem_free(dma_mem, sizeof (dma_mem_t));
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_NO_MEMORY;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Get DMA memory for the payload */
+ if (ql_get_dma_mem(ha, dma_mem, pld_byte_cnt, LITTLE_ENDIAN_DMA,
+ QL_DMA_RING_ALIGN) != QL_SUCCESS) {
+ cmn_err(CE_WARN, "%sDMA memory alloc failed", QL_NAME);
+ kmem_free(pkt, pkt_size);
+ kmem_free(dma_mem, sizeof (dma_mem_t));
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Copy out going payload data to IOCB DMA buffer. */
+ ddi_rep_put8(dma_mem->acc_handle, (uint8_t *)pld,
+ (uint8_t *)dma_mem->bp, cmd_size, DDI_DEV_AUTOINCR);
+
+ /* Sync IOCB DMA buffer. */
+ (void) ddi_dma_sync(dma_mem->dma_handle, 0, cmd_size,
+ DDI_DMA_SYNC_FORDEV);
+
+ /*
+ * Setup IOCB
+ */
+ if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
+ pkt->els.entry_type = ELS_PASSTHRU_TYPE;
+ pkt->els.entry_count = 1;
+
+ /* Set loop ID */
+ pkt->els.n_port_hdl = tq->loop_id;
+
+ /* Set cmd/response data segment counts. */
+ pkt->els.xmt_dseg_count = LE_16(1);
+ pkt->els.vp_index = ha->vp_index;
+ pkt->els.rcv_dseg_count = LE_16(1);
+
+ pkt->els.els_cmd_opcode = pld[0];
+
+ pkt->els.d_id_7_0 = tq->d_id.b.al_pa;
+ pkt->els.d_id_15_8 = tq->d_id.b.area;
+ pkt->els.d_id_23_16 = tq->d_id.b.domain;
+
+ pkt->els.s_id_7_0 = ha->d_id.b.al_pa;
+ pkt->els.s_id_15_8 = ha->d_id.b.area;
+ pkt->els.s_id_23_16 = ha->d_id.b.domain;
+
+ /* Load rsp byte count. */
+ pkt->els.rcv_payld_data_bcnt = LE_32(cmd->ResponseLen);
+
+ /* Load cmd byte count. */
+ pkt->els.xmt_payld_data_bcnt = LE_32(cmd_size);
+
+ long_ptr = (uint32_t *)&pkt->els.dseg;
+
+ /* Load MS command entry data segments. */
+ *long_ptr++ = (uint32_t)
+ LE_32(LSD(dma_mem->cookie.dmac_laddress));
+ *long_ptr++ = (uint32_t)
+ LE_32(MSD(dma_mem->cookie.dmac_laddress));
+ *long_ptr++ = LE_32(cmd_size);
+
+ /* Load MS response entry data segments. */
+ *long_ptr++ = (uint32_t)
+ LE_32(LSD(dma_mem->cookie.dmac_laddress));
+ *long_ptr++ = (uint32_t)
+ LE_32(MSD(dma_mem->cookie.dmac_laddress));
+ *long_ptr = LE_32(cmd->ResponseLen);
+
+ rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
+ sizeof (ql_mbx_iocb_t));
+
+ comp_status = (uint16_t)LE_16(pkt->sts24.comp_status);
+ if (rval == QL_SUCCESS && comp_status == CS_DATA_UNDERRUN) {
+ comp_status = CS_COMPLETE;
+ }
+ if (rval != QL_SUCCESS ||
+ (pkt->sts24.entry_status & 0x3c) != 0 ||
+ comp_status != CS_COMPLETE) {
+ EL(ha, "failed, I/O timeout, cs=%xh, es=%xh, "
+ "rval=%xh\n",
+ comp_status, pkt->sts24.entry_status, rval);
+ ql_free_dma_resource(ha, dma_mem);
+ kmem_free(pkt, pkt_size);
+ kmem_free(dma_mem, sizeof (dma_mem_t));
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+ } else {
+ pkt->ms.entry_type = MS_TYPE;
+ pkt->ms.entry_count = 1;
+
+ /* Set loop ID */
+ if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
+ pkt->ms.loop_id_l = LSB(tq->loop_id);
+ pkt->ms.loop_id_h = MSB(tq->loop_id);
+ } else {
+ pkt->ms.loop_id_h = LSB(tq->loop_id);
+ }
+
+ pkt->ms.control_flags_h = CF_ELS_PASSTHROUGH;
+
+ /* Set ISP command timeout. */
+ pkt->ms.timeout = LE_16(120);
+
+ /* Set data segment counts. */
+ pkt->ms.cmd_dseg_count_l = 1;
+ pkt->ms.total_dseg_count = LE_16(2);
+
+ /* Response total byte count. */
+ pkt->ms.resp_byte_count = LE_32(cmd->ResponseLen);
+ pkt->ms.dseg[1].length = LE_32(cmd->ResponseLen);
+
+ /* Command total byte count. */
+ pkt->ms.cmd_byte_count = LE_32(cmd_size);
+ pkt->ms.dseg[0].length = LE_32(cmd_size);
+
+ /* Load command/response data segments. */
+ pkt->ms.dseg[0].address[0] = (uint32_t)
+ LE_32(LSD(dma_mem->cookie.dmac_laddress));
+ pkt->ms.dseg[0].address[1] = (uint32_t)
+ LE_32(MSD(dma_mem->cookie.dmac_laddress));
+ pkt->ms.dseg[1].address[0] = (uint32_t)
+ LE_32(LSD(dma_mem->cookie.dmac_laddress));
+ pkt->ms.dseg[1].address[1] = (uint32_t)
+ LE_32(MSD(dma_mem->cookie.dmac_laddress));
+
+ rval = ql_issue_mbx_iocb(ha, (caddr_t)pkt,
+ sizeof (ql_mbx_iocb_t));
+
+ comp_status = (uint16_t)LE_16(pkt->sts.comp_status);
+ if (rval == QL_SUCCESS && comp_status == CS_DATA_UNDERRUN) {
+ comp_status = CS_COMPLETE;
+ }
+ if (rval != QL_SUCCESS ||
+ (pkt->sts.entry_status & 0x7e) != 0 ||
+ comp_status != CS_COMPLETE) {
+ EL(ha, "failed, I/O timeout, cs=%xh, es=%xh, "
+ "rval=%xh\n",
+ comp_status, pkt->sts.entry_status, rval);
+ ql_free_dma_resource(ha, dma_mem);
+ kmem_free(pkt, pkt_size);
+ kmem_free(dma_mem, sizeof (dma_mem_t));
+ kmem_free(bp, cmd->RequestLen);
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+ }
+
+ /* Sync payload DMA buffer. */
+ (void) ddi_dma_sync(dma_mem->dma_handle, 0, cmd->ResponseLen,
+ DDI_DMA_SYNC_FORKERNEL);
+
+ if (ql_send_buffer_data(dma_mem->bp,
+ (caddr_t)(uintptr_t)cmd->ResponseAdr,
+ cmd->ResponseLen, mode) != cmd->ResponseLen) {
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ EL(ha, "failed, ddi_copyout\n");
+ } else {
+ QL_PRINT_9(ha, "els_rsp\n");
+ QL_DUMP_9(pld, 8, cmd->ResponseLen);
+ cmd->Status = EXT_STATUS_OK;
+ QL_PRINT_9(ha, "done\n");
+ }
+
+ ql_free_dma_resource(ha, dma_mem);
+ kmem_free(pkt, pkt_size);
+ kmem_free(dma_mem, sizeof (dma_mem_t));
+ kmem_free(bp, cmd->RequestLen);
+}
+
+/*
+ * ql_flash_update_caps
+ * IOCTL for flash update capabilities command.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: User space CT arguments pointer.
+ * mode: flags.
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_flash_update_caps(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ int rval;
+ uint64_t cb;
+ EXT_FLASH_UPDATE_CAPS caps = {0};
+
+ QL_PRINT_9(ha, "started\n");
+
+ cb = LONG_TO_LLONG(ha->fw_attributes, ha->fw_ext_attributes);
+
+ switch (cmd->SubCode) {
+ case EXT_SC_GET_FLASH_UPDATE_CAPS:
+ if (cmd->ResponseLen < sizeof (EXT_FLASH_UPDATE_CAPS)) {
+ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+ cmd->DetailStatus = sizeof (EXT_FLASH_UPDATE_CAPS);
+ EL(ha, "failed, ResponseLen < 0x%x, Len=0x%x\n",
+ sizeof (EXT_FLASH_UPDATE_CAPS), cmd->ResponseLen);
+ cmd->ResponseLen = 0;
+ return;
+ }
+ caps.Capabilities = cb;
+ caps.OutageDuration = 300; /* seconds */
+
+ rval = ddi_copyout((void *)&caps,
+ (void *)(uintptr_t)(cmd->ResponseAdr),
+ sizeof (EXT_FLASH_UPDATE_CAPS), mode);
+ if (rval != 0) {
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ EL(ha, "failed, ddi_copyout\n");
+ } else {
+ cmd->ResponseLen = sizeof (EXT_FLASH_UPDATE_CAPS);
+ }
+ break;
+ case EXT_SC_SET_FLASH_UPDATE_CAPS:
+ if (cmd->RequestLen < sizeof (EXT_FLASH_UPDATE_CAPS)) {
+ /* parameter error */
+ EL(ha, "failed, RequestLen < EXT_FLASH_UPDATE_CAPS, "
+ "Len=%xh\n", cmd->RequestLen);
+ cmd->Status = EXT_STATUS_INVALID_PARAM;
+ cmd->DetailStatus = EXT_DSTATUS_REQUEST_LEN;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ /* Copy in the request structure. */
+ if (ddi_copyin((void *)(uintptr_t)cmd->RequestAdr,
+ (void *)&caps, sizeof (EXT_FLASH_UPDATE_CAPS), mode) != 0) {
+ EL(ha, "failed, ddi_copyin\n");
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ if (cb != caps.Capabilities || caps.OutageDuration < 300) {
+ cmd->Status = EXT_STATUS_ERR;
+ cmd->ResponseLen = 0;
+ }
+ break;
+ default:
+ /* Subcode not supported. */
+ EL(ha, "unknown subcode=%xh\n", cmd->SubCode);
+ cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
+ cmd->ResponseLen = 0;
+ break;
+ }
+
+ QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_get_bbcr_data
+ * IOCTL for get buffer to buffer credits command.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: User space CT arguments pointer.
+ * mode: flags.
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_get_bbcr_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ int rval;
+ ql_mbx_data_t mr;
+ EXT_BBCR_DATA bb = {0};
+
+ QL_PRINT_9(ha, "started\n");
+
+ if (cmd->ResponseLen < sizeof (EXT_BBCR_DATA)) {
+ cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
+ cmd->DetailStatus = sizeof (EXT_BBCR_DATA);
+ EL(ha, "failed, ResponseLen < 0x%x, Len=0x%x\n",
+ sizeof (EXT_BBCR_DATA), cmd->ResponseLen);
+ cmd->ResponseLen = 0;
+ return;
+ }
+
+ if (!(CFG_IST(ha, CFG_BBCR_SUPPORT))) {
+ EL(ha, "invalid request for HBA\n");
+ cmd->Status = EXT_STATUS_INVALID_REQUEST;
+ cmd->ResponseLen = 0;
+ return;
+ }
+ if (ha->task_daemon_flags & LOOP_DOWN) {
+ rval = ql_get_adapter_id(ha, &mr);
+ ha->bbcr_initial = LSB(mr.mb[15]);
+ ha->bbcr_runtime = MSB(mr.mb[15]);
+ bb.ConfiguredBBSCN = ha->bbcr_initial & BBCR_INITIAL_MASK;
+ bb.NegotiatedBBSCN = ha->bbcr_runtime & BBCR_RUNTIME_MASK;
+ bb.Status = EXT_DEF_BBCR_STATUS_UNKNOWN;
+ bb.State = EXT_DEF_BBCR_STATE_OFFLINE;
+ if (rval == 0x4005) {
+ bb.mbx1 = mr.mb[1];
+ }
+ } else {
+ bb.ConfiguredBBSCN = ha->bbcr_initial & BBCR_INITIAL_MASK;
+ bb.NegotiatedBBSCN = ha->bbcr_runtime & BBCR_RUNTIME_MASK;
+
+ if (bb.ConfiguredBBSCN) {
+ bb.Status = EXT_DEF_BBCR_STATUS_ENABLED;
+ if (bb.NegotiatedBBSCN &&
+ !(ha->bbcr_runtime & BBCR_RUNTIME_REJECT)) {
+ bb.State = EXT_DEF_BBCR_STATE_ONLINE;
+ } else {
+ bb.State = EXT_DEF_BBCR_STATE_OFFLINE;
+ if (ha->bbcr_runtime & BBCR_RUNTIME_REJECT) {
+ bb.OfflineReasonCode =
+ EXT_DEF_BBCR_REASON_LOGIN_REJECT;
+ } else {
+ bb.OfflineReasonCode =
+ EXT_DEF_BBCR_REASON_SWITCH;
+ }
+ }
+ } else {
+ bb.Status = EXT_DEF_BBCR_STATUS_DISABLED;
+ }
+ }
+
+ rval = ddi_copyout((void *)&bb, (void *)(uintptr_t)(cmd->ResponseAdr),
+ sizeof (EXT_BBCR_DATA), mode);
+ if (rval != 0) {
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ EL(ha, "failed, ddi_copyout\n");
+ } else {
+ cmd->ResponseLen = sizeof (EXT_BBCR_DATA);
+ }
+
+ QL_PRINT_9(ha, "done\n");
+}
+
+/*
+ * ql_get_priv_stats
+ * Performs EXT_SC_GET_PRIV_STATS subcommand. of EXT_CC_GET_DATA.
+ *
+ * Input:
+ * ha: adapter state pointer.
+ * cmd: Local EXT_IOCTL cmd struct pointer.
+ * mode: flags.
+ *
+ * Returns:
+ * None, request status indicated in cmd->Status.
+ *
+ * Context:
+ * Kernel context.
+ */
+static void
+ql_get_priv_stats(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
+{
+ uint8_t *ls;
+ int rval;
+ int retry = 10;
+
+ QL_PRINT_9(ha, "started\n");
+
+ while (ha->task_daemon_flags & (DRIVER_STALL | ABORT_ISP_ACTIVE |
+ LOOP_RESYNC_ACTIVE)) {
+ ql_delay(ha, 10000000); /* 10 second delay */
+
+ retry--;
+
+ if (retry == 0) { /* effectively 100 seconds */
+ EL(ha, "failed, LOOP_NOT_READY\n");
+ cmd->Status = EXT_STATUS_BUSY;
+ cmd->ResponseLen = 0;
+ return;
+ }
+ }
+
+ /* Allocate memory for command. */
+ ls = kmem_zalloc(cmd->ResponseLen, KM_SLEEP);
+
+ /*
+ * I think these are supposed to be port statistics
+ * the loop ID or port ID should be in cmd->Instance.
+ */
+ rval = ql_get_status_counts(ha,
+ ha->task_daemon_flags & LOOP_DOWN ? 0xFF : ha->loop_id,
+ cmd->ResponseLen, (caddr_t)ls, 0);
+ if (rval != QL_SUCCESS) {
+ EL(ha, "failed, get_link_status=%xh, id=%xh\n", rval,
+ ha->loop_id);
+ cmd->Status = EXT_STATUS_MAILBOX;
+ cmd->DetailStatus = rval;
+ cmd->ResponseLen = 0;
+ } else {
+ rval = ddi_copyout((void *)&ls,
+ (void *)(uintptr_t)cmd->ResponseAdr, cmd->ResponseLen,
+ mode);
+ if (rval != 0) {
+ EL(ha, "failed, ddi_copyout\n");
+ cmd->Status = EXT_STATUS_COPY_ERR;
+ cmd->ResponseLen = 0;
+ }
+ }
+
+ kmem_free(ls, cmd->ResponseLen);
+
+ QL_PRINT_9(ha, "done\n");
}