Print this page
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,42 **** * 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. */ ! #pragma ident "Copyright 2010 QLogic Corporation; ql_ioctl.c" /* * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file. * Fibre Channel Adapter (FCA) driver IOCTL source file. * * *********************************************************************** * * ** * * NOTICE ** ! * * COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION ** * * ALL RIGHTS RESERVED ** * * ** * *********************************************************************** * */ --- 17,42 ---- * 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. */ ! #pragma ident "Copyright 2015 QLogic Corporation; ql_ioctl.c" /* * ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file. * Fibre Channel Adapter (FCA) driver IOCTL source file. * * *********************************************************************** * * ** * * NOTICE ** ! * * COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION ** * * ALL RIGHTS RESERVED ** * * ** * *********************************************************************** * */
*** 45,54 **** --- 45,55 ---- #include <ql_api.h> #include <ql_debug.h> #include <ql_init.h> #include <ql_ioctl.h> #include <ql_mbx.h> + #include <ql_nx.h> #include <ql_xioctl.h> /* * Local Function Prototypes. */
*** 66,75 **** --- 67,78 ---- static int ql_adm_device_list(ql_adapter_state_t *, ql_adm_op_t *, int); static int ql_adm_update_properties(ql_adapter_state_t *); static int ql_adm_prop_update_int(ql_adapter_state_t *, ql_adm_op_t *, int); static int ql_adm_loop_reset(ql_adapter_state_t *); static int ql_adm_fw_dump(ql_adapter_state_t *, ql_adm_op_t *, void *, int); + static int ql_adm_fw_t_dump(ql_adapter_state_t *); + static int ql_adm_beacon(ql_adapter_state_t *, ql_adm_op_t *); static int ql_adm_nvram_dump(ql_adapter_state_t *, ql_adm_op_t *, int); static int ql_adm_nvram_load(ql_adapter_state_t *, ql_adm_op_t *, int); static int ql_adm_flash_load(ql_adapter_state_t *, ql_adm_op_t *, int); static int ql_adm_vpd_dump(ql_adapter_state_t *, ql_adm_op_t *, int); static int ql_adm_vpd_load(ql_adapter_state_t *, ql_adm_op_t *, int);
*** 104,123 **** ql_adapter_state_t *ha; int rval = 0; ha = ddi_get_soft_state(ql_state, (int32_t)getminor(*dev_p)); if (ha == NULL) { ! QL_PRINT_2(CE_CONT, "failed, no adapter\n"); return (ENXIO); } ! QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance); /* Allow only character opens */ if (otyp != OTYP_CHR) { ! QL_PRINT_2(CE_CONT, "(%d): failed, open type\n", ! ha->instance); return (EINVAL); } ADAPTER_STATE_LOCK(ha); if (flags & FEXCL && ha->flags & QL_OPENED) { --- 107,125 ---- ql_adapter_state_t *ha; int rval = 0; ha = ddi_get_soft_state(ql_state, (int32_t)getminor(*dev_p)); if (ha == NULL) { ! QL_PRINT_2(NULL, "failed, no adapter\n"); return (ENXIO); } ! QL_PRINT_3(ha, "started\n"); /* Allow only character opens */ if (otyp != OTYP_CHR) { ! QL_PRINT_2(ha, "failed, open type\n"); return (EINVAL); } ADAPTER_STATE_LOCK(ha); if (flags & FEXCL && ha->flags & QL_OPENED) {
*** 130,140 **** if (rval != 0) { EL(ha, "failed, rval = %xh\n", rval); } else { /*EMPTY*/ ! QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } /* --- 132,142 ---- if (rval != 0) { EL(ha, "failed, rval = %xh\n", rval); } else { /*EMPTY*/ ! QL_PRINT_3(ha, "done\n"); } return (rval); } /*
*** 160,178 **** ql_adapter_state_t *ha; int rval = 0; ha = ddi_get_soft_state(ql_state, (int32_t)getminor(dev)); if (ha == NULL) { ! QL_PRINT_2(CE_CONT, "failed, no adapter\n"); return (ENXIO); } ! QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance); if (otyp != OTYP_CHR) { ! QL_PRINT_2(CE_CONT, "(%d): failed, open type\n", ! ha->instance); return (EINVAL); } ADAPTER_STATE_LOCK(ha); ha->flags &= ~QL_OPENED; --- 162,179 ---- ql_adapter_state_t *ha; int rval = 0; ha = ddi_get_soft_state(ql_state, (int32_t)getminor(dev)); if (ha == NULL) { ! QL_PRINT_2(ha, "failed, no adapter\n"); return (ENXIO); } ! QL_PRINT_3(ha, "started\n"); if (otyp != OTYP_CHR) { ! QL_PRINT_2(ha, "failed, open type\n"); return (EINVAL); } ADAPTER_STATE_LOCK(ha); ha->flags &= ~QL_OPENED;
*** 180,190 **** if (rval != 0) { EL(ha, "failed, rval = %xh\n", rval); } else { /*EMPTY*/ ! QL_PRINT_3(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } /* --- 181,191 ---- if (rval != 0) { EL(ha, "failed, rval = %xh\n", rval); } else { /*EMPTY*/ ! QL_PRINT_3(ha, "done\n"); } return (rval); } /*
*** 212,239 **** { ql_adapter_state_t *ha; int rval = 0; if (ddi_in_panic()) { ! QL_PRINT_2(CE_CONT, "ql_ioctl: ddi_in_panic exit\n"); return (ENOPROTOOPT); } ha = ddi_get_soft_state(ql_state, (int32_t)getminor(dev)); if (ha == NULL) { ! QL_PRINT_2(CE_CONT, "failed, no adapter\n"); return (ENXIO); } ! QL_PRINT_3(CE_CONT, "(%d): started\n", ha->instance); /* * Quick clean exit for qla2x00 foapi calls which are * not supported in qlc. */ if (cmd >= QL_FOAPI_START && cmd <= QL_FOAPI_END) { ! QL_PRINT_9(CE_CONT, "failed, fo api not supported\n"); return (ENOTTY); } /* PWR management busy. */ rval = ql_busy_notification(ha); --- 213,240 ---- { ql_adapter_state_t *ha; int rval = 0; if (ddi_in_panic()) { ! QL_PRINT_2(NULL, "ql_ioctl: ddi_in_panic exit\n"); return (ENOPROTOOPT); } ha = ddi_get_soft_state(ql_state, (int32_t)getminor(dev)); if (ha == NULL) { ! QL_PRINT_2(ha, "failed, no adapter\n"); return (ENXIO); } ! QL_PRINT_3(ha, "started\n"); /* * Quick clean exit for qla2x00 foapi calls which are * not supported in qlc. */ if (cmd >= QL_FOAPI_START && cmd <= QL_FOAPI_END) { ! QL_PRINT_9(ha, "failed, fo api not supported\n"); return (ENOTTY); } /* PWR management busy. */ rval = ql_busy_notification(ha);
*** 304,314 **** if (cmd != EXT_CC_VPORT_CMD) { EL(ha, "failed, cmd=%d rval=%d\n", cmd, rval); } } else { /*EMPTY*/ ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } /* --- 305,315 ---- if (cmd != EXT_CC_VPORT_CMD) { EL(ha, "failed, cmd=%d rval=%d\n", cmd, rval); } } else { /*EMPTY*/ ! QL_PRINT_9(ha, "done\n"); } return (rval); } /*
*** 330,348 **** { if (!ha->pm_capable) { return (FC_SUCCESS); } ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); QL_PM_LOCK(ha); ! ha->busy++; QL_PM_UNLOCK(ha); if (pm_busy_component(ha->dip, 0) != DDI_SUCCESS) { QL_PM_LOCK(ha); ! ha->busy--; QL_PM_UNLOCK(ha); EL(ha, "pm_busy_component failed = %xh\n", FC_FAILURE); return (FC_FAILURE); } --- 331,351 ---- { if (!ha->pm_capable) { return (FC_SUCCESS); } ! QL_PRINT_9(ha, "started\n"); QL_PM_LOCK(ha); ! ha->pm_busy++; QL_PM_UNLOCK(ha); if (pm_busy_component(ha->dip, 0) != DDI_SUCCESS) { QL_PM_LOCK(ha); ! if (ha->pm_busy) { ! ha->pm_busy--; ! } QL_PM_UNLOCK(ha); EL(ha, "pm_busy_component failed = %xh\n", FC_FAILURE); return (FC_FAILURE); }
*** 350,368 **** QL_PM_LOCK(ha); if (ha->power_level != PM_LEVEL_D0) { QL_PM_UNLOCK(ha); if (pm_raise_power(ha->dip, 0, 1) != DDI_SUCCESS) { QL_PM_LOCK(ha); ! ha->busy--; QL_PM_UNLOCK(ha); return (FC_FAILURE); } } else { QL_PM_UNLOCK(ha); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (FC_SUCCESS); } /* --- 353,373 ---- QL_PM_LOCK(ha); if (ha->power_level != PM_LEVEL_D0) { QL_PM_UNLOCK(ha); if (pm_raise_power(ha->dip, 0, 1) != DDI_SUCCESS) { QL_PM_LOCK(ha); ! if (ha->pm_busy) { ! ha->pm_busy--; ! } QL_PM_UNLOCK(ha); return (FC_FAILURE); } } else { QL_PM_UNLOCK(ha); } ! QL_PRINT_9(ha, "done\n"); return (FC_SUCCESS); } /*
*** 384,405 **** { if (!ha->pm_capable) { return (FC_SUCCESS); } ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (pm_idle_component(ha->dip, 0) != DDI_SUCCESS) { EL(ha, "pm_idle_component failed = %xh\n", FC_FAILURE); return (FC_FAILURE); } QL_PM_LOCK(ha); ! ha->busy--; QL_PM_UNLOCK(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (FC_SUCCESS); } /* --- 389,412 ---- { if (!ha->pm_capable) { return (FC_SUCCESS); } ! QL_PRINT_9(ha, "started\n"); if (pm_idle_component(ha->dip, 0) != DDI_SUCCESS) { EL(ha, "pm_idle_component failed = %xh\n", FC_FAILURE); return (FC_FAILURE); } QL_PM_LOCK(ha); ! if (ha->pm_busy) { ! ha->pm_busy--; ! } QL_PM_UNLOCK(ha); ! QL_PRINT_9(ha, "done\n"); return (FC_SUCCESS); } /*
*** 413,425 **** uint32_t nv_cmd; uint32_t start_addr; int rval; uint32_t offset = offsetof(nvram_t, adapter_features); ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if (CFG_IST(ha, CFG_CTRL_24258081)) { EL(ha, "Not supported for 24xx\n"); return (EINVAL); } /* --- 420,432 ---- uint32_t nv_cmd; uint32_t start_addr; int rval; uint32_t offset = offsetof(nvram_t, adapter_features); ! QL_PRINT_9(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) { EL(ha, "Not supported for 24xx\n"); return (EINVAL); } /*
*** 475,485 **** */ WRT16_IO_REG(ha, nvram, NV_DESELECT); ql_release_nvram(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 482,492 ---- */ WRT16_IO_REG(ha, nvram, NV_DESELECT); ql_release_nvram(ha); ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 494,506 **** uint16_t *wptr; uint8_t *bptr; uint8_t csum; uint32_t start_addr; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if (CFG_IST(ha, CFG_CTRL_24258081)) { EL(ha, "Not supported for 24xx\n"); return (EINVAL); } nv = kmem_zalloc(sizeof (*nv), KM_SLEEP); --- 501,513 ---- uint16_t *wptr; uint8_t *bptr; uint8_t csum; uint32_t start_addr; ! QL_PRINT_9(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) { EL(ha, "Not supported for 24xx\n"); return (EINVAL); } nv = kmem_zalloc(sizeof (*nv), KM_SLEEP);
*** 579,589 **** } kmem_free(nv, sizeof (*nv)); ql_release_nvram(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (rval); } /* --- 586,596 ---- } kmem_free(nv, sizeof (*nv)); ql_release_nvram(ha); ! QL_PRINT_9(ha, "done\n"); return (rval); } /*
*** 594,613 **** { int rval; uint32_t count; uint32_t start_addr; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); rval = ql_lock_nvram(ha, &start_addr, LNF_NVRAM_DATA); if (rval != QL_SUCCESS) { EL(ha, "failed, ql_lock_nvram=%xh\n", rval); return (EIO); } rval = 0; ! if (CFG_IST(ha, CFG_CTRL_24258081)) { nvram_24xx_t *nv; uint32_t *longptr; uint32_t csum = 0; nv = kmem_zalloc(sizeof (*nv), KM_SLEEP); --- 601,620 ---- { int rval; uint32_t count; uint32_t start_addr; ! QL_PRINT_9(ha, "started\n"); rval = ql_lock_nvram(ha, &start_addr, LNF_NVRAM_DATA); if (rval != QL_SUCCESS) { EL(ha, "failed, ql_lock_nvram=%xh\n", rval); return (EIO); } rval = 0; ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) { nvram_24xx_t *nv; uint32_t *longptr; uint32_t csum = 0; nv = kmem_zalloc(sizeof (*nv), KM_SLEEP);
*** 643,653 **** /* * compute the chesksum now */ longptr = (uint32_t *)nv; csum = 0; ! for (count = 0; count < (sizeof (nvram_24xx_t)/4)-1; count++) { csum += *longptr; longptr++; } csum = (uint32_t)(~csum + 1); LITTLE_ENDIAN_32((long)csum); --- 650,661 ---- /* * compute the chesksum now */ longptr = (uint32_t *)nv; csum = 0; ! for (count = 0; count < (sizeof (nvram_24xx_t) / 4) - 1; ! count++) { csum += *longptr; longptr++; } csum = (uint32_t)(~csum + 1); LITTLE_ENDIAN_32((long)csum);
*** 757,767 **** } kmem_free(nv, sizeof (*nv)); } ql_release_nvram(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (rval); } static void --- 765,775 ---- } kmem_free(nv, sizeof (*nv)); } ql_release_nvram(ha); ! QL_PRINT_9(ha, "done\n"); return (rval); } static void
*** 875,892 **** ql_24xx_load_nvram(ql_adapter_state_t *ha, uint32_t addr, uint32_t value) { int rval; /* Enable flash write. */ ! if (!(CFG_IST(ha, CFG_CTRL_8081))) { WRT32_IO_REG(ha, ctrl_status, RD32_IO_REG(ha, ctrl_status) | ISP_FLASH_ENABLE); RD32_IO_REG(ha, ctrl_status); /* PCI Posting. */ } /* Disable NVRAM write-protection. */ ! if (CFG_IST(ha, CFG_CTRL_2422)) { (void) ql_24xx_write_flash(ha, NVRAM_CONF_ADDR | 0x101, 0); } else { if ((rval = ql_24xx_unprotect_flash(ha)) != QL_SUCCESS) { EL(ha, "unprotect_flash failed, rval=%xh\n", rval); return (rval); --- 883,900 ---- ql_24xx_load_nvram(ql_adapter_state_t *ha, uint32_t addr, uint32_t value) { int rval; /* Enable flash write. */ ! if (!(CFG_IST(ha, CFG_FCOE_SUPPORT))) { WRT32_IO_REG(ha, ctrl_status, RD32_IO_REG(ha, ctrl_status) | ISP_FLASH_ENABLE); RD32_IO_REG(ha, ctrl_status); /* PCI Posting. */ } /* Disable NVRAM write-protection. */ ! if (CFG_IST(ha, CFG_CTRL_24XX)) { (void) ql_24xx_write_flash(ha, NVRAM_CONF_ADDR | 0x101, 0); } else { if ((rval = ql_24xx_unprotect_flash(ha)) != QL_SUCCESS) { EL(ha, "unprotect_flash failed, rval=%xh\n", rval); return (rval);
*** 895,905 **** /* Write to flash. */ rval = ql_24xx_write_flash(ha, addr, value); /* Enable NVRAM write-protection. */ ! if (CFG_IST(ha, CFG_CTRL_2422)) { /* TODO: Check if 0x8c is correct -- sb: 0x9c ? */ (void) ql_24xx_write_flash(ha, NVRAM_CONF_ADDR | 0x101, 0x8c); } else { ql_24xx_protect_flash(ha); } --- 903,913 ---- /* Write to flash. */ rval = ql_24xx_write_flash(ha, addr, value); /* Enable NVRAM write-protection. */ ! if (CFG_IST(ha, CFG_CTRL_24XX)) { /* TODO: Check if 0x8c is correct -- sb: 0x9c ? */ (void) ql_24xx_write_flash(ha, NVRAM_CONF_ADDR | 0x101, 0x8c); } else { ql_24xx_protect_flash(ha); }
*** 936,946 **** uint16_t data; uint32_t start_addr, *lptr, data32; nvram_t *nptr; int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if ((nv = kmem_zalloc(ha->nvram_cache->size, KM_SLEEP)) == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); } --- 944,954 ---- uint16_t data; uint32_t start_addr, *lptr, data32; nvram_t *nptr; int rval; ! QL_PRINT_9(ha, "started\n"); if ((nv = kmem_zalloc(ha->nvram_cache->size, KM_SLEEP)) == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); }
*** 974,993 **** ql_restart_driver(ha); return (EIO); } /* Load NVRAM. */ ! if (CFG_IST(ha, CFG_CTRL_258081)) { GLOBAL_HW_UNLOCK(); start_addr &= ~ha->flash_data_addr; start_addr <<= 2; if ((rval = ql_r_m_w_flash(ha, bp, ha->nvram_cache->size, start_addr, mode)) != QL_SUCCESS) { EL(ha, "nvram load failed, rval = %0xh\n", rval); } GLOBAL_HW_LOCK(); ! } else if (CFG_IST(ha, CFG_CTRL_2422)) { lptr = (uint32_t *)nv; for (cnt = 0; cnt < ha->nvram_cache->size / 4; cnt++) { data32 = *lptr++; LITTLE_ENDIAN_32(&data32); rval = ql_24xx_load_nvram(ha, cnt + start_addr, --- 982,1001 ---- ql_restart_driver(ha); return (EIO); } /* Load NVRAM. */ ! if (CFG_IST(ha, CFG_CTRL_252780818283)) { GLOBAL_HW_UNLOCK(); start_addr &= ~ha->flash_data_addr; start_addr <<= 2; if ((rval = ql_r_m_w_flash(ha, bp, ha->nvram_cache->size, start_addr, mode)) != QL_SUCCESS) { EL(ha, "nvram load failed, rval = %0xh\n", rval); } GLOBAL_HW_LOCK(); ! } else if (CFG_IST(ha, CFG_CTRL_24XX)) { lptr = (uint32_t *)nv; for (cnt = 0; cnt < ha->nvram_cache->size / 4; cnt++) { data32 = *lptr++; LITTLE_ENDIAN_32(&data32); rval = ql_24xx_load_nvram(ha, cnt + start_addr,
*** 1004,1024 **** LITTLE_ENDIAN_16(&data); ql_load_nvram(ha, (uint8_t)(cnt + start_addr), data); } } /* switch to the new one */ - NVRAM_CACHE_LOCK(ha); - kmem_free(ha->nvram_cache->cache, ha->nvram_cache->size); ha->nvram_cache->cache = (void *)nptr; - NVRAM_CACHE_UNLOCK(ha); - ql_release_nvram(ha); ql_restart_driver(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); if (rval == QL_SUCCESS) { return (0); } --- 1012,1028 ---- LITTLE_ENDIAN_16(&data); ql_load_nvram(ha, (uint8_t)(cnt + start_addr), data); } } /* switch to the new one */ kmem_free(ha->nvram_cache->cache, ha->nvram_cache->size); ha->nvram_cache->cache = (void *)nptr; ql_release_nvram(ha); ql_restart_driver(ha); ! QL_PRINT_9(ha, "done\n"); if (rval == QL_SUCCESS) { return (0); }
*** 1042,1052 **** ql_nv_util_dump(ql_adapter_state_t *ha, void *bp, int mode) { uint32_t start_addr; int rval2, rval = 0; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (ha->nvram_cache == NULL || ha->nvram_cache->size == NULL || ha->nvram_cache->cache == NULL) { EL(ha, "failed, kmem_zalloc\n"); --- 1046,1056 ---- ql_nv_util_dump(ql_adapter_state_t *ha, void *bp, int mode) { uint32_t start_addr; int rval2, rval = 0; ! QL_PRINT_9(ha, "started\n"); if (ha->nvram_cache == NULL || ha->nvram_cache->size == NULL || ha->nvram_cache->cache == NULL) { EL(ha, "failed, kmem_zalloc\n");
*** 1063,1085 **** if (rval2 != QL_SUCCESS) { EL(ha, "failed, ql_lock_nvram=%xh\n", rval2); ql_restart_driver(ha); return (EIO); } - NVRAM_CACHE_LOCK(ha); - rval2 = ql_get_nvram(ha, ha->nvram_cache->cache, start_addr, ha->nvram_cache->size); if (rval2 != QL_SUCCESS) { rval = rval2; } else { ha->nvram_cache->valid = 1; EL(ha, "nvram cache now valid."); } - NVRAM_CACHE_UNLOCK(ha); - ql_release_nvram(ha); ql_restart_driver(ha); if (rval != 0) { EL(ha, "failed to dump nvram, rval=%x\n", rval); --- 1067,1085 ----
*** 1091,1101 **** ha->nvram_cache->size, mode) != 0) { EL(ha, "Buffer copy failed\n"); return (EFAULT); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } int --- 1091,1101 ---- ha->nvram_cache->size, mode) != 0) { EL(ha, "Buffer copy failed\n"); return (EFAULT); } ! QL_PRINT_9(ha, "done\n"); return (0); } int
*** 1103,1113 **** uint32_t size) { int rval = QL_SUCCESS; int cnt; /* Dump NVRAM. */ ! if (CFG_IST(ha, CFG_CTRL_24258081)) { uint32_t *lptr = (uint32_t *)dest_addr; for (cnt = 0; cnt < size / 4; cnt++) { rval = ql_24xx_read_flash(ha, src_addr++, lptr); if (rval != QL_SUCCESS) { --- 1103,1113 ---- uint32_t size) { int rval = QL_SUCCESS; int cnt; /* Dump NVRAM. */ ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) { uint32_t *lptr = (uint32_t *)dest_addr; for (cnt = 0; cnt < size / 4; cnt++) { rval = ql_24xx_read_flash(ha, src_addr++, lptr); if (rval != QL_SUCCESS) {
*** 1151,1163 **** uint8_t cnt; uint8_t *vpd, *vpdptr, *vbuf; uint32_t start_addr, vpd_size, *lptr, data32; int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) { EL(ha, "unsupported adapter feature\n"); return (ENOTSUP); } vpd_size = QL_24XX_VPD_SIZE; --- 1151,1163 ---- uint8_t cnt; uint8_t *vpd, *vpdptr, *vbuf; uint32_t start_addr, vpd_size, *lptr, data32; int rval; ! QL_PRINT_9(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) { EL(ha, "unsupported adapter feature\n"); return (ENOTSUP); } vpd_size = QL_24XX_VPD_SIZE;
*** 1207,1217 **** ql_restart_driver(ha); return (EIO); } /* Load VPD. */ ! if (CFG_IST(ha, CFG_CTRL_258081)) { GLOBAL_HW_UNLOCK(); start_addr &= ~ha->flash_data_addr; start_addr <<= 2; if ((rval = ql_r_m_w_flash(ha, bp, vpd_size, start_addr, mode)) != QL_SUCCESS) { --- 1207,1217 ---- ql_restart_driver(ha); return (EIO); } /* Load VPD. */ ! if (CFG_IST(ha, CFG_CTRL_252780818283)) { GLOBAL_HW_UNLOCK(); start_addr &= ~ha->flash_data_addr; start_addr <<= 2; if ((rval = ql_r_m_w_flash(ha, bp, vpd_size, start_addr, mode)) != QL_SUCCESS) {
*** 1233,1244 **** } kmem_free(vpd, vpd_size); /* Update the vcache */ - CACHE_LOCK(ha); - if (rval != QL_SUCCESS) { EL(ha, "failed, load\n"); } else if ((ha->vcache == NULL) && ((ha->vcache = kmem_zalloc(vpd_size, KM_SLEEP)) == NULL)) { EL(ha, "failed, kmem_zalloc2\n"); --- 1233,1242 ----
*** 1246,1261 **** EL(ha, "Buffer copy2 failed\n"); kmem_free(ha->vcache, vpd_size); ha->vcache = NULL; } - CACHE_UNLOCK(ha); - ql_release_nvram(ha); ql_restart_driver(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); if (rval == QL_SUCCESS) { return (0); } --- 1244,1257 ---- EL(ha, "Buffer copy2 failed\n"); kmem_free(ha->vcache, vpd_size); ha->vcache = NULL; } ql_release_nvram(ha); ql_restart_driver(ha); ! QL_PRINT_9(ha, "done\n"); if (rval == QL_SUCCESS) { return (0); }
*** 1281,1328 **** uint8_t cnt; void *vpd; uint32_t start_addr, vpd_size, *lptr; int rval = 0; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) { EL(ha, "unsupported adapter feature\n"); return (EACCES); } vpd_size = QL_24XX_VPD_SIZE; - CACHE_LOCK(ha); - if (ha->vcache != NULL) { /* copy back the vpd cache data */ if (ddi_copyout(ha->vcache, bp, vpd_size, mode) != 0) { EL(ha, "Buffer copy failed\n"); rval = EFAULT; } - CACHE_UNLOCK(ha); return (rval); } if ((vpd = kmem_zalloc(vpd_size, KM_SLEEP)) == NULL) { - CACHE_UNLOCK(ha); EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); } /* Quiesce I/O */ if (ql_stall_driver(ha, 0) != QL_SUCCESS) { - CACHE_UNLOCK(ha); EL(ha, "ql_stall_driver failed\n"); kmem_free(vpd, vpd_size); return (EBUSY); } rval = ql_lock_nvram(ha, &start_addr, LNF_VPD_DATA); if (rval != QL_SUCCESS) { - CACHE_UNLOCK(ha); EL(ha, "failed, ql_lock_nvram=%xh\n", rval); kmem_free(vpd, vpd_size); ql_restart_driver(ha); return (EIO); } --- 1277,1318 ---- uint8_t cnt; void *vpd; uint32_t start_addr, vpd_size, *lptr; int rval = 0; ! QL_PRINT_3(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) { EL(ha, "unsupported adapter feature\n"); return (EACCES); } vpd_size = QL_24XX_VPD_SIZE; if (ha->vcache != NULL) { /* copy back the vpd cache data */ if (ddi_copyout(ha->vcache, bp, vpd_size, mode) != 0) { EL(ha, "Buffer copy failed\n"); rval = EFAULT; } return (rval); } if ((vpd = kmem_zalloc(vpd_size, KM_SLEEP)) == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); } /* Quiesce I/O */ if (ql_stall_driver(ha, 0) != QL_SUCCESS) { EL(ha, "ql_stall_driver failed\n"); kmem_free(vpd, vpd_size); return (EBUSY); } rval = ql_lock_nvram(ha, &start_addr, LNF_VPD_DATA); if (rval != QL_SUCCESS) { EL(ha, "failed, ql_lock_nvram=%xh\n", rval); kmem_free(vpd, vpd_size); ql_restart_driver(ha); return (EIO); }
*** 1343,1364 **** ql_release_nvram(ha); ql_restart_driver(ha); if (ddi_copyout(vpd, bp, vpd_size, mode) != 0) { - CACHE_UNLOCK(ha); EL(ha, "Buffer copy failed\n"); kmem_free(vpd, vpd_size); return (EFAULT); } ha->vcache = vpd; ! CACHE_UNLOCK(ha); - QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); - if (rval != QL_SUCCESS) { return (EFAULT); } else { return (0); } --- 1333,1351 ---- ql_release_nvram(ha); ql_restart_driver(ha); if (ddi_copyout(vpd, bp, vpd_size, mode) != 0) { EL(ha, "Buffer copy failed\n"); kmem_free(vpd, vpd_size); return (EFAULT); } ha->vcache = vpd; ! QL_PRINT_3(ha, "done\n"); if (rval != QL_SUCCESS) { return (EFAULT); } else { return (0); }
*** 1385,1395 **** { uint8_t *vpd = vpdbuf; uint8_t *end = vpdbuf + QL_24XX_VPD_SIZE; uint32_t found = 0; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (vpdbuf == NULL || opcode == NULL) { EL(ha, "null parameter passed!\n"); return (NULL); } --- 1372,1382 ---- { uint8_t *vpd = vpdbuf; uint8_t *end = vpdbuf + QL_24XX_VPD_SIZE; uint32_t found = 0; ! QL_PRINT_3(ha, "started\n"); if (vpdbuf == NULL || opcode == NULL) { EL(ha, "null parameter passed!\n"); return (NULL); }
*** 1425,1435 **** } else { vpd += vpd[2] +3; } } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (found == 1 ? vpd : NULL); } /* --- 1412,1422 ---- } else { vpd += vpd[2] +3; } } ! QL_PRINT_3(ha, "done\n"); return (found == 1 ? vpd : NULL); } /*
*** 1460,1478 **** { uint8_t *vpd; uint8_t *vpdbuf; int32_t len = -1; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (opcode == NULL || bp == NULL || bplen < 1) { EL(ha, "invalid parameter passed: opcode=%ph, " "bp=%ph, bplen=%xh\n", opcode, bp, bplen); return (len); } ! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) { return (len); } if ((vpdbuf = (uint8_t *)kmem_zalloc(QL_24XX_VPD_SIZE, KM_SLEEP)) == NULL) { --- 1447,1465 ---- { uint8_t *vpd; uint8_t *vpdbuf; int32_t len = -1; ! QL_PRINT_3(ha, "started\n"); if (opcode == NULL || bp == NULL || bplen < 1) { EL(ha, "invalid parameter passed: opcode=%ph, " "bp=%ph, bplen=%xh\n", opcode, bp, bplen); return (len); } ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) { return (len); } if ((vpdbuf = (uint8_t *)kmem_zalloc(QL_24XX_VPD_SIZE, KM_SLEEP)) == NULL) {
*** 1507,1517 **** /* * make sure that the vpd len doesn't exceed the * vpd end */ ! if (vpd+len > vpdbuf + QL_24XX_VPD_SIZE) { EL(ha, "vpd tag len (%xh) exceeds vpd buffer " "length\n", len); len = -1; } } --- 1494,1504 ---- /* * make sure that the vpd len doesn't exceed the * vpd end */ ! if (vpd + len > vpdbuf + QL_24XX_VPD_SIZE) { EL(ha, "vpd tag len (%xh) exceeds vpd buffer " "length\n", len); len = -1; } }
*** 1519,1533 **** if (len >= 0) { /* * make sure we don't exceed callers buffer space len */ if (len > bplen) { ! len = bplen-1; } /* copy the data back */ ! (void) strncpy((int8_t *)bp, (int8_t *)(vpd+3), (int64_t)len); bp[len] = NULL; } else { /* error -- couldn't find tag */ bp[0] = NULL; if (opcode[1] != NULL) { --- 1506,1520 ---- if (len >= 0) { /* * make sure we don't exceed callers buffer space len */ if (len > bplen) { ! len = bplen - 1; } /* copy the data back */ ! (void) strncpy((int8_t *)bp, (int8_t *)(vpd + 3), (int64_t)len); bp[len] = NULL; } else { /* error -- couldn't find tag */ bp[0] = NULL; if (opcode[1] != NULL) {
*** 1537,1547 **** } } kmem_free(vpdbuf, QL_24XX_VPD_SIZE); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (len); } /* --- 1524,1534 ---- } } kmem_free(vpdbuf, QL_24XX_VPD_SIZE); ! QL_PRINT_3(ha, "done\n"); return (len); } /*
*** 1567,1578 **** { uint8_t *bp; uint32_t xfer, bsize, saddr, ofst; int rval = 0; ! QL_PRINT_9(CE_CONT, "(%d): started, dp=%ph, faddr=%xh, bc=%xh\n", ! ha->instance, (void *)dp, faddr, bc); bsize = ha->xioctl->fdesc.block_size; saddr = faddr & ~(bsize - 1); ofst = faddr & (bsize - 1); --- 1554,1565 ---- { uint8_t *bp; uint32_t xfer, bsize, saddr, ofst; int rval = 0; ! QL_PRINT_9(ha, "started, dp=%ph, faddr=%xh, bc=%xh\n", ! (void *)dp, faddr, bc); bsize = ha->xioctl->fdesc.block_size; saddr = faddr & ~(bsize - 1); ofst = faddr & (bsize - 1);
*** 1584,1595 **** while (bc) { xfer = bc > bsize ? bsize : bc; if (ofst + xfer > bsize) { xfer = bsize - ofst; } ! QL_PRINT_9(CE_CONT, "(%d): dp=%ph, saddr=%xh, bc=%xh, " ! "ofst=%xh, xfer=%xh\n", ha->instance, (void *)dp, saddr, bc, ofst, xfer); if (ofst || xfer < bsize) { /* Dump Flash sector. */ if ((rval = ql_dump_fcode(ha, bp, bsize, saddr)) != --- 1571,1582 ---- while (bc) { xfer = bc > bsize ? bsize : bc; if (ofst + xfer > bsize) { xfer = bsize - ofst; } ! QL_PRINT_9(ha, "dp=%ph, saddr=%xh, bc=%xh, " ! "ofst=%xh, xfer=%xh\n", (void *)dp, saddr, bc, ofst, xfer); if (ofst || xfer < bsize) { /* Dump Flash sector. */ if ((rval = ql_dump_fcode(ha, bp, bsize, saddr)) !=
*** 1620,1630 **** ofst = 0; } kmem_free(bp, bsize); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (rval); } /* --- 1607,1617 ---- ofst = 0; } kmem_free(bp, bsize); ! QL_PRINT_9(ha, "done\n"); return (rval); } /*
*** 1650,1661 **** if (ddi_copyin(arg, &dop, sizeof (ql_adm_op_t), mode) != 0) { EL(ha, "failed, driver_op_t ddi_copyin\n"); return (EFAULT); } ! QL_PRINT_9(CE_CONT, "(%d): started, cmd=%xh, buffer=%llx," ! " length=%xh, option=%xh\n", ha->instance, dop.cmd, dop.buffer, dop.length, dop.option); switch (dop.cmd) { case QL_ADAPTER_INFO: rval = ql_adm_adapter_info(ha, &dop, mode); --- 1637,1648 ---- if (ddi_copyin(arg, &dop, sizeof (ql_adm_op_t), mode) != 0) { EL(ha, "failed, driver_op_t ddi_copyin\n"); return (EFAULT); } ! QL_PRINT_9(ha, "started, cmd=%xh, buffer=%llx," ! " length=%xh, option=%xh\n", dop.cmd, dop.buffer, dop.length, dop.option); switch (dop.cmd) { case QL_ADAPTER_INFO: rval = ql_adm_adapter_info(ha, &dop, mode);
*** 1683,1692 **** --- 1670,1688 ---- case QL_FW_DUMP: rval = ql_adm_fw_dump(ha, &dop, arg, mode); break; + case QL_FW_DUMP_TRIGGER: + rval = ql_adm_fw_t_dump(ha); + break; + + case QL_BEACON_ENABLE: + case QL_BEACON_DISABLE: + rval = ql_adm_beacon(ha, &dop); + break; + case QL_NVRAM_LOAD: rval = ql_adm_nvram_load(ha, &dop, mode); break; case QL_NVRAM_DUMP:
*** 1716,1726 **** default: EL(ha, "unsupported driver op cmd: %x\n", dop.cmd); return (EINVAL); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (rval); } /* --- 1712,1722 ---- default: EL(ha, "unsupported driver op cmd: %x\n", dop.cmd); return (EINVAL); } ! QL_PRINT_9(ha, "done\n"); return (rval); } /*
*** 1743,1765 **** ql_adapter_info_t hba; uint8_t *dp; uint32_t length; int rval, i; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); hba.device_id = ha->device_id; ! dp = CFG_IST(ha, CFG_CTRL_24258081) ? ! &ha->init_ctrl_blk.cb24.port_name[0] : ! &ha->init_ctrl_blk.cb.port_name[0]; bcopy(dp, hba.wwpn, 8); hba.d_id = ha->d_id.b24; if (ha->xioctl->fdesc.flash_size == 0 && ! !(CFG_IST(ha, CFG_CTRL_2200) && !ha->subven_id)) { if (ql_stall_driver(ha, 0) != QL_SUCCESS) { EL(ha, "ql_stall_driver failed\n"); return (EBUSY); } --- 1739,1759 ---- ql_adapter_info_t hba; uint8_t *dp; uint32_t length; int rval, i; ! QL_PRINT_9(ha, "started\n"); hba.device_id = ha->device_id; ! dp = ha->loginparams.nport_ww_name.raw_wwn; bcopy(dp, hba.wwpn, 8); hba.d_id = ha->d_id.b24; if (ha->xioctl->fdesc.flash_size == 0 && ! !(CFG_IST(ha, CFG_CTRL_22XX) && !ha->subven_id)) { if (ql_stall_driver(ha, 0) != QL_SUCCESS) { EL(ha, "ql_stall_driver failed\n"); return (EBUSY); }
*** 1770,1780 **** } return (EIO); } /* 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); --- 1764,1774 ---- } return (EIO); } /* Resume I/O */ ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_2)) { ql_restart_driver(ha); } else { EL(ha, "isp_abort_needed for restart\n"); ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED, DRIVER_STALL);
*** 1807,1817 **** dop->length, mode) != 0) { EL(ha, "failed, ddi_copyout\n"); return (EFAULT); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 1801,1811 ---- dop->length, mode) != 0) { EL(ha, "failed, ddi_copyout\n"); return (EFAULT); } ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 1831,1841 **** ql_adm_extended_logging(ql_adapter_state_t *ha, ql_adm_op_t *dop) { char prop_name[MAX_PROP_LENGTH]; int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); (void) sprintf(prop_name, "hba%d-extended-logging", ha->instance); /*LINTED [Solaris DDI_DEV_T_NONE Lint warning]*/ rval = ddi_prop_update_int(DDI_DEV_T_NONE, ha->dip, prop_name, --- 1825,1835 ---- ql_adm_extended_logging(ql_adapter_state_t *ha, ql_adm_op_t *dop) { char prop_name[MAX_PROP_LENGTH]; int rval; ! QL_PRINT_9(ha, "started\n"); (void) sprintf(prop_name, "hba%d-extended-logging", ha->instance); /*LINTED [Solaris DDI_DEV_T_NONE Lint warning]*/ rval = ddi_prop_update_int(DDI_DEV_T_NONE, ha->dip, prop_name,
*** 1847,1857 **** dop->option ? (ha->cfg_flags |= CFG_ENABLE_EXTENDED_LOGGING) : (ha->cfg_flags &= ~CFG_ENABLE_EXTENDED_LOGGING); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 1841,1851 ---- dop->option ? (ha->cfg_flags |= CFG_ENABLE_EXTENDED_LOGGING) : (ha->cfg_flags &= ~CFG_ENABLE_EXTENDED_LOGGING); } ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 1869,1888 **** static int ql_adm_loop_reset(ql_adapter_state_t *ha) { int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (ha->task_daemon_flags & LOOP_DOWN) { (void) ql_full_login_lip(ha); } else if ((rval = ql_full_login_lip(ha)) != QL_SUCCESS) { EL(ha, "failed, ql_initiate_lip=%xh\n", rval); return (EIO); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 1863,1891 ---- static int ql_adm_loop_reset(ql_adapter_state_t *ha) { int rval; ! QL_PRINT_9(ha, "started\n"); + if (CFG_IST(ha, CFG_CTRL_82XX)) { + rval = ql_8021_fw_reload(ha); + ql_awaken_task_daemon(ha, NULL, ISP_ABORT_NEEDED, 0); + if (rval != QL_SUCCESS) { + EL(ha, "failed, ql_8021_fw_reload=%xh\n", rval); + return (EIO); + } + } else { if (ha->task_daemon_flags & LOOP_DOWN) { (void) ql_full_login_lip(ha); } else if ((rval = ql_full_login_lip(ha)) != QL_SUCCESS) { EL(ha, "failed, ql_initiate_lip=%xh\n", rval); return (EIO); } + } ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 1905,1915 **** ql_device_info_t dev; ql_link_t *link; ql_tgt_t *tq; uint32_t index, cnt; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); cnt = 0; dev.address = 0xffffffff; /* Scan port list for requested target and fill in the values */ --- 1908,1918 ---- ql_device_info_t dev; ql_link_t *link; ql_tgt_t *tq; uint32_t index, cnt; ! QL_PRINT_9(ha, "started\n"); cnt = 0; dev.address = 0xffffffff; /* Scan port list for requested target and fill in the values */
*** 1945,1955 **** dop->length, mode) != 0) { EL(ha, "failed, ddi_copyout\n"); return (EFAULT); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 1948,1958 ---- dop->length, mode) != 0) { EL(ha, "failed, ddi_copyout\n"); return (EFAULT); } ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 1968,1978 **** ql_adm_update_properties(ql_adapter_state_t *ha) { ql_comb_init_cb_t init_ctrl_blk; ql_comb_ip_init_cb_t ip_init_ctrl_blk; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); /* Stall driver instance. */ (void) ql_stall_driver(ha, 0); /* Save init control blocks. */ --- 1971,1981 ---- ql_adm_update_properties(ql_adapter_state_t *ha) { ql_comb_init_cb_t init_ctrl_blk; ql_comb_ip_init_cb_t ip_init_ctrl_blk; ! QL_PRINT_9(ha, "started\n"); /* Stall driver instance. */ (void) ql_stall_driver(ha, 0); /* Save init control blocks. */
*** 2005,2015 **** } /* Restart driver instance. */ ql_restart_driver(ha); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 2008,2018 ---- } /* Restart driver instance. */ ql_restart_driver(ha); ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 2030,2040 **** ql_adm_prop_update_int(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { char *prop_name; int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); prop_name = kmem_zalloc(dop->length, KM_SLEEP); if (prop_name == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); --- 2033,2043 ---- ql_adm_prop_update_int(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { char *prop_name; int rval; ! QL_PRINT_9(ha, "started\n"); prop_name = kmem_zalloc(dop->length, KM_SLEEP); if (prop_name == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM);
*** 2055,2065 **** return (EINVAL); } kmem_free(prop_name, dop->length); ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 2058,2068 ---- return (EINVAL); } kmem_free(prop_name, dop->length); ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 2080,2090 **** static int ql_adm_fw_dump(ql_adapter_state_t *ha, ql_adm_op_t *dop, void *udop, int mode) { caddr_t dmp; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (dop->length < ha->risc_dump_size) { EL(ha, "failed, incorrect length=%xh, size=%xh\n", dop->length, ha->risc_dump_size); return (EINVAL); --- 2083,2093 ---- static int ql_adm_fw_dump(ql_adapter_state_t *ha, ql_adm_op_t *dop, void *udop, int mode) { caddr_t dmp; ! QL_PRINT_9(ha, "started\n"); if (dop->length < ha->risc_dump_size) { EL(ha, "failed, incorrect length=%xh, size=%xh\n", dop->length, ha->risc_dump_size); return (EINVAL);
*** 2116,2131 **** if (ddi_copyout(dop, udop, sizeof (ql_adm_op_t), mode) != 0) { EL(ha, "failed, driver_op_t ddi_copyout\n"); return (EFAULT); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* * ql_adm_nvram_dump * Performs qladm QL_NVRAM_DUMP command * * Input: * ha: adapter state pointer. --- 2119,2200 ---- if (ddi_copyout(dop, udop, sizeof (ql_adm_op_t), mode) != 0) { EL(ha, "failed, driver_op_t ddi_copyout\n"); return (EFAULT); } ! QL_PRINT_9(ha, "done\n"); return (0); } /* + * ql_adm_fw_t_dump + * Performs qladm QL_FW_DUMP_TRIGGER command + * + * Input: + * ha: adapter state pointer. + * + * Returns: + * + * Context: + * Kernel context. + */ + static int + ql_adm_fw_t_dump(ql_adapter_state_t *ha) + { + int rval; + + QL_PRINT_9(ha, "started\n"); + + if (ha->ql_dump_state & QL_DUMP_VALID) { + EL(ha, "Already contains a dump file\n"); + return (EINVAL); + } + rval = ql_dump_firmware(ha); + + QL_PRINT_9(ha, "done\n"); + + if (rval == QL_SUCCESS || rval == QL_DATA_EXISTS) { + return (0); + } + return (EFAULT); + } + + /* + * ql_adm_beacon + * Performs qladm QL_BEACON_ENABLE/DISABLE command + * + * Input: + * ha: adapter state pointer. + * dop: ql_adm_op_t structure pointer. + * + * Returns: + * + * Context: + * Kernel context. + */ + static int + ql_adm_beacon(ql_adapter_state_t *ha, ql_adm_op_t *dop) + { + int rval; + ql_mbx_data_t mr; + + if (!CFG_IST(ha, CFG_CTRL_82XX)) { + return (EIO); + } + + rval = ql_diag_beacon(ha, dop->cmd, &mr); + + if (rval == QL_SUCCESS) { + return (0); + } + + return (rval); + } + + + /* * ql_adm_nvram_dump * Performs qladm QL_NVRAM_DUMP command * * Input: * ha: adapter state pointer.
*** 2140,2150 **** static int ql_adm_nvram_dump(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (dop->length < ha->nvram_cache->size) { EL(ha, "failed, length=%xh, size=%xh\n", dop->length, ha->nvram_cache->size); return (EINVAL); --- 2209,2219 ---- static int ql_adm_nvram_dump(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(ha, "started\n"); if (dop->length < ha->nvram_cache->size) { EL(ha, "failed, length=%xh, size=%xh\n", dop->length, ha->nvram_cache->size); return (EINVAL);
*** 2153,2163 **** if ((rval = ql_nv_util_dump(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_nv_util_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } --- 2222,2232 ---- if ((rval = ql_nv_util_dump(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_nv_util_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(ha, "done\n"); } return (rval); }
*** 2178,2188 **** static int ql_adm_nvram_load(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if (dop->length < ha->nvram_cache->size) { EL(ha, "failed, length=%xh, size=%xh\n", dop->length, ha->nvram_cache->size); return (EINVAL); --- 2247,2257 ---- static int ql_adm_nvram_load(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(ha, "started\n"); if (dop->length < ha->nvram_cache->size) { EL(ha, "failed, length=%xh, size=%xh\n", dop->length, ha->nvram_cache->size); return (EINVAL);
*** 2191,2201 **** if ((rval = ql_nv_util_load(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_nv_util_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } --- 2260,2270 ---- if ((rval = ql_nv_util_load(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_nv_util_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(ha, "done\n"); } return (rval); }
*** 2217,2227 **** ql_adm_flash_load(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { uint8_t *dp; int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); if ((dp = kmem_zalloc(dop->length, KM_SLEEP)) == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); } --- 2286,2296 ---- ql_adm_flash_load(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { uint8_t *dp; int rval; ! QL_PRINT_9(ha, "started\n"); if ((dp = kmem_zalloc(dop->length, KM_SLEEP)) == NULL) { EL(ha, "failed, kmem_zalloc\n"); return (ENOMEM); }
*** 2237,2247 **** EL(ha, "ql_stall_driver failed\n"); kmem_free(dp, dop->length); return (EBUSY); } ! rval = (CFG_IST(ha, CFG_CTRL_24258081) ? ql_24xx_load_flash(ha, dp, dop->length, dop->option) : ql_load_flash(ha, dp, dop->length)); ql_restart_driver(ha); --- 2306,2316 ---- EL(ha, "ql_stall_driver failed\n"); kmem_free(dp, dop->length); return (EBUSY); } ! rval = (CFG_IST(ha, CFG_ISP_FW_TYPE_2) ? ql_24xx_load_flash(ha, dp, dop->length, dop->option) : ql_load_flash(ha, dp, dop->length)); ql_restart_driver(ha);
*** 2250,2260 **** if (rval != QL_SUCCESS) { EL(ha, "failed\n"); return (EIO); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (0); } /* --- 2319,2329 ---- if (rval != QL_SUCCESS) { EL(ha, "failed\n"); return (EIO); } ! QL_PRINT_9(ha, "done\n"); return (0); } /*
*** 2274,2286 **** static int ql_adm_vpd_dump(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) { EL(ha, "hba does not support VPD\n"); return (EINVAL); } if (dop->length < QL_24XX_VPD_SIZE) { --- 2343,2355 ---- static int ql_adm_vpd_dump(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) { EL(ha, "hba does not support VPD\n"); return (EINVAL); } if (dop->length < QL_24XX_VPD_SIZE) {
*** 2292,2302 **** if ((rval = ql_vpd_dump(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_vpd_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } --- 2361,2371 ---- if ((rval = ql_vpd_dump(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_vpd_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(ha, "done\n"); } return (rval); }
*** 2317,2329 **** static int ql_adm_vpd_load(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) { EL(ha, "hba does not support VPD\n"); return (EINVAL); } if (dop->length < QL_24XX_VPD_SIZE) { --- 2386,2398 ---- static int ql_adm_vpd_load(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval; ! QL_PRINT_9(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) { EL(ha, "hba does not support VPD\n"); return (EINVAL); } if (dop->length < QL_24XX_VPD_SIZE) {
*** 2335,2345 **** if ((rval = ql_vpd_load(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_vpd_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); } return (rval); } --- 2404,2414 ---- if ((rval = ql_vpd_load(ha, (void *)(uintptr_t)dop->buffer, mode)) != 0) { EL(ha, "failed, ql_vpd_dump\n"); } else { /*EMPTY*/ ! QL_PRINT_9(ha, "done\n"); } return (rval); }
*** 2361,2373 **** ql_adm_vpd_gettag(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval = 0; uint8_t *lbuf; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); ! if ((CFG_IST(ha, CFG_CTRL_24258081)) == 0) { EL(ha, "hba does not support VPD\n"); return (EINVAL); } if ((lbuf = (uint8_t *)kmem_zalloc(dop->length, KM_SLEEP)) == NULL) { --- 2430,2442 ---- ql_adm_vpd_gettag(ql_adapter_state_t *ha, ql_adm_op_t *dop, int mode) { int rval = 0; uint8_t *lbuf; ! QL_PRINT_9(ha, "started\n"); ! if (CFG_IST(ha, CFG_ISP_FW_TYPE_1)) { EL(ha, "hba does not support VPD\n"); return (EINVAL); } if ((lbuf = (uint8_t *)kmem_zalloc(dop->length, KM_SLEEP)) == NULL) {
*** 2384,2404 **** if ((rval = ql_vpd_lookup(ha, lbuf, lbuf, (int32_t) dop->length)) < 0) { EL(ha, "failed vpd_lookup\n"); } else { if (ddi_copyout(lbuf, (void *)(uintptr_t)dop->buffer, ! strlen((int8_t *)lbuf)+1, mode) != 0) { EL(ha, "failed, ddi_copyout\n"); rval = EFAULT; } else { rval = 0; } } kmem_free(lbuf, dop->length); } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (rval); } /* --- 2453,2473 ---- if ((rval = ql_vpd_lookup(ha, lbuf, lbuf, (int32_t) dop->length)) < 0) { EL(ha, "failed vpd_lookup\n"); } else { if (ddi_copyout(lbuf, (void *)(uintptr_t)dop->buffer, ! strlen((int8_t *)lbuf) + 1, mode) != 0) { EL(ha, "failed, ddi_copyout\n"); rval = EFAULT; } else { rval = 0; } } kmem_free(lbuf, dop->length); } ! QL_PRINT_9(ha, "done\n"); return (rval); } /*
*** 2422,2432 **** int rval = DDI_SUCCESS; ql_link_t *link; ql_adapter_state_t *ha2 = NULL; uint16_t fw_class = (uint16_t)dop->option; ! QL_PRINT_9(CE_CONT, "(%d): started\n", ha->instance); /* zero the firmware module reference count */ for (link = ql_hba.first; link != NULL; link = link->next) { ha2 = link->base_address; if (fw_class == ha2->fw_class) { --- 2491,2501 ---- int rval = DDI_SUCCESS; ql_link_t *link; ql_adapter_state_t *ha2 = NULL; uint16_t fw_class = (uint16_t)dop->option; ! QL_PRINT_9(ha, "started\n"); /* zero the firmware module reference count */ for (link = ql_hba.first; link != NULL; link = link->next) { ha2 = link->base_address; if (fw_class == ha2->fw_class) {
*** 2460,2468 **** rval = 0; } } ! QL_PRINT_9(CE_CONT, "(%d): done\n", ha->instance); return (rval); } --- 2529,2537 ---- rval = 0; } } ! QL_PRINT_9(ha, "done\n"); return (rval); }