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,45 ****
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
! /* Copyright 2010 QLogic Corporation */
/*
! * Copyright (c) 2008, 2010, 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"
/*
* ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file.
*
* ***********************************************************************
* * **
* * NOTICE **
! * * COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION **
* * ALL RIGHTS RESERVED **
* * **
* ***********************************************************************
*
*/
--- 17,45 ----
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
! /* Copyright 2015 QLogic Corporation */
/*
! * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
*/
! #pragma ident "Copyright 2015 QLogic Corporation; ql_xioctl.c"
/*
* ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file.
*
* ***********************************************************************
* * **
* * NOTICE **
! * * COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION **
* * ALL RIGHTS RESERVED **
* * **
* ***********************************************************************
*
*/
*** 49,58 ****
--- 49,59 ----
#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,104 ****
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);
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);
--- 95,105 ----
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 *,
! 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,125 ****
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 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 *);
--- 115,126 ----
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 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,160 ****
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);
/* ******************************************************************** */
/* External IOCTL support. */
/* ******************************************************************** */
--- 151,168 ----
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 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,187 ****
int
ql_alloc_xioctl_resource(ql_adapter_state_t *ha)
{
ql_xioctl_t *xp;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
if (ha->xioctl != NULL) {
! QL_PRINT_9(CE_CONT, "(%d): already allocated done\n",
ha->instance);
return (0);
}
xp = kmem_zalloc(sizeof (ql_xioctl_t), KM_SLEEP);
--- 182,195 ----
int
ql_alloc_xioctl_resource(ql_adapter_state_t *ha)
{
ql_xioctl_t *xp;
! QL_PRINT_9(ha, "started\n");
if (ha->xioctl != NULL) {
! QL_PRINT_9(ha, "already allocated done\n",
ha->instance);
return (0);
}
xp = kmem_zalloc(sizeof (ql_xioctl_t), KM_SLEEP);
*** 198,208 ****
EL(ha, "failed, kmem_zalloc-2\n");
ql_free_xioctl_resource(ha);
return (ENOMEM);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (0);
}
/*
--- 206,216 ----
EL(ha, "failed, kmem_zalloc-2\n");
ql_free_xioctl_resource(ha);
return (ENOMEM);
}
! QL_PRINT_9(ha, "done\n");
return (0);
}
/*
*** 218,231 ****
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);
if (xp == NULL) {
! QL_PRINT_9(CE_CONT, "(%d): already freed\n", ha->instance);
return;
}
if (xp->aen_tracking_queue != NULL) {
kmem_free(xp->aen_tracking_queue, EXT_DEF_MAX_AEN_QUEUE *
--- 226,239 ----
void
ql_free_xioctl_resource(ql_adapter_state_t *ha)
{
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(ha, "started\n");
if (xp == NULL) {
! 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,244 ****
}
kmem_free(xp, sizeof (ql_xioctl_t));
ha->xioctl = NULL;
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_xioctl
* External IOCTL processing.
--- 242,252 ----
}
kmem_free(xp, sizeof (ql_xioctl_t));
ha->xioctl = NULL;
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_xioctl
* External IOCTL processing.
*** 264,277 ****
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);
if (ha->xioctl == NULL) {
! QL_PRINT_9(CE_CONT, "(%d): no context\n", ha->instance);
return (ENXIO);
}
switch (cmd) {
case EXT_CC_QUERY:
--- 272,285 ----
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(ha, "started, cmd=%d\n", cmd);
if (ha->xioctl == NULL) {
! QL_PRINT_9(ha, "no context\n");
return (ENXIO);
}
switch (cmd) {
case EXT_CC_QUERY:
*** 304,322 ****
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:
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);
return (rval);
}
/*
--- 312,338 ----
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(ha, "done\n");
return (rval);
}
/*
*** 346,356 ****
{
EXT_IOCTL *cmd;
int rval;
ql_adapter_state_t *vha;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* Copy argument structure (EXT_IOCTL) from application land. */
if ((rval = ql_sdm_setup(ha, &cmd, arg, mode,
ql_validate_signature)) != 0) {
/*
--- 362,372 ----
{
EXT_IOCTL *cmd;
int rval;
ql_adapter_state_t *vha;
! 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,377 ****
* 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)) {
EL(ha, "Invalid HbaSelect vp index: %xh\n",
cmd->HbaSelect);
cmd->Status = EXT_STATUS_INVALID_VPINDEX;
cmd->ResponseLen = 0;
return (EFAULT);
--- 382,392 ----
* 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 > 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,401 ****
/*
* 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) {
cmd->Status = EXT_STATUS_INVALID_VPINDEX;
cmd->ResponseLen = 0;
return (EFAULT);
}
}
--- 406,416 ----
/*
* 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 || !(vha->flags & VP_ENABLED)) {
cmd->Status = EXT_STATUS_INVALID_VPINDEX;
cmd->ResponseLen = 0;
return (EFAULT);
}
}
*** 403,417 ****
/*
* If driver is suspended, stalled, or powered down rtn BUSY
*/
if (ha->flags & ADAPTER_SUSPENDED ||
! ha->task_daemon_flags & DRIVER_STALL ||
ha->power_level != PM_LEVEL_D0) {
EL(ha, " %s\n", ha->flags & ADAPTER_SUSPENDED ?
"driver suspended" :
! (ha->task_daemon_flags & DRIVER_STALL ? "driver stalled" :
"FCA powered down"));
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
rval = EBUSY;
--- 418,435 ----
/*
* If driver is suspended, stalled, or powered down rtn BUSY
*/
if (ha->flags & ADAPTER_SUSPENDED ||
! (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 | 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,532 ****
--- 541,571 ----
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,548 ****
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);
return (0);
}
/*
--- 577,587 ----
if (ql_sdm_return(ha, cmd, arg, mode) == -1) {
EL(ha, "failed, sdm_return\n");
return (EFAULT);
}
! QL_PRINT_9(ha, "done\n");
return (0);
}
/*
*** 570,580 ****
int mode, boolean_t (*val_sig)(EXT_IOCTL *))
{
int rval;
EXT_IOCTL *cmd;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* Allocate local memory for EXT_IOCTL. */
*cmd_struct = NULL;
cmd = (EXT_IOCTL *)kmem_zalloc(sizeof (EXT_IOCTL), KM_SLEEP);
if (cmd == NULL) {
--- 609,619 ----
int mode, boolean_t (*val_sig)(EXT_IOCTL *))
{
int rval;
EXT_IOCTL *cmd;
! 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,612 ****
rval = EINVAL;
}
}
if (rval == 0) {
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
*cmd_struct = cmd;
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = 0;
} else {
kmem_free((void *)cmd, sizeof (EXT_IOCTL));
--- 641,651 ----
rval = EINVAL;
}
}
if (rval == 0) {
! 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,648 ****
* 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");
return (B_FALSE);
}
return (B_TRUE);
}
--- 677,687 ----
* 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(NULL, "failed,\n");
return (B_FALSE);
}
return (B_TRUE);
}
*** 670,680 ****
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);
rval |= ddi_copyout((void *)&cmd->ResponseLen,
(void *)&(((EXT_IOCTL*)arg)->ResponseLen), sizeof (uint32_t),
mode);
--- 709,719 ----
static int
ql_sdm_return(ql_adapter_state_t *ha, EXT_IOCTL *cmd, void *arg, int mode)
{
int rval = 0;
! QL_PRINT_9(ha, "started\n");
rval |= ddi_copyout((void *)&cmd->ResponseLen,
(void *)&(((EXT_IOCTL*)arg)->ResponseLen), sizeof (uint32_t),
mode);
*** 691,701 ****
/* Some copyout operation failed */
EL(ha, "failed, ddi_copyout\n");
return (EFAULT);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (0);
}
/*
--- 730,740 ----
/* Some copyout operation failed */
EL(ha, "failed, ddi_copyout\n");
return (EFAULT);
}
! QL_PRINT_9(ha, "done\n");
return (0);
}
/*
*** 714,724 ****
* 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,
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_SC_QUERY_HBA_NODE:
--- 753,763 ----
* Kernel context.
*/
static void
ql_query(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! 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,765 ****
EL(ha, "failed, Unsupported Subcode=%xh\n",
cmd->SubCode);
break;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_qry_hba_node
* Performs EXT_SC_QUERY_HBA_NODE subfunction.
--- 794,804 ----
EL(ha, "failed, Unsupported Subcode=%xh\n",
cmd->SubCode);
break;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_qry_hba_node
* Performs EXT_SC_QUERY_HBA_NODE subfunction.
*** 780,790 ****
{
EXT_HBA_NODE tmp_node = {0};
uint_t len;
caddr_t bufp;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
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, "
--- 819,829 ----
{
EXT_HBA_NODE tmp_node = {0};
uint_t len;
caddr_t bufp;
! 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,827 ****
} 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]);
if (tmpptr == NULL) {
EL(ha, "Unable to insert fpga version str\n");
} else {
(void) sprintf(tmpptr, "%d.%d",
((w & 0xf0) >> 4), (w & 0x0f));
--- 856,866 ----
} 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]);
if (tmpptr == NULL) {
EL(ha, "Unable to insert fpga version str\n");
} else {
(void) sprintf(tmpptr, "%d.%d",
((w & 0xf0) >> 4), (w & 0x0f));
*** 832,842 ****
(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) {
switch (ha->fw_attributes) {
case FWATTRIB_EF:
(void) strcat((char *)(tmp_node.FWVersion), " EF");
break;
case FWATTRIB_TP:
--- 871,881 ----
(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_ISP_FW_TYPE_1)) {
switch (ha->fw_attributes) {
case FWATTRIB_EF:
(void) strcat((char *)(tmp_node.FWVersion), " EF");
break;
case FWATTRIB_TP:
*** 877,895 ****
(void) sprintf((char *)tmp_node.OptRomVersion, "0");
}
tmp_node.PortCount = 1;
tmp_node.InterfaceType = EXT_DEF_FC_INTF_TYPE;
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_qry_hba_port
--- 916,940 ----
(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(ha, "done\n");
}
}
/*
* ql_qry_hba_port
*** 909,924 ****
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;
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);
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",
--- 954,969 ----
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 = {0};
EXT_HBA_PORT tmp_port = {0};
int rval;
uint16_t port_cnt, tgt_cnt, index;
! 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,983 ****
--- 1019,1034 ----
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,1049 ****
default:
EL(ha, "sfp_stat: %xh\n", ha->sfp_stat);
break;
}
! } else if (CFG_IST(ha, CFG_CTRL_8081)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_10GBIT;
! } else if (CFG_IST(ha, CFG_CTRL_2422)) {
tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_4GBIT |
EXT_DEF_PORTSPEED_2GBIT | EXT_DEF_PORTSPEED_1GBIT);
! } else if (CFG_IST(ha, CFG_CTRL_2300)) {
tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_2GBIT |
EXT_DEF_PORTSPEED_1GBIT);
! } else if (CFG_IST(ha, CFG_CTRL_6322)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT;
! } else if (CFG_IST(ha, CFG_CTRL_2200)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_1GBIT;
} else {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_UNKNOWN;
EL(ha, "unknown HBA type: %xh\n", ha->device_id);
}
tmp_port.LinkState2 = LSB(ha->sfp_stat);
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)) {
continue;
}
port_cnt++;
if ((tq->flags & TQF_INITIATOR_DEVICE) == 0) {
tgt_cnt++;
}
}
--- 1062,1122 ----
default:
EL(ha, "sfp_stat: %xh\n", ha->sfp_stat);
break;
}
! } else if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_10GBIT;
! } 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_23XX)) {
tmp_port.PortSupportedSpeed = (EXT_DEF_PORTSPEED_2GBIT |
EXT_DEF_PORTSPEED_1GBIT);
! } else if (CFG_IST(ha, CFG_CTRL_63XX)) {
tmp_port.PortSupportedSpeed = EXT_DEF_PORTSPEED_2GBIT;
! } 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) ||
! 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,1071 ****
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",
ha->instance, port_cnt, tgt_cnt);
}
}
/*
--- 1134,1144 ----
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(ha, "done, ports=%d, targets=%d\n",
ha->instance, port_cnt, tgt_cnt);
}
}
/*
*** 1092,1102 ****
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);
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",
--- 1165,1175 ----
ql_link_t *link;
ql_tgt_t *tq;
uint16_t index;
uint16_t inst = 0;
! 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,1121 ****
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)) {
continue;
}
if (inst != cmd->Instance) {
inst++;
continue;
}
--- 1182,1201 ----
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) ||
! 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,1179 ****
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_qry_disc_tgt
--- 1249,1259 ----
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(ha, "done\n");
}
}
/*
* ql_qry_disc_tgt
*** 1199,1209 ****
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,
cmd->Instance);
if (cmd->ResponseLen < sizeof (EXT_DISC_TARGET)) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = sizeof (EXT_DISC_TARGET);
--- 1279,1289 ----
ql_link_t *link;
ql_tgt_t *tq;
uint16_t index;
uint16_t inst = 0;
! 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,1229 ****
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) {
continue;
}
if (inst != cmd->Instance) {
inst++;
continue;
--- 1299,1310 ----
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->d_id.b24 == FS_MANAGEMENT_SERVER) {
continue;
}
if (inst != cmd->Instance) {
inst++;
continue;
*** 1281,1291 ****
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_qry_fw
--- 1362,1372 ----
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(ha, "done\n");
}
}
/*
* ql_qry_fw
*** 1305,1315 ****
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);
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",
--- 1386,1396 ----
static void
ql_qry_fw(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_FW fw_info = {0};
! 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,1341 ****
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_qry_chip
--- 1412,1422 ----
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
return;
} else {
cmd->ResponseLen = sizeof (EXT_FW);
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_qry_chip
*** 1354,1365 ****
*/
static void
ql_qry_chip(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_CHIP chip = {0};
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
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",
--- 1435,1447 ----
*/
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(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,1397 ****
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;
! }
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_qry_driver
--- 1457,1484 ----
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;
! 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(ha, "done\n");
}
}
/*
* ql_qry_driver
*** 1411,1421 ****
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);
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",
--- 1498,1508 ----
static void
ql_qry_driver(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_DRIVER qd = {0};
! 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,1435 ****
}
(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)) ?
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;
--- 1512,1522 ----
}
(void) strcpy((void *)&qd.Version[0], QL_VERSION);
qd.NumOfBus = 1; /* Fixed for Solaris */
qd.TargetsPerBus = (uint16_t)
! (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,1448 ****
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_fcct
--- 1525,1535 ----
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (EXT_DRIVER);
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_fcct
*** 1471,1484 ****
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);
/* Get CT argument structure. */
! if ((ha->topology & QL_SNS_CONNECTION) == 0) {
EL(ha, "failed, No switch\n");
cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
cmd->ResponseLen = 0;
return;
}
--- 1558,1571 ----
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(ha, "started\n");
/* Get CT argument structure. */
! 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,1503 ****
/* 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) ?
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");
--- 1580,1590 ----
/* 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_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,1517 ****
} else {
xp->flags |= QL_MGMT_SERVER_LOGIN;
}
}
! QL_PRINT_9(CE_CONT, "(%d): cmd\n", ha->instance);
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) {
--- 1594,1604 ----
} else {
xp->flags |= QL_MGMT_SERVER_LOGIN;
}
}
! 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,1560 ****
}
/* 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);
kmem_free(pkt, pkt_size);
kmem_free(dma_mem, sizeof (dma_mem_t));
cmd->Status = EXT_STATUS_MS_NO_RESPONSE;
cmd->ResponseLen = 0;
return;
--- 1636,1647 ----
}
/* 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, "%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,1580 ****
/*
* Setup IOCB
*/
ct = (ql_ct_iu_preamble_t *)pld;
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
pkt->ms24.entry_type = CT_PASSTHRU_TYPE;
pkt->ms24.entry_count = 1;
pkt->ms24.vp_index = ha->vp_index;
--- 1657,1667 ----
/*
* Setup IOCB
*/
ct = (ql_ct_iu_preamble_t *)pld;
! 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,1605 ****
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;
/* Load MS command entry data segments. */
*long_ptr++ = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
*long_ptr++ = (uint32_t)
--- 1682,1692 ----
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;
/* Load MS command entry data segments. */
*long_ptr++ = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
*long_ptr++ = (uint32_t)
*** 1657,1680 ****
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->RequestLen);
! pkt->ms.dseg_0_length = LE_32(cmd->RequestLen);
/* 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));
--- 1744,1767 ----
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->RequestLen);
! pkt->ms.dseg[0].length = LE_32(cmd->RequestLen);
/* 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));
*** 1704,1714 ****
(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,
cmd->ResponseLen);
QL_DUMP_9(pld, 8, cmd->ResponseLen);
/* Send response payload. */
if (ql_send_buffer_data(pld,
--- 1791,1801 ----
(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(ha, "ResponseLen=%d\n",
cmd->ResponseLen);
QL_DUMP_9(pld, 8, cmd->ResponseLen);
/* Send response payload. */
if (ql_send_buffer_data(pld,
*** 1722,1732 ****
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_aen_reg
* IOCTL management server Asynchronous Event Tracking Enable/Disable.
--- 1809,1819 ----
kmem_free(pkt, pkt_size);
ql_free_dma_resource(ha, dma_mem);
kmem_free(dma_mem, sizeof (dma_mem_t));
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_aen_reg
* IOCTL management server Asynchronous Event Tracking Enable/Disable.
*** 1747,1757 ****
{
EXT_REG_AEN reg_struct;
int rval = 0;
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
rval = ddi_copyin((void*)(uintptr_t)cmd->RequestAdr, ®_struct,
cmd->RequestLen, mode);
if (rval == 0) {
--- 1834,1844 ----
{
EXT_REG_AEN reg_struct;
int rval = 0;
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(ha, "started\n");
rval = ddi_copyin((void*)(uintptr_t)cmd->RequestAdr, ®_struct,
cmd->RequestLen, mode);
if (rval == 0) {
*** 1763,1773 ****
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);
} else {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, ddi_copyin\n");
}
}
--- 1850,1860 ----
INTR_LOCK(ha);
xp->aen_q_head = 0;
xp->aen_q_tail = 0;
INTR_UNLOCK(ha);
}
! QL_PRINT_9(ha, "done\n");
} else {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, ddi_copyin\n");
}
}
*** 1796,1806 ****
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);
/* 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) {
--- 1883,1893 ----
uint8_t i;
uint8_t queue_cnt;
uint8_t request_cnt;
ql_xioctl_t *xp = ha->xioctl;
! 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,1863 ****
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_enqueue_aen
--- 1940,1950 ----
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = out_size;
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_enqueue_aen
*** 1877,1891 ****
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,
event_code);
if (xp == NULL) {
! QL_PRINT_9(CE_CONT, "(%d): no context\n", ha->instance);
return;
}
aen_queue = (EXT_ASYNC_EVENT *)xp->aen_tracking_queue;
if (aen_queue[xp->aen_q_tail].AsyncEventCode != NULL) {
--- 1964,1978 ----
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(ha, "started, event_code=%d\n",
event_code);
if (xp == NULL) {
! 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,1957 ****
aen_queue[new_entry].AsyncEventCode = 0;
break;
}
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_scsi_passthru
* IOCTL SCSI passthrough.
--- 2034,2044 ----
aen_queue[new_entry].AsyncEventCode = 0;
break;
}
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_scsi_passthru
* IOCTL SCSI passthrough.
*** 2011,2021 ****
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);
/* 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) {
--- 2098,2108 ----
uint8_t state_flags_h;
uint8_t scsi_status_l;
uint8_t scsi_status_h;
} sts;
! 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,2108 ****
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",
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, "
"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, "
"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,
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);
--- 2154,2195 ----
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(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(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(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(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,2173 ****
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);
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) ?
CF_RD : CF_DATA_IN | CF_STAG);
} else {
scsi_req.direction = (uint8_t)
! (CFG_IST(ha, CFG_CTRL_24258081) ?
CF_WR : CF_DATA_OUT | CF_STAG);
cmd->ResponseLen = 0;
/* Get command payload. */
if (ql_get_buffer_data(
--- 2236,2260 ----
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, "%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_ISP_FW_TYPE_2) ?
CF_RD : CF_DATA_IN | CF_STAG);
} else {
scsi_req.direction = (uint8_t)
! (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,2201 ****
(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);
cmd->ResponseLen = 0;
pkt_size = sizeof (ql_mbx_iocb_t);
pkt = kmem_zalloc(pkt_size, KM_SLEEP);
if (pkt == NULL) {
--- 2278,2288 ----
(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_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,2236 ****
/* 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_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)) {
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 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;
--- 2297,2343 ----
/* retries = ha->port_down_retry_count; */
retries = 1;
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = EXT_DSTATUS_NOADNL_INFO;
! 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_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 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,2254 ****
/* 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);
for (cnt = 0; cnt < MAX_CMDSZ;
cnt = (uint16_t)(cnt + 4)) {
ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
+ cnt, 4);
}
--- 2349,2361 ----
/* Set ISP command timeout. */
pkt->cmd24.timeout = (uint16_t)LE_16(15);
/* Load SCSI CDB */
! 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,2279 ****
/* Load total byte count. */
pkt->cmd24.total_byte_count = LE_32(pld_size);
/* Load data descriptor. */
! pkt->cmd24.dseg_0_address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->cmd24.dseg_0_address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
! pkt->cmd24.dseg_0_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)) {
--- 2372,2386 ----
/* Load total byte count. */
pkt->cmd24.total_byte_count = LE_32(pld_size);
/* Load data descriptor. */
! pkt->cmd24.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->cmd24.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
! 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,2304 ****
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)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! 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);
}
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
pkt->cmd.entry_count = 1;
if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
--- 2397,2411 ----
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)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! 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);
}
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
pkt->cmd.entry_count = 1;
if (CFG_IST(ha, CFG_EXT_FW_INTERFACE)) {
*** 2315,2331 ****
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)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! 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_DUMP_9(pkt, 8, pkt_size);
status = ql_issue_mbx_iocb(ha, (caddr_t)pkt, pkt_size);
if (pld_size) {
--- 2422,2438 ----
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)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->cmd.dseg[0].length = LE_32(pld_size);
}
}
/* Go issue command and wait for completion. */
! 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,2346 ****
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)) {
pkt->sts24.entry_status = (uint8_t)
(pkt->sts24.entry_status & 0x3c);
} else {
pkt->sts.entry_status = (uint8_t)
(pkt->sts.entry_status & 0x7e);
--- 2443,2453 ----
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_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,2360 ****
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) ?
LE_16(pkt->sts24.comp_status) :
LE_16(pkt->sts.comp_status));
/*
* We have verified about all the request that can be so far.
--- 2457,2468 ----
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_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,2423 ****
cmd->ResponseLen = 0;
return;
}
/* Setup status. */
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
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);
--- 2521,2531 ----
cmd->ResponseLen = 0;
return;
}
/* Setup status. */
! 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,2498 ****
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_DUMP_9(&pkt->sts, 8, sizeof (sts_entry_t));
switch (sts.comp_status) {
case CS_INCOMPLETE:
case CS_ABORTED:
--- 2596,2606 ----
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(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,2566 ****
}
/* 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",
ha->instance);
scsi_req.resid = 0;
} else if (sts.comp_status == CS_DATA_UNDERRUN) {
! QL_PRINT_9(CE_CONT, "(%d): 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;
--- 2660,2674 ----
}
/* 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(ha, "Correct completion\n",
ha->instance);
scsi_req.resid = 0;
} else if (sts.comp_status == CS_DATA_UNDERRUN) {
! 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,2581 ****
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,
tq->d_id.b24, sts.comp_status, sts.scsi_status_h,
sts.scsi_status_l);
scsi_req.resid = pld_size;
/*
--- 2678,2689 ----
EL(ha, "failed, Transfer ERROR\n");
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
}
} else {
! 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,2647 ****
}
/* 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,
scsi_req.resid, pld_size, cmd->ResponseLen);
QL_DUMP_9(pld, 8, cmd->ResponseLen);
/* Send response payload. */
if (ql_send_buffer_data(pld,
--- 2744,2755 ----
}
/* Copy response payload from DMA buffer to application. */
if (scsi_req.direction & (CF_RD | CF_DATA_IN) &&
cmd->ResponseLen != 0) {
! 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,2666 ****
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",
ha->instance, cmd->ResponseLen);
}
kmem_free(pkt, pkt_size);
ql_free_dma_resource(ha, dma_mem);
--- 2764,2774 ----
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(ha, "done, ResponseLen=%d\n",
ha->instance, cmd->ResponseLen);
}
kmem_free(pkt, pkt_size);
ql_free_dma_resource(ha, dma_mem);
*** 2684,2694 ****
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);
if (cmd->RequestLen != EXT_DEF_WWN_NAME_SIZE) {
/* Return error */
EL(ha, "incorrect RequestLen\n");
cmd->Status = EXT_STATUS_INVALID_PARAM;
--- 2792,2802 ----
int status;
uint8_t wwpn[EXT_DEF_WWN_NAME_SIZE];
EXT_SCSI_ADDR *tmp_addr;
ql_tgt_t *tq;
! 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,2732 ****
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_host_idx
--- 2830,2840 ----
if (status != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->Status = EXT_STATUS_OK;
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_host_idx
*** 2746,2756 ****
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);
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);
--- 2854,2864 ----
static void
ql_host_idx(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
uint16_t idx;
! 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,2775 ****
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_host_drvname
--- 2873,2883 ----
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = sizeof (uint16_t);
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_host_drvname
*** 2791,2803 ****
{
char drvname[] = QL_NAME;
uint32_t qlnamelen;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
! 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",
--- 2899,2911 ----
{
char drvname[] = QL_NAME;
uint32_t qlnamelen;
! QL_PRINT_9(ha, "started\n");
! 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,2824 ****
qlnamelen, mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
! cmd->ResponseLen = qlnamelen-1;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_read_nvram
* Get NVRAM contents.
--- 2919,2932 ----
qlnamelen, mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
! cmd->ResponseLen = qlnamelen - 1;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_read_nvram
* Get NVRAM contents.
*** 2836,2846 ****
*/
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);
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",
--- 2944,2954 ----
*/
static void
ql_read_nvram(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! 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,2865 ****
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_write_nvram
--- 2963,2973 ----
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(ha, "done\n");
}
}
/*
* ql_write_nvram
*** 2878,2888 ****
*/
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);
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",
--- 2986,2996 ----
*/
static void
ql_write_nvram(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! 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,2905 ****
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_write_vpd
--- 3003,3013 ----
mode) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed, copy error\n");
} else {
/*EMPTY*/
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_write_vpd
*** 2917,2931 ****
* 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);
int32_t rval = 0;
! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
cmd->Status = EXT_STATUS_INVALID_REQUEST;
EL(ha, "failed, invalid request for HBA\n");
return;
}
--- 3025,3039 ----
* Kernel context.
*/
static void
ql_write_vpd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! QL_PRINT_9(ha, "started\n");
int32_t rval = 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,2953 ****
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_read_vpd
--- 3051,3061 ----
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = rval;
EL(ha, "failed, errno=%x\n", rval);
} else {
/*EMPTY*/
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_read_vpd
*** 2965,2977 ****
* 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);
! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
cmd->Status = EXT_STATUS_INVALID_REQUEST;
EL(ha, "failed, invalid request for HBA\n");
return;
}
--- 3073,3085 ----
* Kernel context.
*/
static void
ql_read_vpd(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! QL_PRINT_9(ha, "started\n");
! 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,2998 ****
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_get_fcache
--- 3096,3106 ----
mode)) != 0) {
cmd->Status = EXT_STATUS_COPY_ERR;
EL(ha, "failed,\n");
} else {
/*EMPTY*/
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_get_fcache
*** 3013,3041 ****
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);
- 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) {
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;
--- 3121,3145 ----
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(ha, "started\n");
if (ha->fcache == NULL) {
cmd->Status = EXT_STATUS_ERR;
EL(ha, "failed, adapter fcache not setup\n");
return;
}
! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
bsize = 100;
} else {
bsize = 400;
}
if (cmd->ResponseLen < bsize) {
cmd->Status = EXT_STATUS_BUFFER_TOO_SMALL;
cmd->DetailStatus = bsize;
EL(ha, "failed, ResponseLen < %d, len passed=%xh\n",
bsize, cmd->ResponseLen);
return;
*** 3056,3066 ****
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;
}
--- 3160,3169 ----
*** 3077,3087 ****
*/
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;
--- 3180,3189 ----
*** 3088,3114 ****
}
cpsize = ((fptr->buflen - hsize) < 100 ?
fptr->buflen - hsize : 100);
! 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_get_fcache_ex
* Dumps flash cache contents.
--- 3190,3214 ----
}
cpsize = ((fptr->buflen - hsize) < 100 ?
fptr->buflen - hsize : 100);
! if (ddi_copyout(fptr->buf + hsize,
(void *)(uintptr_t)(cmd->ResponseAdr + 300),
cpsize, mode) != 0) {
EL(ha, "fw ddicopy failed, done\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = 0;
return;
}
bsize += 100;
}
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = bsize;
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fcache_ex
* Dumps flash cache contents.
*** 3129,3143 ****
{
uint32_t bsize = 0;
uint32_t boff = 0;
ql_fcache_t *fptr;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
- CACHE_LOCK(ha);
if (ha->fcache == NULL) {
- CACHE_UNLOCK(ha);
cmd->Status = EXT_STATUS_ERR;
EL(ha, "failed, adapter fcache not setup\n");
return;
}
--- 3229,3241 ----
{
uint32_t bsize = 0;
uint32_t boff = 0;
ql_fcache_t *fptr;
! QL_PRINT_9(ha, "started\n");
if (ha->fcache == NULL) {
cmd->Status = EXT_STATUS_ERR;
EL(ha, "failed, adapter fcache not setup\n");
return;
}
*** 3145,3155 ****
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;
--- 3243,3252 ----
*** 3163,3187 ****
/* 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_read_flash
* Get flash contents.
--- 3260,3282 ----
/* Get the next image */
if (ddi_copyout(fptr->buf,
(void *)(uintptr_t)(cmd->ResponseAdr + boff),
(fptr->buflen < FBUFSIZE ? fptr->buflen : FBUFSIZE),
mode) != 0) {
EL(ha, "failed, ddicopy at %xh, done\n", boff);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->DetailStatus = 0;
return;
}
boff += FBUFSIZE;
fptr = fptr->next;
}
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = bsize;
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_read_flash
* Get flash contents.
*** 3200,3213 ****
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);
! if (ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "ql_stall_driver failed\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->DetailStatus = xp->fdesc.flash_size;
cmd->ResponseLen = 0;
return;
}
--- 3295,3310 ----
static void
ql_read_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
ql_xioctl_t *xp = ha->xioctl;
! 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->DetailStatus = xp->fdesc.flash_size;
cmd->ResponseLen = 0;
return;
}
*** 3235,3253 ****
EL(ha, "failed,\n");
}
}
/* Resume I/O */
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
! ql_restart_driver(ha);
! } else {
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_write_flash
* Loads flash contents.
--- 3332,3348 ----
EL(ha, "failed,\n");
}
}
/* 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_write_flash
* Loads flash contents.
*** 3266,3279 ****
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);
! if (ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "ql_stall_driver failed\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->DetailStatus = xp->fdesc.flash_size;
cmd->ResponseLen = 0;
return;
}
--- 3361,3376 ----
static void
ql_write_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
ql_xioctl_t *xp = ha->xioctl;
! 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->DetailStatus = xp->fdesc.flash_size;
cmd->ResponseLen = 0;
return;
}
*** 3298,3316 ****
EL(ha, "failed,\n");
}
}
/* Resume I/O */
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
! ql_restart_driver(ha);
! } else {
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_diagnostic_loopback
* Performs EXT_CC_LOOPBACK Command
--- 3395,3411 ----
EL(ha, "failed,\n");
}
}
/* 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_diagnostic_loopback
* Performs EXT_CC_LOOPBACK Command
*** 3330,3344 ****
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;
uint16_t opt;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* 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");
--- 3425,3440 ----
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, timer, bpsize;
! caddr_t bp, pld;
uint16_t opt;
+ boolean_t loop_up;
! 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,3472 ****
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);
cmd->Status = EXT_STATUS_INVALID_PARAM;
cmd->ResponseLen = 0;
return;
}
/* Allocate command memory. */
! bp = kmem_zalloc(plbreq.TransferCount, KM_SLEEP);
if (bp == NULL) {
EL(ha, "failed, kmem_zalloc\n");
cmd->Status = EXT_STATUS_NO_MEMORY;
cmd->ResponseLen = 0;
return;
}
/* Get loopback data. */
if (ql_get_buffer_data((caddr_t)(uintptr_t)plbreq.BufferAddress,
! bp, plbreq.TransferCount, mode) != plbreq.TransferCount) {
EL(ha, "failed, ddi_copyin-2\n");
! kmem_free(bp, plbreq.TransferCount);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
! if ((ha->task_daemon_flags & (QL_LOOP_TRANSITION | DRIVER_STALL)) ||
ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "failed, LOOP_NOT_READY\n");
! kmem_free(bp, plbreq.TransferCount);
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
return;
}
/* 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) {
if (plbreq.TransferCount > 252) {
EL(ha, "transfer count (%d) > 252\n",
plbreq.TransferCount);
! kmem_free(bp, plbreq.TransferCount);
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,
MBC_ECHO_ELS, &mr);
} else {
! if (CFG_IST(ha, CFG_CTRL_81XX)) {
(void) ql_set_loop_point(ha, opt);
}
plbrsp.CommandSent = INT_DEF_LB_LOOPBACK_CMD;
! rval = ql_diag_loopback(ha, 0, bp, plbreq.TransferCount,
opt, plbreq.IterationCount, &mr);
! if (CFG_IST(ha, CFG_CTRL_81XX)) {
(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);
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);
} else {
plbrsp.CommandSent = INT_DEF_LB_LOOPBACK_CMD;
! rval = ql_diag_loopback(ha, 0, bp, plbreq.TransferCount,
opt, plbreq.IterationCount, &mr);
}
}
ql_restart_driver(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);
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,
plbreq.TransferCount, mode) != plbreq.TransferCount) {
EL(ha, "failed, ddi_copyout\n");
! kmem_free(bp, plbreq.TransferCount);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
! kmem_free(bp, plbreq.TransferCount);
/* Return loopback results. */
plbrsp.BufferAddress = plbreq.BufferAddress;
plbrsp.BufferLength = plbreq.TransferCount;
plbrsp.CompletionStatus = mr.mb[0];
--- 3441,3597 ----
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
/* Check transfer length fits in buffer. */
! 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. */
! 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,
! pld, plbreq.TransferCount, mode) != plbreq.TransferCount) {
EL(ha, "failed, ddi_copyin-2\n");
! kmem_free(bp, bpsize);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
! if (LOOP_RECONFIGURE(ha) ||
ql_stall_driver(ha, 0) != QL_SUCCESS) {
EL(ha, "failed, LOOP_NOT_READY\n");
! 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 */
! 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);
! 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, pld, plbreq.TransferCount,
MBC_ECHO_ELS, &mr);
} else {
! 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, pld, plbreq.TransferCount,
opt, plbreq.IterationCount, &mr);
! 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 (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;
! 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;
! 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, bpsize);
cmd->Status = EXT_STATUS_MAILBOX;
cmd->DetailStatus = rval;
cmd->ResponseLen = 0;
return;
}
/* Return loopback data. */
! 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, bpsize);
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
return;
}
! kmem_free(bp, bpsize);
/* Return loopback results. */
plbrsp.BufferAddress = plbreq.BufferAddress;
plbrsp.BufferLength = plbreq.TransferCount;
plbrsp.CompletionStatus = mr.mb[0];
*** 3478,3488 ****
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];
}
rval = ddi_copyout((void *)&plbrsp,
(void *)(uintptr_t)cmd->ResponseAdr,
sizeof (EXT_LOOPBACK_RSP), mode);
--- 3603,3614 ----
plbrsp.IterationCountLastError = 0;
} else {
plbrsp.CrcErrorCount = mr.mb[1];
plbrsp.DisparityErrorCount = mr.mb[2];
plbrsp.FrameLengthErrorCount = mr.mb[3];
! 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,3502 ****
cmd->ResponseLen = 0;
return;
}
cmd->ResponseLen = sizeof (EXT_LOOPBACK_RSP);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_set_loop_point
* Setup loop point for port configuration.
--- 3618,3628 ----
cmd->ResponseLen = 0;
return;
}
cmd->ResponseLen = sizeof (EXT_LOOPBACK_RSP);
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_set_loop_point
* Setup loop point for port configuration.
*** 3509,3526 ****
* ql local function return status code.
*
* Context:
* Kernel context.
*/
! static 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);
/*
* We get the current port config, modify the loopback field and
* write it back out.
*/
--- 3635,3652 ----
* ql local function return status code.
*
* Context:
* Kernel context.
*/
! 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(ha, "started\n");
/*
* We get the current port config, modify the loopback field and
* write it back out.
*/
*** 3528,3543 ****
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);
if (opt == MBC_LOOPBACK_POINT_INTERNAL) {
! mr.mb[1] = (uint16_t)(mr.mb[1] |
! LOOPBACK_MODE(LOOPBACK_MODE_INTERNAL));
}
/*
* 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.
--- 3654,3670 ----
EL(ha, "get_port_config status=%xh\n", rval);
return (rval);
}
/*
* Set the loopback mode field while maintaining the others.
*/
! 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_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,3566 ****
}
/* Delay for 1000000 usec (1 second). */
ql_delay(ha, 1000000);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
--- 3683,3693 ----
}
/* Delay for 1000000 usec (1 second). */
ql_delay(ha, 1000000);
}
! QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
*** 3583,3599 ****
{
EXT_RNID_REQ tmp_rnid;
port_id_t tmp_fcid;
caddr_t tmp_buf, bptr;
uint32_t copy_len;
! ql_tgt_t *tq;
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);
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
--- 3710,3726 ----
{
EXT_RNID_REQ tmp_rnid;
port_id_t tmp_fcid;
caddr_t tmp_buf, bptr;
uint32_t copy_len;
! 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(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
*** 3618,3641 ****
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;
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;
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,
--- 3745,3764 ----
return;
}
/* Find loop ID of the device */
if (tmp_rnid.Addr.Type == EXT_DEF_TYPE_WWNN) {
! 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 = (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,3707 ****
/* 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],
EXT_DEF_WWN_NAME_SIZE);
! bcopy(ha->init_ctrl_blk.cb24.node_name,
&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) {
--- 3806,3820 ----
/* 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);
! bcopy(ha->loginparams.nport_ww_name.raw_wwn, &tmp_buf[4],
EXT_DEF_WWN_NAME_SIZE);
! bcopy(ha->loginparams.node_ww_name.raw_wwn,
&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,3770 ****
} 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",
ha->instance);
}
}
kmem_free(tmp_buf, SEND_RNID_RSP_SIZE);
--- 3873,3883 ----
} 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(ha, "done\n",
ha->instance);
}
}
kmem_free(tmp_buf, SEND_RNID_RSP_SIZE);
*** 3786,3796 ****
* 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,
cmd->SubCode);
/*
* case off on command subcode
*/
--- 3899,3909 ----
* Kernel context.
*/
static void
ql_set_host_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! QL_PRINT_9(ha, "started, SubCode=%d\n",
cmd->SubCode);
/*
* case off on command subcode
*/
*** 3825,3835 ****
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_get_host_data
--- 3938,3948 ----
if (cmd->Status != EXT_STATUS_OK) {
EL(ha, "failed, Status=%d\n", cmd->Status);
} else {
/*EMPTY*/
! QL_PRINT_9(ha, "done\n");
}
}
/*
* ql_get_host_data
*** 3849,3859 ****
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,
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_SC_GET_STATISTICS:
--- 3962,3972 ----
static void
ql_get_host_data(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int out_size = 0;
! QL_PRINT_9(ha, "started, SubCode=%d\n",
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_SC_GET_STATISTICS:
*** 3884,3893 ****
--- 3997,4009 ----
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,3964 ****
ql_get_fcf_list(ha, cmd, mode);
break;
case EXT_SC_GET_RESOURCE_CNTS:
ql_get_resource_counts(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);
}
}
/* ******************************************************************** */
/* Helper Functions */
--- 4064,4083 ----
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(ha, "done\n");
}
}
/* ******************************************************************** */
/* Helper Functions */
*** 3981,3999 ****
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);
/* 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);
return (cnt);
}
/*
--- 4100,4118 ----
static int
ql_lun_count(ql_adapter_state_t *ha, ql_tgt_t *tq)
{
int cnt;
! 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(ha, "done\n");
return (cnt);
}
/*
*** 4020,4030 ****
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);
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
return (0);
}
--- 4139,4149 ----
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(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
return (0);
}
*** 4038,4055 ****
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 "
"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)) {
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);
--- 4157,4174 ----
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 "
"alloc failed", QL_NAME, ha->instance);
kmem_free(pkt, pkt_size);
return (0);
}
for (retries = 0; retries < 4; retries++) {
! 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,4105 ****
/* 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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! pkt->cmd24.dseg_0_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 =
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)) {
--- 4208,4224 ----
/* Set data segment count. */
pkt->cmd24.dseg_count = LE_16(1);
/* Load total byte count. */
/* Load data descriptor. */
! pkt->cmd24.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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.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,4134 ****
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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! pkt->cmd3.dseg_0_address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
! 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)) {
--- 4239,4253 ----
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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! pkt->cmd3.dseg[0].address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
! 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,4161 ****
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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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));
--- 4268,4280 ----
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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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,4175 ****
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)) {
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;
--- 4284,4294 ----
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_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,4251 ****
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_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);
return (rval);
}
/*
--- 4352,4370 ----
if (rval != QL_SUCCESS) {
EL(ha, "failed=%xh\n", rval);
rval = 0;
} else {
! 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(ha, "done\n");
return (rval);
}
/*
*** 4269,4279 ****
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);
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");
--- 4388,4398 ----
int lun, cnt, rval;
ql_mbx_iocb_t *pkt;
uint8_t *inq;
uint32_t pkt_size;
! 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,4318 ****
case DTYPE_SEQUENTIAL:
cnt++;
tq->flags |= TQF_TAPE_DEVICE;
break;
default:
! QL_PRINT_9(CE_CONT, "(%d): failed, "
"unsupported device id=%xh, lun=%d, "
! "type=%xh\n", ha->instance, tq->loop_id,
lun, *inq);
break;
}
if (*inq == DTYPE_ESI || cnt >= count) {
--- 4425,4437 ----
case DTYPE_SEQUENTIAL:
cnt++;
tq->flags |= TQF_TAPE_DEVICE;
break;
default:
! QL_PRINT_9(ha, "failed, "
"unsupported device id=%xh, lun=%d, "
! "type=%xh\n", tq->loop_id,
lun, *inq);
break;
}
if (*inq == DTYPE_ESI || cnt >= count) {
*** 4324,4334 ****
}
}
kmem_free(pkt, pkt_size);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (cnt);
}
/*
--- 4443,4453 ----
}
}
kmem_free(pkt, pkt_size);
! QL_PRINT_9(ha, "done\n");
return (cnt);
}
/*
*** 4348,4367 ****
* 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)
{
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;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, loop down\n");
return (QL_FUNCTION_TIMEOUT);
}
--- 4467,4488 ----
* Context:
* Kernel context.
*/
static int
ql_inq(ql_adapter_state_t *ha, ql_tgt_t *tq, int lun, ql_mbx_iocb_t *pkt,
! 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(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, loop down\n");
return (QL_FUNCTION_TIMEOUT);
}
*** 4372,4394 ****
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 "
"alloc failed", QL_NAME, ha->instance);
return (0);
}
for (retries = 0; retries < 4; retries++) {
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
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);
/* Set N_port handle */
pkt->cmd24.n_port_hdl = (uint16_t)LE_16(tq->loop_id);
/* Set target ID */
--- 4493,4531 ----
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 "
"alloc failed", QL_NAME, ha->instance);
return (0);
}
for (retries = 0; retries < 4; retries++) {
! 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 */
! 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,4412 ****
/* 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;
for (cnt = 0; cnt < MAX_CMDSZ; cnt += 4) {
ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
+ cnt, 4);
}
--- 4539,4549 ----
/* 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] = LSB(LSW(inq_len));
for (cnt = 0; cnt < MAX_CMDSZ; cnt += 4) {
ql_chg_endian((uint8_t *)&pkt->cmd24.scsi_cdb
+ cnt, 4);
}
*** 4421,4435 ****
/* Load total byte count. */
pkt->cmd24.total_byte_count = LE_32(inq_len);
/* Load data descriptor. */
! pkt->cmd24.dseg_0_address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! pkt->cmd24.dseg_0_address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
! pkt->cmd24.dseg_0_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;
--- 4558,4572 ----
/* Load total byte count. */
pkt->cmd24.total_byte_count = LE_32(inq_len);
/* Load data descriptor. */
! pkt->cmd24.dseg.address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! pkt->cmd24.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem.cookie.dmac_laddress));
! 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,4459 ****
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.dseg_count = LE_16(1);
pkt->cmd3.byte_count = LE_32(inq_len);
! pkt->cmd3.dseg_0_address[0] = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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);
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
cnt = CMD_TYPE_2_DATA_SEGMENTS;
pkt->cmd.entry_count = 1;
--- 4579,4596 ----
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] = 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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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);
} else {
pkt->cmd.entry_type = IOCB_CMD_TYPE_2;
cnt = CMD_TYPE_2_DATA_SEGMENTS;
pkt->cmd.entry_count = 1;
*** 4466,4481 ****
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.dseg_count = LE_16(1);
pkt->cmd.byte_count = LE_32(inq_len);
! pkt->cmd.dseg_0_address = (uint32_t)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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));
--- 4603,4618 ----
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] = 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)
LE_32(LSD(dma_mem.cookie.dmac_laddress));
! 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,4495 ****
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)) {
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;
--- 4622,4632 ----
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_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,4550 ****
break;
}
}
ql_free_dma_resource(ha, &dma_mem);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
--- 4677,4687 ----
break;
}
}
ql_free_dma_resource(ha, &dma_mem);
! QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
*** 4568,4578 ****
{
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");
break;
}
}
return (cnt);
--- 4705,4715 ----
{
uint32_t cnt;
for (cnt = 0; cnt < size; cnt++) {
if (ddi_copyin(src++, dst++, 1, mode) != 0) {
! QL_PRINT_2(NULL, "failed, ddi_copyin\n");
break;
}
}
return (cnt);
*** 4599,4609 ****
{
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");
break;
}
}
return (cnt);
--- 4736,4746 ----
{
uint32_t cnt;
for (cnt = 0; cnt < size; cnt++) {
if (ddi_copyout(src++, dst++, 1, mode) != 0) {
! QL_PRINT_2(NULL, "failed, ddi_copyin\n");
break;
}
}
return (cnt);
*** 4689,4702 ****
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);
if (ha->flash_desc_addr == 0) {
! QL_PRINT_9(CE_CONT, "(%d): desc ptr=0\n", ha->instance);
return (QL_FUNCTION_FAILED);
}
if ((fdesc = kmem_zalloc(sizeof (flash_desc_t), KM_SLEEP)) == NULL) {
EL(ha, "kmem_zalloc=null\n");
--- 4826,4839 ----
uint16_t chksum, *bp, data;
int rval;
flash_desc_t *fdesc;
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(ha, "started\n");
if (ha->flash_desc_addr == 0) {
! 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,4751 ****
}
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);
return (QL_SUCCESS);
}
/*
--- 4878,4888 ----
}
bcopy(fdesc, &xp->fdesc, sizeof (flash_desc_t));
kmem_free(fdesc, sizeof (flash_desc_t));
! QL_PRINT_9(ha, "done\n");
return (QL_SUCCESS);
}
/*
*** 4770,4789 ****
if (xp->fdesc.flash_size != 0) {
return (rval);
}
! if (CFG_IST(ha, CFG_CTRL_2200) && !ha->subven_id) {
return (QL_FUNCTION_FAILED);
}
! if (CFG_IST(ha, CFG_CTRL_258081)) {
/*
* 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)) {
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;
--- 4907,4928 ----
if (xp->fdesc.flash_size != 0) {
return (rval);
}
! if (CFG_IST(ha, CFG_CTRL_22XX) && !ha->subven_id) {
return (QL_FUNCTION_FAILED);
}
! 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_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,4809 ****
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;
xp->fdesc.flash_len = 0x17;
} else {
(void) ql_24xx_flash_id(ha);
}
! } else if (CFG_IST(ha, CFG_CTRL_2422)) {
(void) ql_24xx_flash_id(ha);
} else {
ql_flash_enable(ha);
ql_write_flash_byte(ha, 0x5555, 0xaa);
--- 4930,4948 ----
if (ql_24xx_flash_desc(ha) == QL_SUCCESS) {
EL(ha, "flash desc table ok, exit\n");
return (rval);
}
! 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_24XX)) {
(void) ql_24xx_flash_id(ha);
} else {
ql_flash_enable(ha);
ql_write_flash_byte(ha, 0x5555, 0xaa);
*** 4835,4851 ****
/* 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.block_size = 0x10000;
xp->fdesc.erase_cmd = 0xd8;
switch (xp->fdesc.flash_manuf) {
case AMD_FLASH:
switch (xp->fdesc.flash_id) {
case SPAN_FLASHID_2048K:
xp->fdesc.flash_size = 0x200000;
break;
case AMD_FLASHID_1024K:
xp->fdesc.flash_size = 0x100000;
--- 4974,4997 ----
/* 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 = 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,4891 ****
--- 5028,5044 ----
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,4931 ****
--- 5071,5091 ----
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,4962 ****
--- 5113,5124 ----
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,5004 ****
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)) {
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.
*/
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)) {
--- 5142,5180 ----
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_ISP_FW_TYPE_2)) {
EL(ha, "no default id\n");
return (QL_SUCCESS);
}
/*
! * 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,5050 ****
{
uint8_t *bfp;
ql_xioctl_t *xp = ha->xioctl;
int rval = 0;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
if (bsize > xp->fdesc.flash_size) {
EL(ha, "failed, bufsize: %xh, flash size: %xh\n", bsize,
xp->fdesc.flash_size);
return (ENOMEM);
--- 5216,5226 ----
{
uint8_t *bfp;
ql_xioctl_t *xp = ha->xioctl;
int rval = 0;
! 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,5076 ****
rval = 0;
}
kmem_free(bfp, bsize);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
--- 5242,5252 ----
rval = 0;
}
kmem_free(bfp, bsize);
}
! QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
*** 5093,5107 ****
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)) {
return (ql_24xx_load_flash(ha, dp, size, addr));
}
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
if (CFG_IST(ha, CFG_SBUS_CARD)) {
/*
* sbus has an additional check to make
* sure they don't brick the HBA.
--- 5269,5283 ----
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_ISP_FW_TYPE_2)) {
return (ql_24xx_load_flash(ha, dp, size, addr));
}
! 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,5149 ****
if (rval != QL_SUCCESS) {
EL(ha, "failed, rval=%xh\n", rval);
} else {
/*EMPTY*/
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
return (rval);
}
/*
--- 5315,5325 ----
if (rval != QL_SUCCESS) {
EL(ha, "failed, rval=%xh\n", rval);
} else {
/*EMPTY*/
! QL_PRINT_9(ha, "done\n");
}
return (rval);
}
/*
*** 5168,5178 ****
{
uint8_t *bfp;
int rval;
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* 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);
--- 5344,5354 ----
{
uint8_t *bfp;
int rval;
ql_xioctl_t *xp = ha->xioctl;
! 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,5206 ****
rval = 0;
}
kmem_free(bfp, bsize);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
--- 5372,5382 ----
rval = 0;
}
kmem_free(bfp, bsize);
}
! QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
*** 5227,5246 ****
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);
/* 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)) {
/* 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) {
--- 5403,5422 ----
uint32_t cnt, data, addr;
uint8_t bp[4], *src;
int fp_rval, rval = QL_SUCCESS;
dma_mem_t mem;
! 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_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,5265 ****
*dp++ = bp[startpos & 0x3];
startpos++;
size--;
}
if (size == 0) {
! QL_PRINT_9(CE_CONT, "(%d): done2\n",
ha->instance);
return (rval);
}
}
--- 5431,5441 ----
*dp++ = bp[startpos & 0x3];
startpos++;
size--;
}
if (size == 0) {
! QL_PRINT_9(ha, "done2\n",
ha->instance);
return (rval);
}
}
*** 5268,5278 ****
}
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))) {
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) {
--- 5444,5454 ----
}
bzero(&mem, sizeof (dma_mem_t));
/* Check for Fast page is supported */
if ((ha->pha->task_daemon_flags & FIRMWARE_UP) &&
! (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,5305 ****
}
GLOBAL_HW_LOCK();
/* Enable Flash Read/Write. */
! if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
ql_flash_enable(ha);
}
/* Read fcode data from flash. */
while (size) {
/* Allow other system activity. */
if (size % 0x1000 == 0) {
! ql_delay(ha, 100000);
}
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
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) {
--- 5461,5481 ----
}
GLOBAL_HW_LOCK();
/* Enable Flash Read/Write. */
! 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, 10000);
}
! 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,5336 ****
*dp++ = (uint8_t)ql_read_flash_byte(ha, startpos++);
size--;
}
}
! if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
ql_flash_disable(ha);
}
GLOBAL_HW_UNLOCK();
--- 5502,5512 ----
*dp++ = (uint8_t)ql_read_flash_byte(ha, startpos++);
size--;
}
}
! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) {
ql_flash_disable(ha);
}
GLOBAL_HW_UNLOCK();
*** 5340,5350 ****
if (rval != QL_SUCCESS) {
EL(ha, "failed, rval = %xh\n", rval);
} else {
/*EMPTY*/
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
return (rval);
}
/*
--- 5516,5526 ----
if (rval != QL_SUCCESS) {
EL(ha, "failed, rval = %xh\n", rval);
} else {
/*EMPTY*/
! QL_PRINT_9(ha, "done\n");
}
return (rval);
}
/*
*** 5402,5412 ****
{
EXT_SET_RNID_REQ tmp_set;
EXT_RNID_DATA *tmp_buf;
int rval = 0;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
--- 5578,5588 ----
{
EXT_SET_RNID_REQ tmp_set;
EXT_RNID_DATA *tmp_buf;
int rval = 0;
! 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,5477 ****
cmd->ResponseLen = 0;
}
kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_rnid_parameters
* Get RNID parameters.
--- 5643,5653 ----
cmd->ResponseLen = 0;
}
kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_rnid_parameters
* Get RNID parameters.
*** 5485,5495 ****
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);
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
--- 5661,5671 ----
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(ha, "started\n");
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
*** 5523,5533 ****
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);
cmd->ResponseLen = sizeof (EXT_RNID_DATA);
}
kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
}
--- 5699,5709 ----
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(ha, "done\n");
cmd->ResponseLen = sizeof (EXT_RNID_DATA);
}
kmem_free(tmp_buf, sizeof (EXT_RNID_DATA));
}
*** 5550,5560 ****
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);
if (DRIVER_SUSPENDED(ha)) {
EL(ha, "failed, LOOP_NOT_READY\n");
cmd->Status = EXT_STATUS_BUSY;
cmd->ResponseLen = 0;
--- 5726,5736 ----
ql_reset_statistics(ql_adapter_state_t *ha, EXT_IOCTL *cmd)
{
ql_xioctl_t *xp = ha->xioctl;
int rval = 0;
! 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,5596 ****
xp->DeviceErrorCount = 0;
xp->TotalLipResets = 0;
xp->TotalInterrupts = 0;
INTR_UNLOCK(ha);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
--- 5762,5772 ----
xp->DeviceErrorCount = 0;
xp->TotalLipResets = 0;
xp->TotalInterrupts = 0;
INTR_UNLOCK(ha);
! QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
*** 5615,5625 ****
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);
while (ha->task_daemon_flags &
(ABORT_ISP_ACTIVE | LOOP_RESYNC_ACTIVE | DRIVER_STALL)) {
ql_delay(ha, 10000000); /* 10 second delay */
--- 5791,5801 ----
ql_link_stats_t *ls;
int rval;
ql_xioctl_t *xp = ha->xioctl;
int retry = 10;
! 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,5693 ****
}
}
kmem_free(ls, sizeof (ql_link_stats_t));
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_statistics_fc
* Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.
--- 5859,5869 ----
}
}
kmem_free(ls, sizeof (ql_link_stats_t));
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_statistics_fc
* Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.
*** 5713,5723 ****
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);
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;
--- 5889,5899 ----
EXT_DEST_ADDR pextdestaddr;
uint8_t *name;
ql_tgt_t *tq = NULL;
int retry = 10;
! 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,5736 ****
}
qlnt = QLNT_PORT;
name = pextdestaddr.DestAddr.WWPN;
! QL_PRINT_9(CE_CONT, "(%d): 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);
--- 5902,5912 ----
}
qlnt = QLNT_PORT;
name = pextdestaddr.DestAddr.WWPN;
! 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,5803 ****
}
}
kmem_free(ls, sizeof (ql_link_stats_t));
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_statistics_fc4
* Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.
--- 5969,5979 ----
}
}
kmem_free(ls, sizeof (ql_link_stats_t));
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_statistics_fc4
* Performs EXT_SC_GET_FC_STATISTICS subcommand. of EXT_CC_GET_DATA.
*** 5818,5828 ****
{
uint32_t rval;
EXT_HBA_FC4STATISTICS fc4stats = {0};
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
fc4stats.InputRequests = xp->IOInputRequests;
fc4stats.OutputRequests = xp->IOOutputRequests;
fc4stats.ControlRequests = xp->IOControlRequests;
fc4stats.InputMegabytes = xp->IOInputMByteCnt;
--- 5994,6004 ----
{
uint32_t rval;
EXT_HBA_FC4STATISTICS fc4stats = {0};
ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(ha, "started\n");
fc4stats.InputRequests = xp->IOInputRequests;
fc4stats.OutputRequests = xp->IOOutputRequests;
fc4stats.ControlRequests = xp->IOControlRequests;
fc4stats.InputMegabytes = xp->IOInputMByteCnt;
*** 5838,5848 ****
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = sizeof (EXT_HBA_FC4STATISTICS);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_set_led_state
* Performs EXT_SET_BEACON_STATE subcommand of EXT_CC_SET_DATA.
--- 6014,6024 ----
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = sizeof (EXT_HBA_FC4STATISTICS);
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_set_led_state
* Performs EXT_SET_BEACON_STATE subcommand of EXT_CC_SET_DATA.
*** 5860,5873 ****
*/
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;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
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,"
--- 6036,6049 ----
*/
static void
ql_set_led_state(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
EXT_BEACON_CONTROL bstate;
! int rval;
! ql_mbx_data_t mr;
! 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,5884 ****
" Len=%xh\n", cmd->RequestLen);
cmd->ResponseLen = 0;
return;
}
! if (ha->device_id < 0x2300) {
cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
cmd->DetailStatus = 0;
EL(ha, "done - failed, Invalid function for HBA model\n");
cmd->ResponseLen = 0;
return;
--- 6050,6060 ----
" Len=%xh\n", cmd->RequestLen);
cmd->ResponseLen = 0;
return;
}
! 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,5948 ****
return;
}
switch (bstate.State) {
case EXT_DEF_GRN_BLINK_OFF: /* turn beacon off */
! if (xp->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 ((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) {
/* 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 ((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;
} else {
! xp->ledstate.LEDflags = LED_GREEN;
}
! xp->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_get_led_state
* Performs EXT_GET_BEACON_STATE subcommand of EXT_CC_GET_DATA.
--- 6069,6156 ----
return;
}
switch (bstate.State) {
case EXT_DEF_GRN_BLINK_OFF: /* turn 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;
}
! 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 (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_ISP_FW_TYPE_2)) {
! ha->ledstate.LEDflags = LED_YELLOW_24 | LED_AMBER_24;
} else {
! ha->ledstate.LEDflags = LED_GREEN;
}
! 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(ha, "done\n");
}
/*
* ql_get_led_state
* Performs EXT_GET_BEACON_STATE subcommand of EXT_CC_GET_DATA.
*** 5961,5973 ****
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);
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,"
--- 6169,6180 ----
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_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,5984 ****
"Len=%xh\n", cmd->ResponseLen);
cmd->ResponseLen = 0;
return;
}
! if (ha->device_id < 0x2300) {
cmd->Status = EXT_STATUS_UNSUPPORTED_SUBCODE;
cmd->DetailStatus = 0;
EL(ha, "done - failed, Invalid function for HBA model\n");
cmd->ResponseLen = 0;
return;
--- 6181,6191 ----
"Len=%xh\n", cmd->ResponseLen);
cmd->ResponseLen = 0;
return;
}
! 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,6000 ****
cmd->ResponseLen = 0;
return;
}
/* inform the user of the current beacon state (off or on) */
! bstate.State = xp->ledstate.BeaconState;
rval = ddi_copyout((void *)&bstate,
(void *)(uintptr_t)cmd->ResponseAdr,
sizeof (EXT_BEACON_CONTROL), mode);
--- 6197,6207 ----
cmd->ResponseLen = 0;
return;
}
/* inform the user of the current beacon state (off or on) */
! bstate.State = ha->ledstate.BeaconState;
rval = ddi_copyout((void *)&bstate,
(void *)(uintptr_t)cmd->ResponseAdr,
sizeof (EXT_BEACON_CONTROL), mode);
*** 6005,6015 ****
} else {
cmd->Status = EXT_STATUS_OK;
cmd->ResponseLen = sizeof (EXT_BEACON_CONTROL);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_blink_led
* Determine the next state of the LED and drive it
--- 6212,6222 ----
} else {
cmd->Status = EXT_STATUS_OK;
cmd->ResponseLen = sizeof (EXT_BEACON_CONTROL);
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_blink_led
* Determine the next state of the LED and drive it
*** 6022,6050 ****
*/
void
ql_blink_led(ql_adapter_state_t *ha)
{
uint32_t nextstate;
! ql_xioctl_t *xp = ha->xioctl;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
! if (xp->ledstate.BeaconState == BEACON_ON) {
/* determine the next led state */
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
! nextstate = (xp->ledstate.LEDflags) &
(~(RD32_IO_REG(ha, gpiod)));
} else {
! nextstate = (xp->ledstate.LEDflags) &
(~(RD16_IO_REG(ha, gpiod)));
}
/* turn the led on or off */
ql_drive_led(ha, nextstate);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_drive_led
* drive the led's as determined by LEDflags
--- 6229,6310 ----
*/
void
ql_blink_led(ql_adapter_state_t *ha)
{
uint32_t nextstate;
! ql_mbx_data_t mr;
! QL_PRINT_9(ha, "started\n");
! 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_2425)) {
! nextstate = (ha->ledstate.LEDflags) &
(~(RD32_IO_REG(ha, gpiod)));
} else {
! 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(ha, "done\n");
}
/*
* ql_drive_led
* drive the led's as determined by LEDflags
*** 6057,6071 ****
* Kernel/Interrupt context.
*/
static void
ql_drive_led(ql_adapter_state_t *ha, uint32_t LEDflags)
{
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
- 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);
--- 6317,6330 ----
* Kernel/Interrupt context.
*/
static void
ql_drive_led(ql_adapter_state_t *ha, uint32_t LEDflags)
{
+ QL_PRINT_9(ha, "started\n");
! if (CFG_IST(ha, CFG_CTRL_2363)) {
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,6090 ****
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)) {
!
uint32_t gpio_data;
/* setup to send new data */
gpio_data = RD32_IO_REG(ha, gpiod);
gpio_data |= LED_MASK_UPDATE_24;
--- 6338,6348 ----
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_2425)) {
uint32_t gpio_data;
/* setup to send new data */
gpio_data = RD32_IO_REG(ha, gpiod);
gpio_data |= LED_MASK_UPDATE_24;
*** 6099,6112 ****
/* write out the new led data */
WRT32_IO_REG(ha, gpiod, gpio_data);
} else {
! EL(ha, "unsupported HBA: %xh", ha->device_id);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_setup_led
* Setup LED for driver control
--- 6357,6370 ----
/* write out the new led data */
WRT32_IO_REG(ha, gpiod, gpio_data);
} else {
! EL(ha, "unsupported HBA: %xh\n", ha->device_id);
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_setup_led
* Setup LED for driver control
*** 6115,6132 ****
* ha: adapter state pointer.
*
* Context:
* Kernel/Interrupt context.
*/
! static uint32_t
ql_setup_led(ql_adapter_state_t *ha)
{
! uint32_t rval;
ql_mbx_data_t mr;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* 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);
--- 6373,6391 ----
* ha: adapter state pointer.
*
* Context:
* Kernel/Interrupt context.
*/
! static int
ql_setup_led(ql_adapter_state_t *ha)
{
! int rval = QL_SUCCESS;
ql_mbx_data_t mr;
! 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,6155 ****
}
/* initally, turn the LED's off */
ql_drive_led(ha, LED_ALL_OFF);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
* ql_wrapup_led
* Return LED control to the firmware
--- 6402,6485 ----
}
/* initally, turn the LED's off */
ql_drive_led(ha, LED_ALL_OFF);
! } 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,6207 ****
* ha: adapter state pointer.
*
* Context:
* Kernel/Interrupt context.
*/
! static uint32_t
ql_wrapup_led(ql_adapter_state_t *ha)
{
! uint32_t rval;
ql_mbx_data_t mr;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
- /* Turn all LED's off */
- ql_drive_led(ha, LED_ALL_OFF);
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
!
uint32_t gpio_data;
/* 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);
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
* ql_get_port_summary
--- 6488,6559 ----
* ha: adapter state pointer.
*
* Context:
* Kernel/Interrupt context.
*/
! static int
ql_wrapup_led(ql_adapter_state_t *ha)
{
! int rval = QL_SUCCESS;
ql_mbx_data_t mr;
! QL_PRINT_9(ha, "started\n");
! 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_LEDS);
rval = ql_set_firmware_option(ha, &mr);
if (rval != QL_SUCCESS) {
EL(ha, "failed, set_firmware_option=%xh\n", rval);
return (rval);
}
! } else {
! EL(ha, "unsupported HBA: %xh\n", ha->device_id);
! }
+ QL_PRINT_9(ha, "done\n");
+
return (rval);
}
/*
* ql_get_port_summary
*** 6230,6240 ****
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);
ddep = &dd.EntryList[0];
/*
* Get the type of device the requestor is looking for.
--- 6582,6592 ----
ql_tgt_t *tq;
uint32_t rlen, dev_type, index;
int rval = 0;
EXT_DEVICEDATAENTRY *uddep, *ddep;
! QL_PRINT_9(ha, "started\n");
ddep = &dd.EntryList[0];
/*
* Get the type of device the requestor is looking for.
*** 6289,6299 ****
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)) {
continue; /* Skip this one */
}
bzero((void *)ddep, sizeof (EXT_DEVICEDATAENTRY));
--- 6641,6652 ----
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) ||
! tq->d_id.b24 == FS_MANAGEMENT_SERVER) {
continue; /* Skip this one */
}
bzero((void *)ddep, sizeof (EXT_DEVICEDATAENTRY));
*** 6307,6317 ****
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, "
"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],
--- 6660,6670 ----
bcopy(tq->port_name,
(caddr_t)&ddep->TargetAddress.Target, 8);
ddep->DeviceFlags = tq->flags;
ddep->LoopID = tq->loop_id;
! 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,6353 ****
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_get_target_id
--- 6696,6706 ----
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(ha, "done\n");
}
}
/*
* ql_get_target_id
*** 6372,6382 ****
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);
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;
--- 6725,6735 ----
EXT_DEST_ADDR extdestaddr = {0};
uint8_t *name;
uint8_t wwpn[EXT_DEF_WWN_NAME_SIZE];
ql_tgt_t *tq;
! 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,6394 ****
return;
}
qlnt = QLNT_PORT;
name = wwpn;
! QL_PRINT_9(CE_CONT, "(%d): 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)) {
--- 6737,6747 ----
return;
}
qlnt = QLNT_PORT;
name = wwpn;
! 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,6416 ****
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_setup_fcache
* Populates selected flash sections into the cache
--- 6759,6769 ----
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_setup_fcache
* Populates selected flash sections into the cache
*** 6436,6460 ****
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);
- 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) {
--- 6789,6809 ----
uint32_t fw_done = 0;
ql_fcache_t *head = NULL;
ql_fcache_t *tail = NULL;
ql_fcache_t *ftmp;
! QL_PRINT_10(ha, "started cfg=0x%llx\n", ha->cfg_flags);
/* If we already have populated it, rtn */
if (ha->fcache != NULL) {
EL(ha, "buffer already populated\n");
return (QL_SUCCESS);
}
ql_flash_nvram_defaults(ha);
if ((rval = ql_setup_flash(ha)) != QL_SUCCESS) {
EL(ha, "unable to setup flash; rval=%xh\n", rval);
return (rval);
}
while (freadpos != 0xffffffff) {
*** 6473,6483 ****
tail = ftmp;
}
/* Do the firmware node first for 24xx/25xx's */
if (fw_done == 0) {
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
freadpos = ha->flash_fw_addr << 2;
}
fw_done = 1;
}
--- 6822,6832 ----
tail = ftmp;
}
/* Do the firmware node first for 24xx/25xx's */
if (fw_done == 0) {
! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
freadpos = ha->flash_fw_addr << 2;
}
fw_done = 1;
}
*** 6508,6520 ****
}
EL(ha, "failed, done\n");
} else {
ha->fcache = head;
! QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance);
}
- CACHE_UNLOCK(ha);
return (rval);
}
/*
--- 6857,6868 ----
}
EL(ha, "failed, done\n");
} else {
ha->fcache = head;
! QL_PRINT_10(ha, "done\n");
}
return (rval);
}
/*
*** 6541,6551 ****
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);
while (freadpos != 0xffffffff) {
/* Allocate & populate this node */
--- 6889,6899 ----
uint32_t fw_done = 0;
ql_fcache_t *head = NULL;
ql_fcache_t *tail = NULL;
ql_fcache_t *ftmp;
! QL_PRINT_3(ha, "started\n");
while (freadpos != 0xffffffff) {
/* Allocate & populate this node */
*** 6563,6586 ****
tail = ftmp;
}
/* Do the firmware node first for 24xx's */
if (fw_done == 0) {
! if (CFG_IST(ha, CFG_CTRL_24258081)) {
freadpos = ha->flash_fw_addr << 2;
}
fw_done = 1;
}
/* read in first FBUFSIZE bytes of this flash section */
! 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);
/* checkout the pci data / format */
if (ql_check_pci(ha, ftmp, &freadpos)) {
EL(ha, "flash header incorrect\n");
rval = QL_FUNCTION_FAILED;
--- 6911,6934 ----
tail = ftmp;
}
/* Do the firmware node first for 24xx's */
if (fw_done == 0) {
! 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) {
EL(ha, "passed buffer too small; fr=%xh, bsize=%xh\n",
freadpos, bsize);
rval = QL_FUNCTION_FAILED;
break;
}
! 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,6611 ****
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_setup_fnode
--- 6944,6957 ----
EL(ha, "failed, done\n");
} else {
/*
* Release previous fcache resources and update with new
*/
ql_fcache_rel(ha->fcache);
ha->fcache = head;
! QL_PRINT_3(ha, "done\n");
}
}
/*
* ql_setup_fnode
*** 6689,6699 ****
{
uint32_t len;
ql_link_t *link;
ql_adapter_state_t *ha2;
! QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance);
/* Get base path length. */
for (len = (uint32_t)strlen(ha->devpath); len; len--) {
if (ha->devpath[len] == ',' ||
ha->devpath[len] == '@') {
--- 7035,7045 ----
{
uint32_t len;
ql_link_t *link;
ql_adapter_state_t *ha2;
! 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,6732 ****
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 (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_get_fbuf
* Search the fcache list for the type specified
--- 7053,7076 ----
if (strncmp(ha->devpath, ha2->devpath, len) != 0) {
continue;
}
ql_fcache_rel(ha2->fcache);
ha2->fcache = NULL;
! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) {
if (ha2->vcache != NULL) {
kmem_free(ha2->vcache, QL_24XX_VPD_SIZE);
ha2->vcache = NULL;
}
}
(void) ql_setup_fcache(ha2);
}
! QL_PRINT_3(ha, "done\n");
}
/*
* ql_get_fbuf
* Search the fcache list for the type specified
*** 6782,6792 ****
pci_header_t *pcih;
pci_data_t *pcid;
uint32_t doff;
uint8_t *pciinfo;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
if (fcache != NULL) {
pciinfo = fcache->buf;
} else {
EL(ha, "failed, null fcache ptr passed\n");
--- 7126,7136 ----
pci_header_t *pcih;
pci_data_t *pcid;
uint32_t doff;
uint8_t *pciinfo;
! QL_PRINT_3(ha, "started\n");
if (fcache != NULL) {
pciinfo = fcache->buf;
} else {
EL(ha, "failed, null fcache ptr passed\n");
*** 6819,6830 ****
kmem_free(bufp, len);
}
*nextpos = 0xffffffff;
! QL_PRINT_9(CE_CONT, "(%d): CFG_SBUS_CARD, done\n",
! ha->instance);
return (0);
}
if (*nextpos == ha->flash_fw_addr << 2) {
--- 7163,7173 ----
kmem_free(bufp, len);
}
*nextpos = 0xffffffff;
! QL_PRINT_3(ha, "CFG_SBUS_CARD, done\n");
return (0);
}
if (*nextpos == ha->flash_fw_addr << 2) {
*** 6869,6888 ****
(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;
! }
kmem_free(buf, FBUFSIZE);
! QL_PRINT_9(CE_CONT, "(%d): FTYPE_FW, done\n", ha->instance);
return (0);
}
/* get to the pci header image length */
--- 7212,7225 ----
(void) snprintf(fcache->verstr, FCHBA_OPTION_ROM_VERSION_LEN,
"%d.%02d.%02d", fcache->buf[19], fcache->buf[23],
fcache->buf[27]);
! *nextpos = ha->boot_code_addr << 2;
kmem_free(buf, FBUFSIZE);
! QL_PRINT_3(ha, "FTYPE_FW, done\n");
return (0);
}
/* get to the pci header image length */
*** 6906,6917 ****
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_flash_layout_table(ha, *nextpos +
(pcid->imagelength[0] | (pcid->imagelength[1] <<
8)) * PCI_SECTOR_SIZE);
(void) ql_24xx_flash_desc(ha);
}
--- 7243,7254 ----
EL(ha, "failed, data sig mismatch!\n");
return (1);
}
if (pcid->indicator == PCI_IND_LAST_IMAGE) {
! 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,6951 ****
}
(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);
return (0);
}
/*
--- 7278,7288 ----
}
(void) snprintf(fcache->verstr, FCHBA_OPTION_ROM_VERSION_LEN,
"%d.%02d", pcid->revisionlevel[1], pcid->revisionlevel[0]);
! QL_PRINT_3(ha, "done\n");
return (0);
}
/*
*** 6966,6976 ****
uint8_t *bp;
int rval;
uint32_t len, faddr, cnt;
uint16_t chksum, w16;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* 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");
--- 7303,7313 ----
uint8_t *bp;
int rval;
uint32_t len, faddr, cnt;
uint16_t chksum, w16;
! 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,7001 ****
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],
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],
--- 7328,7339 ----
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],
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,7013 ****
kmem_free(bp, len);
ql_process_flt(ha, faddr);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_process_flt
* Obtains flash addresses from flash layout table
--- 7341,7351 ----
kmem_free(bp, len);
ql_process_flt(ha, faddr);
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_process_flt
* Obtains flash addresses from flash layout table
*** 7027,7037 ****
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);
/* Process flash layout table header */
if ((bp = kmem_zalloc(FLASH_LAYOUT_TABLE_SIZE, KM_SLEEP)) == NULL) {
EL(ha, "kmem_zalloc=null\n");
return;
--- 7365,7375 ----
uint8_t *bp, *eaddr, nv_rg, vpd_rg;
int rval;
uint32_t len, cnt, fe_addr;
uint16_t chksum, w16;
! 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,7075 ****
}
eaddr = bp + len;
/* Process Function/Port Configuration Map. */
nv_rg = vpd_rg = 0;
! if (CFG_IST(ha, CFG_CTRL_8021)) {
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],
--- 7403,7413 ----
}
eaddr = bp + len;
/* Process Function/Port Configuration Map. */
nv_rg = vpd_rg = 0;
! 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,7098 ****
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,
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],
--- 7426,7436 ----
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,
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,7109 ****
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 &&
cmp->cfg[i].FunctionNumber[1] == 0) {
nv_rg = cmp->cfg[i].ConfigRegion;
vpd_rg = cmp->cfg[i].VpdRegion;
break;
}
--- 7437,7447 ----
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->pci_function_number &&
cmp->cfg[i].FunctionNumber[1] == 0) {
nv_rg = cmp->cfg[i].ConfigRegion;
vpd_rg = cmp->cfg[i].VpdRegion;
break;
}
*** 7129,7255 ****
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,
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,
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",
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);
}
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 "
"flash_vpd_addr=%xh\n",
ha->instance, faddr);
}
! } else if (!(ha->flags & FUNCTION_1) &&
! !(CFG_IST(ha, CFG_CTRL_8021))) {
ha->flash_vpd_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_vpd_addr=%xh"
! "\n", ha->instance, 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;
ADAPTER_STATE_UNLOCK(ha);
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): nv_rg "
"flash_nvram_addr=%xh\n",
ha->instance, faddr);
}
! } else if (!(ha->flags & FUNCTION_1)) {
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_nvram_addr="
! "%xh\n", ha->instance, 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 "
"flash_vpd_addr=%xh\n",
ha->instance, faddr);
}
! } else if (ha->flags & FUNCTION_1 &&
! !(CFG_IST(ha, CFG_CTRL_8021))) {
ha->flash_vpd_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_vpd_addr=%xh"
! "\n", ha->instance, 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;
ADAPTER_STATE_UNLOCK(ha);
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): nv_rg "
"flash_nvram_addr=%xh\n",
ha->instance, faddr);
}
! } else if (ha->flags & FUNCTION_1) {
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_nvram_addr="
! "%xh\n", ha->instance, faddr);
}
break;
case FLASH_DESC_TABLE_REGION:
! if (!(CFG_IST(ha, CFG_CTRL_8021))) {
ha->flash_desc_addr = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_desc_addr="
! "%xh\n", ha->instance, faddr);
}
break;
case FLASH_ERROR_LOG_0_REGION:
! if (!(ha->flags & FUNCTION_1)) {
ha->flash_errlog_start = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_errlog_addr="
! "%xh\n", ha->instance, faddr);
}
break;
case FLASH_ERROR_LOG_1_REGION:
! if (ha->flags & FUNCTION_1) {
ha->flash_errlog_start = faddr;
! QL_PRINT_9(CE_CONT, "(%d): flash_errlog_addr="
! "%xh\n", ha->instance, faddr);
}
break;
default:
break;
}
}
kmem_free(bp, FLASH_LAYOUT_TABLE_SIZE);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_flash_nvram_defaults
* Flash default addresses.
--- 7467,7593 ----
switch (frgn->region) {
case FLASH_8021_BOOTLOADER_REGION:
ha->bootloader_addr = faddr;
ha->bootloader_size = (fe_addr - faddr) + 1;
! 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(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(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(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(ha, "vpd_rg "
"flash_vpd_addr=%xh\n",
ha->instance, faddr);
}
! } else if (ha->function_number == 0 &&
! !(CFG_IST(ha, CFG_CTRL_82XX))) {
ha->flash_vpd_addr = 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->function_number = 0;
ADAPTER_STATE_UNLOCK(ha);
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(ha, "nv_rg "
"flash_nvram_addr=%xh\n",
ha->instance, faddr);
}
! } else if (ha->function_number == 0) {
ha->flash_nvram_addr = 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(ha, "vpd_rg "
"flash_vpd_addr=%xh\n",
ha->instance, faddr);
}
! } else if (ha->function_number &&
! !(CFG_IST(ha, CFG_CTRL_82XX))) {
ha->flash_vpd_addr = 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->function_number = 1;
ADAPTER_STATE_UNLOCK(ha);
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(ha, "nv_rg "
"flash_nvram_addr=%xh\n",
ha->instance, faddr);
}
! } else if (ha->function_number) {
ha->flash_nvram_addr = faddr;
! QL_PRINT_9(ha, "flash_nvram_addr="
! "%xh\n", faddr);
}
break;
case FLASH_DESC_TABLE_REGION:
! if (!(CFG_IST(ha, CFG_CTRL_82XX))) {
ha->flash_desc_addr = faddr;
! QL_PRINT_9(ha, "flash_desc_addr="
! "%xh\n", faddr);
}
break;
case FLASH_ERROR_LOG_0_REGION:
! if (ha->function_number == 0) {
ha->flash_errlog_start = faddr;
! QL_PRINT_9(ha, "flash_errlog_addr="
! "%xh\n", faddr);
}
break;
case FLASH_ERROR_LOG_1_REGION:
! if (ha->function_number) {
ha->flash_errlog_start = faddr;
! QL_PRINT_9(ha, "flash_errlog_addr="
! "%xh\n", faddr);
}
break;
default:
break;
}
}
kmem_free(bp, FLASH_LAYOUT_TABLE_SIZE);
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_flash_nvram_defaults
* Flash default addresses.
*** 7264,7356 ****
* Kernel context.
*/
static void
ql_flash_nvram_defaults(ql_adapter_state_t *ha)
{
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
! if (ha->flags & FUNCTION_1) {
! if (CFG_IST(ha, CFG_CTRL_2300)) {
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->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;
} 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;
} 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->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;
! }
} else {
! if (CFG_IST(ha, CFG_CTRL_2200)) {
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->flash_nvram_addr = NVRAM_2300_FUNC0_ADDR;
ha->flash_fw_addr = FLASH_2300_FIRMWARE_ADDR;
! } else if (CFG_IST(ha, CFG_CTRL_2422)) {
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;
} 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;
} 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->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;
} else {
! EL(ha, "unassigned flash fn0 addr: %x\n",
! ha->device_id);
}
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_sfp
* Returns sfp data to sdmapi caller
--- 7602,7782 ----
* Kernel context.
*/
static void
ql_flash_nvram_defaults(ql_adapter_state_t *ha)
{
! QL_PRINT_10(ha, "started\n");
! 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;
! 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;
! 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 {
! 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;
! 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;
! 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;
! 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 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_10(ha, "done\n");
}
/*
* ql_get_sfp
* Returns sfp data to sdmapi caller
*** 7367,7379 ****
* 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);
! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) {
cmd->Status = EXT_STATUS_INVALID_REQUEST;
EL(ha, "failed, invalid request for HBA\n");
return;
}
--- 7793,7805 ----
* Kernel context.
*/
static void
ql_get_sfp(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! QL_PRINT_9(ha, "started\n");
! 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,7402 ****
EL(ha, "failed, copy error\n");
} else {
cmd->Status = EXT_STATUS_OK;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_dump_sfp
* Dumps SFP.
--- 7818,7828 ----
EL(ha, "failed, copy error\n");
} else {
cmd->Status = EXT_STATUS_OK;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_dump_sfp
* Dumps SFP.
*** 7417,7427 ****
dma_mem_t mem;
uint32_t cnt;
int rval2, rval = 0;
uint32_t dxfer;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* Get memory for SFP. */
if ((rval2 = ql_get_dma_mem(ha, &mem, 64, LITTLE_ENDIAN_DMA,
QL_DMA_DATA_ALIGN)) != QL_SUCCESS) {
--- 7843,7853 ----
dma_mem_t mem;
uint32_t cnt;
int rval2, rval = 0;
uint32_t dxfer;
! 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,7462 ****
bp = (caddr_t)bp + mem.size;
}
ql_free_phys(ha, &mem);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (rval);
}
/*
--- 7878,7888 ----
bp = (caddr_t)bp + mem.size;
}
ql_free_phys(ha, &mem);
! QL_PRINT_9(ha, "done\n");
return (rval);
}
/*
*** 7482,7494 ****
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);
! if (CFG_IST(ha, CFG_CTRL_242581) == 0) {
EL(ha, "invalid request for this HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 7908,7920 ----
ql_tgt_t *tq;
EXT_PORT_PARAM port_param = {0};
uint32_t rval = QL_SUCCESS;
uint32_t idma_rate;
! QL_PRINT_9(ha, "started\n");
! 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,7531 ****
return;
}
name = port_param.FCScsiAddr.DestAddr.WWPN;
! QL_PRINT_9(CE_CONT, "(%d): 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)) {
EL(ha, "failed, fc_port not found\n");
cmd->Status = EXT_STATUS_DEV_NOT_FOUND;
cmd->ResponseLen = 0;
return;
}
--- 7942,7958 ----
return;
}
name = port_param.FCScsiAddr.DestAddr.WWPN;
! 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) ||
! 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,7575 ****
--- 7993,8010 ----
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,7619 ****
break;
case EXT_DEF_PORTSPEED_8GBIT:
idma_rate = IIDMA_RATE_8GB;
break;
case EXT_DEF_PORTSPEED_10GBIT:
! port_param.Speed = IIDMA_RATE_10GB;
break;
default:
EL(ha, "invalid set iidma rate: %x\n",
port_param.Speed);
cmd->Status = EXT_STATUS_INVALID_PARAM;
cmd->ResponseLen = 0;
--- 8043,8060 ----
break;
case EXT_DEF_PORTSPEED_8GBIT:
idma_rate = IIDMA_RATE_8GB;
break;
case EXT_DEF_PORTSPEED_10GBIT:
! 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,7648 ****
cmd->ResponseLen = 0;
cmd->DetailStatus = 0;
break;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_fwexttrace
* Dumps f/w extended trace buffer
--- 8079,8089 ----
cmd->ResponseLen = 0;
cmd->DetailStatus = 0;
break;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fwexttrace
* Dumps f/w extended trace buffer
*** 7662,7674 ****
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);
! if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
EL(ha, "invalid request for this HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 8103,8115 ----
ql_get_fwexttrace(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int rval;
caddr_t payload;
! QL_PRINT_9(ha, "started\n");
! 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,7709 ****
cmd->ResponseLen = 0;
return;
}
/* Time Stamp */
! rval = ql_fw_etrace(ha, &ha->fwexttracebuf, FTO_INSERT_TIME_STAMP);
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);
if (rval != QL_SUCCESS) {
EL(ha, "f/w extended trace disable failed: %xh\n", rval);
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
return;
--- 8130,8152 ----
cmd->ResponseLen = 0;
return;
}
/* 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,
! 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,7747 ****
cmd->Status = EXT_STATUS_OK;
}
kmem_free(payload, FWEXTSIZE);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_fwfcetrace
* Dumps f/w fibre channel event trace buffer
--- 8180,8190 ----
cmd->Status = EXT_STATUS_OK;
}
kmem_free(payload, FWEXTSIZE);
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fwfcetrace
* Dumps f/w fibre channel event trace buffer
*** 7759,7773 ****
/* ARGSUSED */
static void
ql_get_fwfcetrace(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);
! if (CFG_IST(ha, CFG_CTRL_24258081) == 0) {
EL(ha, "invalid request for this HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 8202,8220 ----
/* ARGSUSED */
static void
ql_get_fwfcetrace(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int rval;
! 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(ha, "started\n");
! 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,7836 ****
cmd->ResponseLen = 0;
return;
}
/* Disable Tracing */
! rval = ql_fw_etrace(ha, &ha->fwfcetracebuf, FTO_FCE_TRACE_DISABLE);
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) {
EL(ha, "failed, kmem_zalloc\n");
cmd->Status = EXT_STATUS_NO_MEMORY;
cmd->ResponseLen = 0;
return;
}
/* 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,
(uint8_t *)ha->fwfcetracebuf.bp, FWFCESIZE,
DDI_DEV_AUTOINCR);
/* Send payload to application. */
! if (ql_send_buffer_data(payload, (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);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_pci_data
* Retrieves pci config space data
--- 8235,8321 ----
cmd->ResponseLen = 0;
return;
}
/* Disable Tracing */
! 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 */
! 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 *)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((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;
}
! /* 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");
! }
! kmem_free(fce_trace, FWFCESIZE);
!
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_pci_data
* Retrieves pci config space data
*** 7852,7862 ****
{
uint8_t cap_ptr;
uint8_t cap_id;
uint32_t buf_size = 256;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/*
* First check the "Capabilities List" bit of the status register.
*/
if (ql_pci_config_get16(ha, PCI_CONF_STAT) & PCI_STAT_CAP) {
--- 8337,8347 ----
{
uint8_t cap_ptr;
uint8_t cap_id;
uint32_t buf_size = 256;
! 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,7905 ****
} else {
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = buf_size;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_pci_dump
* Dumps PCI config data to application buffer.
--- 8380,8390 ----
} else {
cmd->Status = EXT_STATUS_OK;
cmd->DetailStatus = buf_size;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_pci_dump
* Dumps PCI config data to application buffer.
*** 7917,7927 ****
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);
ptr32 = kmem_zalloc(pci_size, KM_SLEEP);
if (ptr32 == NULL) {
EL(ha, "failed kmem_zalloc\n");
return (ENOMEM);
--- 8402,8412 ----
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(ha, "started\n");
ptr32 = kmem_zalloc(pci_size, KM_SLEEP);
if (ptr32 == NULL) {
EL(ha, "failed kmem_zalloc\n");
return (ENOMEM);
*** 7944,7954 ****
QL_DUMP_9(org_ptr32, 8, pci_size);
kmem_free(org_ptr32, pci_size);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
return (0);
}
/*
--- 8429,8439 ----
QL_DUMP_9(org_ptr32, 8, pci_size);
kmem_free(org_ptr32, pci_size);
! QL_PRINT_9(ha, "done\n");
return (0);
}
/*
*** 7970,7980 ****
{
EXT_MENLO_RESET rst;
ql_mbx_data_t mr;
int rval;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
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;
--- 8455,8465 ----
{
EXT_MENLO_RESET rst;
ql_mbx_data_t mr;
int rval;
! 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,8037 ****
cmd->ResponseLen = 0;
}
ql_restart_hba(ha);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_menlo_get_fw_version
* Get Menlo firmware version.
--- 8512,8522 ----
cmd->ResponseLen = 0;
}
ql_restart_hba(ha);
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_menlo_get_fw_version
* Get Menlo firmware version.
*** 8051,8061 ****
{
int rval;
ql_mbx_iocb_t *pkt;
EXT_MENLO_GET_FW_VERSION ver = {0};
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
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;
--- 8536,8546 ----
{
int rval;
ql_mbx_iocb_t *pkt;
EXT_MENLO_GET_FW_VERSION ver = {0};
! 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,8119 ****
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_menlo_update_fw
* Get Menlo update firmware.
--- 8594,8604 ----
cmd->ResponseLen = sizeof (EXT_MENLO_GET_FW_VERSION);
}
kmem_free(pkt, sizeof (ql_mbx_iocb_t));
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_menlo_update_fw
* Get Menlo update firmware.
*** 8135,8145 ****
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);
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;
--- 8620,8630 ----
dma_mem_t *dma_mem;
EXT_MENLO_UPDATE_FW fw;
uint32_t *ptr32;
int rval;
! 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,8209 ****
}
/* 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);
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;
--- 8683,8694 ----
}
/* 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, "%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,8247 ****
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)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->mvfy.dseg_0_address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
! pkt->mvfy.dseg_0_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);
--- 8718,8732 ----
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.address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->mvfy.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
! 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,8270 ****
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_menlo_manage_info
* Get Menlo manage info.
--- 8745,8755 ----
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(ha, "done\n");
}
/*
* ql_menlo_manage_info
* Get Menlo manage info.
*** 8285,8306 ****
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);
/* The call is only supported for Schultz right now */
! if (CFG_IST(ha, CFG_CTRL_8081)) {
ql_get_xgmac_statistics(ha, cmd, mode);
! QL_PRINT_9(CE_CONT, "(%d): CFG_CTRL_81XX done\n",
! ha->instance);
return;
}
! if (!CFG_IST(ha, CFG_CTRL_8081) || !CFG_IST(ha, CFG_CTRL_MENLO)) {
EL(ha, "failed, invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 8770,8790 ----
ql_mbx_iocb_t *pkt;
dma_mem_t *dma_mem = NULL;
EXT_MENLO_MANAGE_INFO info;
int rval;
! QL_PRINT_9(ha, "started\n");
/* The call is only supported for Schultz right now */
! if (CFG_IST(ha, CFG_FCOE_SUPPORT)) {
ql_get_xgmac_statistics(ha, cmd, mode);
! QL_PRINT_9(ha, "CFG_FCOE_SUPPORT done\n");
return;
}
! 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,8365 ****
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);
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;
--- 8838,8849 ----
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, "%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,8394 ****
}
(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)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->mdata.dseg_0_address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
! pkt->mdata.dseg_0_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);
--- 8864,8878 ----
}
(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.address[0] = (uint32_t)
LE_32(LSD(dma_mem->cookie.dmac_laddress));
! pkt->mdata.dseg.address[1] = (uint32_t)
LE_32(MSD(dma_mem->cookie.dmac_laddress));
! 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,8438 ****
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_suspend_hba
* Suspends all adapter ports.
--- 8912,8922 ----
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(ha, "done\n");
}
/*
* ql_suspend_hba
* Suspends all adapter ports.
*** 8523,8533 ****
PEXT_VPORT_ID_CNT ptmp_vp;
int id = 0;
int rval;
char name[MAXPATHLEN];
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/*
* To be backward compatible with older API
* check for the size of old EXT_VPORT_ID_CNT
*/
--- 9007,9017 ----
PEXT_VPORT_ID_CNT ptmp_vp;
int id = 0;
int rval;
char name[MAXPATHLEN];
! QL_PRINT_9(ha, "started\n");
/*
* To be backward compatible with older API
* check for the size of old EXT_VPORT_ID_CNT
*/
*** 8551,8561 ****
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);
ptmp_vp->VpDrvInst[id] = (int32_t)vha->instance;
id++;
vha = vha->vp_next;
}
rval = ddi_copyout((void *)ptmp_vp,
--- 9035,9046 ----
vha = ha->vp_next;
while (vha != NULL) {
ptmp_vp->VpCnt++;
ptmp_vp->VpId[id] = vha->vp_index;
(void) ddi_pathname(vha->dip, 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,8578 ****
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",
ha->instance, ptmp_vp->VpCnt);
}
!
}
/*
* ql_vp_ioctl
* Performs all EXT_CC_VPORT_CMD functions.
--- 9050,9063 ----
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(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,8599 ****
* 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,
cmd->SubCode);
/* case off on command subcode */
switch (cmd->SubCode) {
case EXT_VF_SC_VPORT_GETINFO:
--- 9074,9084 ----
* Kernel context.
*/
static void
ql_vp_ioctl(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
! 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,8615 ****
EL(ha, "failed, Unsupported Subcode=%xh\n",
cmd->SubCode);
break;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_qry_vport
* Performs EXT_VF_SC_VPORT_GETINFO subfunction.
--- 9090,9100 ----
EL(ha, "failed, Unsupported Subcode=%xh\n",
cmd->SubCode);
break;
}
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_qry_vport
* Performs EXT_VF_SC_VPORT_GETINFO subfunction.
*** 8628,8640 ****
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);
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",
--- 9113,9124 ----
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};
! 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,8668 ****
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 (ddi_copyout((void *)&tmp_vport,
(void *)(uintptr_t)(cmd->ResponseAdr),
sizeof (EXT_VPORT_INFO), mode) != 0) {
--- 9139,9150 ----
while (tmp_vha != NULL) {
tmp_vport.used++;
tmp_vha = tmp_vha->vp_next;
}
! 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,8679 ****
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_access_flash
--- 9151,9161 ----
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(vha, "done\n", vha->instance);
}
}
/*
* ql_access_flash
*** 8693,8704 ****
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);
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) {
--- 9175,9195 ----
static void
ql_access_flash(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
int rval;
! 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,8735 ****
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
break;
}
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_reset_cmd
* Performs all EXT_CC_RESET_FW_OS functions.
--- 9216,9233 ----
cmd->Status = EXT_STATUS_ERR;
cmd->ResponseLen = 0;
break;
}
! /* 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,8777 ****
* 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);
switch (cmd->SubCode) {
case EXT_SC_RESET_FC_FW:
EL(ha, "isp_abort_needed\n");
ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED, 0);
break;
case EXT_SC_RESET_MPI_FW:
! if (!(CFG_IST(ha, CFG_CTRL_81XX))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
} else {
/* 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.
*/
--- 9243,9294 ----
* Kernel context.
*/
static void
ql_reset_cmd(ql_adapter_state_t *ha, EXT_IOCTL *cmd)
{
! 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_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 {
/*
* 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,8802 ****
/* Delay for 1 second. */
ql_delay(ha, 1000000);
}
}
ql_restart_hba(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_get_dcbx_parameters
* Get DCBX parameters.
--- 9300,9323 ----
/* 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(ha, "done\n");
}
/*
* ql_get_dcbx_parameters
* Get DCBX parameters.
*** 8810,8822 ****
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);
! if (!(CFG_IST(ha, CFG_CTRL_8081))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 9331,9343 ----
ql_get_dcbx_parameters(ql_adapter_state_t *ha, EXT_IOCTL *cmd, int mode)
{
uint8_t *tmp_buf;
int rval;
! QL_PRINT_9(ha, "started\n");
! 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,8858 ****
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);
}
kmem_free(tmp_buf, EXT_DEF_DCBX_PARAM_BUF_SIZE);
}
--- 9369,9379 ----
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(ha, "done\n");
}
kmem_free(tmp_buf, EXT_DEF_DCBX_PARAM_BUF_SIZE);
}
*** 8874,8886 ****
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);
! if (!(CFG_IST(ha, CFG_CTRL_8081))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 9395,9407 ----
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(ha, "started\n");
! 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,8915 ****
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_qry_adapter_versions
--- 9426,9436 ----
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(ha, "done\n");
}
}
/*
* ql_qry_adapter_versions
*** 8932,8942 ****
{
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);
/* 8142s do not have a EDC PHY firmware. */
mpi_cap = (uint8_t)(ha->mpi_capability_list >> 8);
is_8142 = 0;
--- 9453,9463 ----
{
uint8_t is_8142, mpi_cap;
uint32_t ver_len, transfer_size;
PEXT_ADAPTERREGIONVERSION padapter_ver = NULL;
! 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,9016 ****
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);
}
kmem_free(padapter_ver, ver_len);
}
--- 9527,9537 ----
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
EL(ha, "failed, ddi_copyout\n");
} else {
cmd->ResponseLen = ver_len;
! QL_PRINT_9(ha, "done\n");
}
kmem_free(padapter_ver, ver_len);
}
*** 9035,9045 ****
int rval;
uint32_t size;
int8_t *tmp_buf;
EXT_MENLO_MANAGE_INFO info;
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
/* Verify the size of request structure. */
if (cmd->RequestLen < sizeof (EXT_MENLO_MANAGE_INFO)) {
/* Return error */
EL(ha, "RequestLen=%d < %d\n", cmd->RequestLen,
--- 9556,9566 ----
int rval;
uint32_t size;
int8_t *tmp_buf;
EXT_MENLO_MANAGE_INFO info;
! 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,9115 ****
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);
}
kmem_free(tmp_buf, size);
! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance);
}
/*
* ql_get_fcf_list
* Get FCF list.
--- 9623,9636 ----
EL(ha, "failed, ddi_copyout\n");
cmd->Status = EXT_STATUS_COPY_ERR;
cmd->ResponseLen = 0;
} else {
cmd->ResponseLen = info.TotalByteCount;
! QL_PRINT_9(ha, "done\n");
}
kmem_free(tmp_buf, size);
! QL_PRINT_9(ha, "done\n");
}
/*
* ql_get_fcf_list
* Get FCF list.
*** 9125,9137 ****
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);
! if (!(CFG_IST(ha, CFG_CTRL_81XX))) {
EL(ha, "invalid request for HBA\n");
cmd->Status = EXT_STATUS_INVALID_REQUEST;
cmd->ResponseLen = 0;
return;
}
--- 9646,9658 ----
uint8_t *tmp_buf;
int rval;
EXT_FCF_LIST fcf_list = {0};
ql_fcf_list_desc_t mb_fcf_list = {0};
! QL_PRINT_9(ha, "started\n");
! 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,9197 ****
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);
}
kmem_free(tmp_buf, fcf_list.BufSize);
}
--- 9708,9718 ----
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(ha, "done\n");
}
kmem_free(tmp_buf, fcf_list.BufSize);
}
*** 9209,9227 ****
{
int rval;
ql_mbx_data_t mr;
EXT_RESOURCE_CNTS tmp_rc_cnt = {0};
! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance);
- 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);
--- 9730,9741 ----
{
int rval;
ql_mbx_data_t mr;
EXT_RESOURCE_CNTS tmp_rc_cnt = {0};
! QL_PRINT_9(ha, "started\n");
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,9252 ****
--- 9755,9770 ----
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,9260 ****
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);
}
}
--- 9771,10724 ----
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(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");
}