bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * CDDL HEADER START
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The contents of this file are subject to the terms of the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Common Development and Distribution License (the "License").
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * You may not use this file except in compliance with the License.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * See the License for the specific language governing permissions
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * and limitations under the License.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * CDDL HEADER END
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * Copyright 2010 QLogic Corporation. All rights reserved.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <qlge.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int ql_async_event_parser(qlge_t *, mbx_data_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Wait upto timeout seconds for Processor Interrupt
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * if timeout is 0, then wait for default waittime
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_poll_processor_intr(qlge_t *qlge, uint8_t timeout)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_reg_bit(qlge, REG_STATUS, STS_PI, BIT_SET, timeout)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "Polling for processor interrupt failed.");
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Wait for mailbox Processor Register Ready
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_wait_processor_addr_reg_ready(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_reg_bit(qlge, REG_PROCESSOR_ADDR,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan PROCESSOR_ADDRESS_RDY, BIT_SET, 0) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "Wait for processor address register ready timeout.");
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Read and write MPI registers using the indirect register interface
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Assume all the locks&semaphore have been acquired
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_write_processor_data(qlge_t *qlge, uint32_t addr, uint32_t data)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* wait for processor address register ready */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_processor_addr_reg_ready(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* write the data to the data reg */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_PROCESSOR_DATA, data);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* trigger the write */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_PROCESSOR_ADDR, addr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* wait for register to come ready */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_processor_addr_reg_ready(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Read from processor register
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_read_processor_data(qlge_t *qlge, uint32_t addr, uint32_t *data)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* enable read operation */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr |= PROCESSOR_ADDRESS_READ;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* wait for processor address register ready */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_processor_addr_reg_ready(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* Write read address, wait for data ready in Data register */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_PROCESSOR_ADDR, addr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* wait for data ready */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_processor_addr_reg_ready(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* read data */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *data = ql_read_reg(qlge, REG_PROCESSOR_DATA);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Read "count" number of outgoing Mailbox register starting
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * from mailbox #0 if count is 0 then read all mailboxes
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_read_mailbox_cmd(qlge_t *qlge, mbx_data_t *mbx_buf, uint32_t count)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t reg_status;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t addr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int i;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_sem_spinlock(qlge, QL_PROCESSOR_SEM_MASK) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "%s(%d) get QL_PROCESSOR_SEM_MASK time out error",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (DDI_FAILURE);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->func_number == qlge->fn0_net)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr = FUNC_0_OUT_MAILBOX_0_REG_OFFSET;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr = FUNC_1_OUT_MAILBOX_0_REG_OFFSET;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (count == 0)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan count = NUM_MAILBOX_REGS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < count; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_read_processor_data(qlge, addr, &reg_status)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) mailbox %d value 0x%x\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, i, reg_status));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_buf->mb[i] = reg_status;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr ++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_sem_unlock(qlge, QL_PROCESSOR_SEM_MASK);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Write mail box command (upto 16) to MPI Firmware
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_issue_mailbox_cmd(qlge_t *qlge, mbx_cmd_t *mbx_cmd)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t addr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int i;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Get semaphore to access Processor Address and
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Processor Data Registers
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_sem_spinlock(qlge, QL_PROCESSOR_SEM_MASK) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (DDI_FAILURE);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* ensure no overwriting current command */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_reg_bit(qlge, REG_HOST_CMD_STATUS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan HOST_TO_MPI_INTR_NOT_DONE, BIT_RESET, 0) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->func_number == qlge->fn0_net)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr = FUNC_0_IN_MAILBOX_0_REG_OFFSET;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr = FUNC_1_IN_MAILBOX_0_REG_OFFSET;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* wait for mailbox registers to be ready to access */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_processor_addr_reg_ready(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* issue mailbox command one by one */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < NUM_MAILBOX_REGS; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* write sending cmd to mailbox data register */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_PROCESSOR_DATA, mbx_cmd->mb[i]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* write mailbox address to address register */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_PROCESSOR_ADDR, addr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) write %x to mailbox(%x) addr %x \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, mbx_cmd->mb[i], i, addr));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan addr++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * wait for mailbox cmd to be written before
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * next write can start
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_processor_addr_reg_ready(qlge) == DDI_FAILURE)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* inform MPI that new mailbox commands are available */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_HOST_CMD_STATUS, HOST_CMD_SET_RISC_INTR);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_sem_unlock(qlge, QL_PROCESSOR_SEM_MASK);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Send mail box command (upto 16) to MPI Firmware
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * and polling for MPI mailbox completion response when
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * interrupt is not enabled.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The MBX_LOCK mutexe should have been held and released
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * externally
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_issue_mailbox_cmd_and_poll_rsp(qlge_t *qlge, mbx_cmd_t *mbx_cmd,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_data_t *p_results)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan boolean_t done;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int max_wait;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmd == NULL)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto err;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = ql_issue_mailbox_cmd(qlge, mbx_cmd);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rtn_val != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd failed",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto err;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan done = B_FALSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan max_wait = 5; /* wait upto 5 PI interrupt */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* delay for the processor interrupt is received */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while ((done != B_TRUE) && (max_wait--)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* wait up to 5s for PI interrupt */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_poll_processor_intr(qlge, (uint8_t)mbx_cmd->timeout)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan == DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) PI Intr received",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_read_mailbox_cmd(qlge, p_results, 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Sometimes, the incoming messages is not what we are
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * waiting for, ie. async events, then, continue to
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * wait. If it is the result * of previous mailbox
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * command, then Done. No matter what, send
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * HOST_CMD_CLEAR_RISC_TO_HOST_INTR to clear each
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * PI interrupt
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_async_event_parser(qlge, p_results) == B_FALSE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * we get what we are waiting for,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * clear the interrupt
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan done = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*EMPTY*/
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d) result ignored, not we wait for\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_HOST_CMD_STATUS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan HOST_CMD_CLEAR_RISC_TO_HOST_INTR);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else { /* timeout */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan done = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanerr:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Send mail box command (upto 16) to MPI Firmware
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * and wait for MPI mailbox completion response which
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * is saved in interrupt. Thus, this function can only
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * be used after interrupt is enabled.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Must hold MBX mutex before calling this function
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_issue_mailbox_cmd_and_wait_rsp(qlge_t *qlge, mbx_cmd_t *mbx_cmd)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan clock_t timer;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int i;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int done = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmd == NULL)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto err;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(mutex_owned(&qlge->mbx_mutex));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* if interrupts are not enabled, poll when results are available */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (!(qlge->flags & INTERRUPTS_ENABLED)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = ql_issue_mailbox_cmd_and_poll_rsp(qlge, mbx_cmd,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &qlge->received_mbx_cmds);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rtn_val == DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < NUM_MAILBOX_REGS; i++)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd->mb[i] = qlge->received_mbx_cmds.mb[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = ql_issue_mailbox_cmd(qlge, mbx_cmd);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rtn_val != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd failed",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto err;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->mbx_wait_completion = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (!done && qlge->mbx_wait_completion && !ddi_in_panic()) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* default 5 seconds from now to timeout */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan timer = ddi_get_lbolt();
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmd->timeout) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan timer +=
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd->timeout * drv_usectohz(1000000);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan timer += 5 * drv_usectohz(1000000);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (cv_timedwait(&qlge->cv_mbx_intr, &qlge->mbx_mutex,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan timer) == -1) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The timeout time 'timer' was
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * reached or expired without the condition
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * being signaled.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) Wait for Mailbox cmd "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "complete timeout.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan done = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d) mailbox completion signal received"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " \n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < NUM_MAILBOX_REGS; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd->mb[i] =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->received_mbx_cmds.mb[i];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan done = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanerr:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Inteprete incoming asynchronous events
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_async_event_parser(qlge_t *qlge, mbx_data_t *mbx_cmds)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t link_status, cmd;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint8_t link_speed;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint8_t link_type;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan boolean_t proc_done = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t reply_cmd = {0};
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan boolean_t fatal_error = B_FALSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (mbx_cmds->mb[0]) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_IDC_INTERMEDIATE_COMPLETE /* 1000h */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "MBA_IDC_INTERMEDIATE_COMPLETE received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_SYSTEM_ERR /* 8002h */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d): MBA_SYSTEM_ERR received",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d): File id %x, Line # %x,"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "Firmware Ver# %x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, mbx_cmds->mb[1],
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[2], mbx_cmds->mb[3]);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan fatal_error = B_TRUE;
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_8xxx_binary_core_dump(qlge, &qlge->ql_mpi_coredump);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_LINK_UP /* 8011h */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): MBA_LINK_UP received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status = mbx_cmds->mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): Link Status %x \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, link_status));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_speed = (uint8_t)((link_status >> 3) & 0x07);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (link_speed == 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->speed = SPEED_100;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):Link speed 100M\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_speed == 1) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->speed = SPEED_1000;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):Link speed 1G\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_speed == 2) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->speed = SPEED_10G;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):Link speed 10G\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->link_type = link_type = (uint8_t)(link_status & 0x07);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (link_type == XFI_NETWORK_INTERFACE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d):Link type XFI_NETWORK_INTERFACE\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_type == XAUI_NETWORK_INTERFACE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):Link type"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "XAUI_NETWORK_INTERFACE\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_type == XFI_BACKPLANE_INTERFACE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):Link type"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "XFI_BACKPLANE_INTERFACE\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_type == XAUI_BACKPLANE_INTERFACE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d):Link type "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "XAUI_BACKPLANE_INTERFACE\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_type == EXT_10GBASE_T_PHY) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d):Link type EXT_10GBASE_T_PHY\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (link_type == EXT_EXT_EDC_PHY) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d):Link type EXT_EXT_EDC_PHY\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d):unknown Link type \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_NOTE, "qlge(%d) mpi link up! speed %dMbps\n",
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan qlge->instance, qlge->speed);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * start timer if not started to delay some time then
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * check if link is really up or down
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_restart_timer(qlge);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_LINK_DOWN /* 8012h */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_LINK_DOWN received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status = mbx_cmds->mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): Link Status %x \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, link_status));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (link_status & 0x1) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): Loss of signal \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (link_status & 0x2) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): Auto-Negotiation Failed \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (link_status & 0x4) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): XTI-Training Failed \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_NOTE, "qlge(%d) mpi link down!\n", qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_restart_timer(qlge);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_IDC_COMPLETE /* 8100h */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_IDC_COMPLETE received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmd = mbx_cmds->mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (cmd == MBC_STOP_FIRMWARE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): STOP_FIRMWARE event completed\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (cmd == MBC_IDC_REQUEST) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): IDC_REQUEST event completed\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (cmd == MBC_PORT_RESET) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): PORT_RESET event completed\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (cmd == MBC_SET_PORT_CONFIG) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): SET_PORT_CONFIG event "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "completed\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): unknown IDC completion request"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " event %x %x\n", __func__, qlge->instance,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[1], mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan proc_done = B_FALSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_IDC_REQUEST_NOTIFICATION /* 8101h */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_IDC_REQUEST_NOTIFICATION "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmd = mbx_cmds->mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (cmd == MBC_STOP_FIRMWARE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): STOP_FIRMWARE notification"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (cmd == MBC_IDC_REQUEST) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): IDC_REQUEST notification "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (cmd == MBC_PORT_RESET) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): PORT_RESET "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "notification received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (cmd == MBC_SET_PORT_CONFIG) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): SET_PORT_CONFIG notification "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "unknown request received %x %x\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, mbx_cmds->mb[1],
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan reply_cmd.mb[0] = MBC_IDC_ACK;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan reply_cmd.mb[1] = mbx_cmds->mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan reply_cmd.mb[2] = mbx_cmds->mb[2];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan reply_cmd.mb[3] = mbx_cmds->mb[3];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan reply_cmd.mb[4] = mbx_cmds->mb[4];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd(qlge, &reply_cmd)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "%s(%d) send IDC Ack failed.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * verify if the incoming outbound mailbox value is what
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * we just sent
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds->mb[0] == MBS_COMMAND_COMPLETE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* 0x4000 */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): IDC Ack sent success.\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): IDC Ack reply error %x %x %x.\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, mbx_cmds->mb[0],
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[1], mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_IDC_TIME_EXTENDED /* 8102 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_IDC_TIME_EXTENDED received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_DCBX_CONFIG_CHANGE /* 8110 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_DCBX_CONFIG_CHANGE received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_NOTIFICATION_LOST /* 8120 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_NOTIFICATION_LOST received\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_SFT_TRANSCEIVER_INSERTION /* 8130 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_SFT_TRANSCEIVER_INSERTION "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_SFT_TRANSCEIVER_REMOVAL /* 8140 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_SFT_TRANSCEIVER_REMOVAL "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_FIRMWARE_INIT_COMPLETE /* 8400 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): MBA_FIRMWARE_INIT_COMPLETE "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received\n", __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d): mbx[1] %x, mbx[2] %x\n", __func__,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->instance, mbx_cmds->mb[1], mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_init_complete = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.major_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(MSW(mbx_cmds->mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MSB(LSW(mbx_cmds->mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.sub_minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(LSW(mbx_cmds->mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->phy_version_info.major_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(MSW(mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->phy_version_info.minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MSB(LSW(mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->phy_version_info.sub_minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(LSW(mbx_cmds->mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case MBA_FIRMWARE_INIT_FAILED /* 8401 */:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d):"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "ASYNC_EVENT_FIRMWARE_INIT_FAILURE "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "received: mbx[1] %x, mbx[2] %x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[1], mbx_cmds->mb[2]);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan fatal_error = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds->mb[0] > 0x8000) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d): "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "Unknown Async event received: mbx[0] %x ,"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "mbx[1] %x; mbx[2] %x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[0], mbx_cmds->mb[1],
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds->mb[2]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan proc_done = B_TRUE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan proc_done = B_FALSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (fatal_error) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_LOST);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan atomic_or_32(&qlge->flags, ADAPTER_ERROR);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (proc_done);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * MPI Interrupt handler
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Caller must have MBX_LOCK
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_do_mpi_intr(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * we just need to read first few mailboxes that this adapter's MPI
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * will write response to.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&qlge->mbx_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_read_mailbox_cmd(qlge, &qlge->received_mbx_cmds,
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan qlge->max_read_mbx);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * process PI interrupt as async events, if not done,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * then pass to mailbox processing
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_async_event_parser(qlge, &qlge->received_mbx_cmds) == B_FALSE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) mailbox completion interrupt\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If another thread is waiting for the mail box
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * completion event to occur
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->mbx_wait_completion == 1) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->mbx_wait_completion = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cv_broadcast(&qlge->cv_mbx_intr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("%s(%d) mailbox completion signaled \n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* inform MPI Firmware to clear the interrupt */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_HOST_CMD_STATUS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan HOST_CMD_CLEAR_RISC_TO_HOST_INTR /* 0x0A */);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&qlge->mbx_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_enable_completion_interrupt(qlge, 0); /* MPI is on irq 0 */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Test if mailbox communication works
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This is used when Interrupt is not enabled
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_mbx_test(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_data_t mbx_results;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int i, test_ok = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < NUM_MAILBOX_REGS; i++)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[i] = i;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_MAILBOX_REGISTER_TEST; /* 0x06 */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd(qlge, &mbx_cmds) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd timeout.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* delay for the processor interrupt is received */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_poll_processor_intr(qlge, (uint8_t)mbx_cmds.timeout)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan == DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) PI Intr received",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan (void) ql_read_mailbox_cmd(qlge, &mbx_results, 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_HOST_CMD_STATUS,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan HOST_CMD_CLEAR_RISC_TO_HOST_INTR);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_results.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan test_ok = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 1; i < NUM_MAILBOX_REGS; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_results.mb[i] != i) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan test_ok = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (test_ok) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) mailbox test failed!",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) mailbox testing error: "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "PI Intr not received ", __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_mbx_test2
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Test if mailbox communication works
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This is used when Interrupt is enabled
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * mailbox cmd:0x06h
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_mbx_test2(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int i, test_ok = 1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 0; i < NUM_MAILBOX_REGS; i++)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[i] = i;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_MAILBOX_REGISTER_TEST; /* 0x06 */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp failed.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the incoming outbound mailbox value is what we just sent */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan test_ok = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (i = 1; i < qlge->max_read_mbx; i++) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[i] != i) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan test_ok = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (test_ok) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) mailbox test failed!",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_get_fw_state
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Get fw state.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * mailbox cmd:0x69h
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_get_fw_state(qlge_t *qlge, uint32_t *fw_state_ptr)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_GET_FIRMWARE_STATE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " failed.", __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the transaction is completed successful */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) failed, 0x%x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, mbx_cmds.mb[0]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("firmware state: 0x%x\n", mbx_cmds.mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (fw_state_ptr != NULL)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *fw_state_ptr = mbx_cmds.mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_set_IDC_Req
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Send a IDC Request to firmware to notify all functions
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * or any specific functions on the same port
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * mailbox cmd:0x100h
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_set_IDC_Req(qlge_t *qlge, uint8_t dest_functions, uint8_t timeout)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_IDC_REQUEST /* 0x100 */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[1] = (timeout<<8) | qlge->func_number;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (dest_functions) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IDC_REQ_DEST_FUNC_ALL:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[1] |= IDC_REQ_ALL_DEST_FUNC_MASK;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[2] = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IDC_REQ_DEST_FUNC_0:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[2] = IDC_REQ_DEST_FUNC_0_MASK;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IDC_REQ_DEST_FUNC_1:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[2] = IDC_REQ_DEST_FUNC_1_MASK;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IDC_REQ_DEST_FUNC_2:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[2] = IDC_REQ_DEST_FUNC_2_MASK;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case IDC_REQ_DEST_FUNC_3:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[2] = IDC_REQ_DEST_FUNC_3_MASK;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "Wrong dest functions %x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan dest_functions);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp failed.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the transaction is completed successful */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[0] == MBA_IDC_INTERMEDIATE_COMPLETE /* 0x1000 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) mbx1: 0x%x, mbx2: 0x%x\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance, mbx_cmds.mb[1], mbx_cmds.mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (mbx_cmds.mb[0] == MBS_COMMAND_COMPLETE /* 0x4000 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) cmd sent succesfully 0x%x\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (mbx_cmds.mb[0] == MBS_COMMAND_ERROR /* 0x4005 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) failed: COMMAND_ERROR",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else if (mbx_cmds.mb[0] == MBS_COMMAND_PARAMETER_ERROR /* 0x4006 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) failed: COMMAND_PARAMETER_ERROR",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) unknow result: mbx[0]: 0x%x; mbx[1]:"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " 0x%x; mbx[2]: 0x%x", __func__, qlge->instance,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0], mbx_cmds.mb[1], mbx_cmds.mb[2]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanreturn (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_set_mpi_port_config
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Send new port configuration.to mpi
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * mailbox cmd:0x122h
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_set_mpi_port_config(qlge_t *qlge, port_cfg_info_t new_cfg)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_SET_PORT_CONFIG /* 0x122 */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[1] = new_cfg.link_cfg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[2] = new_cfg.max_frame_size;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " failed.", __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the transaction is completed successful */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((mbx_cmds.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (mbx_cmds.mb[0] != MBA_IDC_COMPLETE /* 0x8100 */)) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_WARN, "set port config (%d) failed, 0x%x",
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan qlge->instance, mbx_cmds.mb[0]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanql_set_pause_mode(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t pause_bit_mask = 0x60; /* bit 5-6 */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* clear pause bits */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.link_cfg &= ~pause_bit_mask;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* set new pause mode */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->pause == PAUSE_MODE_STANDARD)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.link_cfg |= STD_PAUSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else if (qlge->pause == PAUSE_MODE_PER_PRIORITY)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.link_cfg |= PP_PAUSE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan return (ql_set_mpi_port_config(qlge, qlge->port_cfg_info));
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan}
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanint
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanql_set_loop_back_mode(qlge_t *qlge)
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan{
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan uint32_t loop_back_bit_mask = 0x0e; /* bit 1-3 */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan /* clear loop back bits */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan qlge->port_cfg_info.link_cfg &= ~loop_back_bit_mask;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* loop back cfg: bit1-3 */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (qlge->loop_back_mode == QLGE_LOOP_INTERNAL_PARALLEL)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.link_cfg |= LOOP_INTERNAL_PARALLEL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan else if (qlge->loop_back_mode == QLGE_LOOP_INTERNAL_SERIAL)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.link_cfg |= LOOP_INTERNAL_SERIAL;
cddcb3dae85e03889ec217ef3da5a8898f4f66c7Sukumar Swaminathan else if (qlge->loop_back_mode == QLGE_LOOP_EXTERNAL_PHY)
cddcb3dae85e03889ec217ef3da5a8898f4f66c7Sukumar Swaminathan qlge->port_cfg_info.link_cfg |= LOOP_EXTERNAL_PHY;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ql_set_mpi_port_config(qlge, qlge->port_cfg_info));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_get_port_cfg
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Get port configuration.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * mailbox cmd:0x123h
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_get_port_cfg(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_GET_PORT_CONFIG /* 0x123 */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " failed.", __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the transaction is completed successfully */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_WARN, "get port config (%d) failed, 0x%x",
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan qlge->instance, mbx_cmds.mb[0]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else { /* verify frame size */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((mbx_cmds.mb[2] == NORMAL_FRAME_SIZE) ||
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (mbx_cmds.mb[2] == JUMBO_FRAME_SIZE)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.link_cfg = mbx_cmds.mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->port_cfg_info.max_frame_size = mbx_cmds.mb[2];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("link_cfg: 0x%x, max_frame_size:"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " %d bytes\n", mbx_cmds.mb[1], mbx_cmds.mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "bad link_cfg: 0x%x, max_frame_size:"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan " %d bytes", mbx_cmds.mb[1], mbx_cmds.mb[2]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * qlge_get_link_status
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Get link status.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * mailbox cmd:0x124h
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanqlge_get_link_status(qlge_t *qlge,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct qlnic_link_status_info *link_status_ptr)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_GET_LINK_STATUS /* 0x124 */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp failed.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the transaction is completed successful */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_WARN, "get link status(%d) failed, 0x%x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->instance, mbx_cmds.mb[0]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* EMPTY */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ("link status: status1 : 0x%x, status2 : 0x%x, "
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "status3 : 0x%x\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[1], mbx_cmds.mb[2], mbx_cmds.mb[3]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (link_status_ptr != NULL) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status_ptr->link_status_info = mbx_cmds.mb[1];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status_ptr->additional_info = mbx_cmds.mb[2];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status_ptr->network_hw_info = mbx_cmds.mb[3];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status_ptr->dcbx_frame_counters_info = mbx_cmds.mb[4];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan link_status_ptr->change_counters_info = mbx_cmds.mb[5];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * ql_get_firmware_version
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Get firmware version.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_get_firmware_version(qlge_t *qlge,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct qlnic_mpi_version_info *mpi_version_ptr)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_ABOUT_FIRMWARE /* 0x08 */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_wait_rsp(qlge, &mbx_cmds)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "%s(%d) ql_issue_mailbox_cmd_and_wait_rsp failed.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* verify if the transaction is completed successful */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_cmds.mb[0] != MBS_COMMAND_COMPLETE /* 0x4000 */) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_WARN, "get firmware version(%d) failed, 0x%x",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->instance, mbx_cmds.mb[0]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.major_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(MSW(mbx_cmds.mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MSB(LSW(mbx_cmds.mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.sub_minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(LSW(mbx_cmds.mb[1]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->phy_version_info.major_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(MSW(mbx_cmds.mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->phy_version_info.minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MSB(LSW(mbx_cmds.mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->phy_version_info.sub_minor_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan LSB(LSW(mbx_cmds.mb[2]));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#ifdef QLGE_LOAD_UNLOAD
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_NOTE, "firmware version: %d.%d.%d\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.major_version,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.minor_version,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan qlge->fw_version_info.sub_minor_version);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#endif
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mpi_version_ptr != NULL) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mpi_version_ptr->fw_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (qlge->fw_version_info.major_version<<16)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan |(qlge->fw_version_info.minor_version<<8)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan |(qlge->fw_version_info.sub_minor_version);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mpi_version_ptr->phy_version =
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (qlge->phy_version_info.major_version<<16)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan |(qlge->phy_version_info.minor_version<<8)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan |(qlge->phy_version_info.sub_minor_version);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if ((rtn_val != DDI_SUCCESS) && qlge->fm_enable) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ql_fm_ereport(qlge, DDI_FM_DEVICE_NO_RESPONSE);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ddi_fm_service_impact(qlge->dip, DDI_SERVICE_DEGRADED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Trigger a system error event
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_trigger_system_error_event(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mbx_cmds = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmds.mb[0] = MBC_GENERATE_SYS_ERROR; /* 0x2A */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd(qlge, &mbx_cmds) != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "%s(%d) ql_issue_mailbox_cmd timeout.",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Reset the MPI RISC Processor
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_reset_mpi_risc(qlge_t *qlge)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rtn_val = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* Reset the MPI Processor */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_HOST_CMD_STATUS, HOST_CMD_SET_RISC_RESET);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_wait_reg_bit(qlge, REG_HOST_CMD_STATUS, RISC_RESET,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan BIT_SET, 0) != DDI_SUCCESS) {
4aa4baabcbf85382c40c826cabf97d046ba28c89Sukumar Swaminathan (void) ql_read_reg(qlge, REG_HOST_CMD_STATUS);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ql_write_reg(qlge, REG_HOST_CMD_STATUS, HOST_CMD_CLEAR_RISC_RESET);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rtn_val = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rtn_val);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanql_read_risc_ram(qlge_t *qlge, uint32_t risc_address, uint64_t bp,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t word_count)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rval = DDI_FAILURE;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t mc = {0};
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_cmd_t *mcp = &mc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbx_data_t mbx_results;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): read risc addr:0x%x,"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan "phys_addr %x,%x words\n", __func__, qlge->instance,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan risc_address, bp, word_count));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (CFG_IST(qlge, CFG_CHIP_8100)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[0] = MBC_DUMP_RISC_RAM /* 0x0C */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[1] = LSW(risc_address);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[2] = MSW(LSD(bp));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[3] = LSW(LSD(bp));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[4] = MSW(word_count);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[5] = LSW(word_count);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[6] = MSW(MSD(bp));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[7] = LSW(MSD(bp));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->mb[8] = MSW(risc_address);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mcp->timeout = 10 /* MAILBOX_TOV */;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ql_issue_mailbox_cmd_and_poll_rsp(qlge, mcp, &mbx_results)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan != DDI_SUCCESS) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan goto out;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d) PI Intr received",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (mbx_results.mb[0] == MBS_COMMAND_COMPLETE /* 0x4000 */) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan QL_PRINT(DBG_MBX, ("%s(%d): success\n",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan __func__, qlge->instance));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rval = DDI_SUCCESS;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan } else {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan cmn_err(CE_WARN, "read_risc_ram(%d): failed, status %x",
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan qlge->instance, mbx_results.mb[0]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanout:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rval);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}