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, &reg_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, &reg_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"); }