ql_mbx.c revision 5dfd244acc8f144280c5bc8f69ed941185fc3ccc
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/* Copyright 2009 QLogic Corporation */
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "Copyright 2009 QLogic Corporation; ql_mbx.c"
/*
* ISP2xxx Solaris Fibre Channel Adapter (FCA) driver source file.
*
* ***********************************************************************
* * **
* * NOTICE **
* * COPYRIGHT (C) 1996-2009 QLOGIC CORPORATION **
* * ALL RIGHTS RESERVED **
* * **
* ***********************************************************************
*
*/
#include <ql_apps.h>
#include <ql_api.h>
#include <ql_debug.h>
#include <ql_iocb.h>
#include <ql_isr.h>
#include <ql_mbx.h>
#include <ql_xioctl.h>
/*
* Local data
*/
/*
* Local prototypes
*/
uint32_t);
/*
* ql_mailbox_command
* Issue mailbox command and waits for completion.
*
* Input:
* ha = adapter state pointer.
* mcp = mailbox command parameter structure pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
static int
{
int rval;
uint32_t reset_flags = 0;
/* Acquire mailbox register lock. */
/* Check for mailbox available, if not wait for signal. */
return (QL_LOCK_TIMEOUT);
}
/* Set timeout after command that is running. */
timer = ddi_get_lbolt();
/*
* The timeout time 'timer' was
* reached without the condition
* being signaled.
*/
~MBX_WANT_FLG);
/* Release mailbox register lock. */
if (cv_stat == 0) {
return (QL_ABORTED);
}
return (QL_LOCK_TIMEOUT);
}
}
/* Structure pointer for return mailbox registers. */
/* Load mailbox registers. */
}
data >>= 1;
}
/* Issue set host interrupt command. */
/* Wait for command to complete. */
!ddi_in_panic()) {
/* 30 seconds from now */
timer = ddi_get_lbolt();
timer) == -1) {
/*
* The timeout time 'timer' was
* reached without the condition
* being signaled.
*/
break;
}
}
} else {
/* Release mailbox register lock. */
/* Acquire interrupt lock. */
/* Check for pending interrupts. */
if (ha->mailbox_flags &
(MBX_INTERRUPT | MBX_ABORT) ||
break;
}
}
break;
} else {
drv_usecwait(10000);
}
}
/* Acquire mailbox register lock. */
}
/* Mailbox command timeout? */
rval = QL_ABORTED;
}
} else {
/*
* This is the expected completion path so
* return the actual mbx cmd completion status.
*/
}
/*
* Clear outbound to risc mailbox registers per spec. The exception
* is on 2200 mailbox 4 and 5 affect the req and resp que indexes
* so avoid writing them.
*/
} else {
}
}
data >>= 1;
}
/* Reset busy status. */
~(MBX_BUSY_FLG | MBX_ABORT));
/* If thread is waiting for mailbox go signal it to start. */
~MBX_WANT_FLG);
}
/* Release mailbox register lock. */
if (set_flags != 0 || reset_flags != 0) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_setup_mbox_dma_resources
* Prepare the data for a mailbox dma transfer.
*
* Input:
* ha = adapter state pointer.
* mem_desc = descriptor to contain the dma resource information.
* data = pointer to the data.
* size = size of the data in bytes.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
static int
{
int rval = QL_SUCCESS;
QL_SUCCESS) {
} else {
}
return (rval);
}
/*
* ql_setup_mbox_dma_resources
* Prepare a dma buffer.
*
* Input:
* ha = adapter state pointer.
* mem_desc = descriptor to contain the dma resource information.
* data = pointer to the data.
* size = size of the data in bytes.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
static int
{
int rval = QL_SUCCESS;
QL_DMA_RING_ALIGN)) != QL_SUCCESS) {
}
return (rval);
}
/*
* ql_setup_mbox_dma_data
* Move data to the dma buffer.
*
* Input:
* mem_desc = descriptor to contain the dma resource information.
* data = pointer to the data.
*
* Returns:
*
* Context:
* Kernel context.
*/
static void
{
/* Copy out going data to DMA buffer. */
/* Sync DMA buffer. */
}
/*
* ql_get_mbox_dma_data
* Recover data from the dma buffer.
*
* Input:
* mem_desc = descriptor to contain the dma resource information.
* data = pointer to the data.
*
* Returns:
*
* Context:
* Kernel context.
*/
static void
{
/* Sync in coming DMA buffer. */
/* Copy in coming DMA data. */
}
/*
* ql_initialize_ip
* Initialize IP receive buffer queue.
*
* Input:
* ha = adapter state pointer.
* ha->ip_init_ctrl_blk = setup for transmit.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (QL_FUNCTION_FAILED);
}
ha->rcvbuf_ring_index = 0;
/* Reset all sequence counts. */
tq->ub_total_seg_cnt = 0;
}
}
if (rval != QL_SUCCESS) {
return (rval);
}
if (rval == QL_SUCCESS) {
} else {
}
return (rval);
}
/*
* ql_shutdown_ip
* Disconnects firmware IP from system buffers.
*
* Input:
* ha = adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
QL_UB_LOCK(ha);
/* Return all unsolicited buffers that ISP-IP has. */
}
}
if (rval == QL_SUCCESS) {
/* EMPTY - no need to check return value of MBC_SHUTDOWN_IP */
} else {
}
return (rval);
}
/*
* ql_online_selftest
* Issue online self test mailbox command.
*
* Input:
* ha = adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_loop_back
* Issue diagnostic loop back frame mailbox command.
*
* Input:
* ha = adapter state pointer.
* lb = loop back parameter structure pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
#ifndef apps_64bit
int
{
int rval;
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
#else
int
{
int rval;
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
#endif
/*
* ql_echo
* Issue an ELS echo using the user specified data to a user specified
* destination
*
* Input:
* ha: adapter state pointer.
* echo_pt: echo parameter structure pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* addressing (bit 6) and */
/* real echo (bit 15 */
/*
* I know this looks strange, using a field labled "not used"
* is a union of one 64 bit entity with an array of two 32
* bit enititys. Since we have routines to convert 32 bit
* entities into 16 bit entities it is easier to use
* both 32 bit union members then the one 64 bit union
* member
*/
/* 64 bit addressing */
/* Receive data dest add in system memory bits 47-32 */
/* Receive data dest add in system memory bits 63-48 */
/* Transmit data source address in system memory bits 47-32 */
/* Transmit data source address in system memory bits 63-48 */
}
/* transfer count bits 15-0 */
/* Transmit data source address in system memory bits 15-0 */
/* Transmit data source address in system memory bits 31-16 */
/* Receive data destination address in system memory bits 15-0 */
/* Receive data destination address in system memory bits 31-16 */
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_send_change_request
* Issue send change request mailbox command.
*
* Input:
* ha: adapter state pointer.
* fmt: Registration format.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_send_lfa
* Send a Loop Fabric Address mailbox command.
*
* Input:
* ha: adapter state pointer.
* lfa: LFA command structure pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* LFA_CB sz = 4 16bit words subcommand + 10 16bit words header. */
if (rval != QL_SUCCESS) {
return (rval);
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_clear_aca
* Issue clear ACA mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* lun: LUN.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_target_reset
* Issue target reset mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* delay: seconds.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* queue = NULL, all targets. */
index++) {
if (!VALID_DEVICE_ID(ha,
continue;
}
if (rval != QL_SUCCESS) {
break;
}
}
break;
}
}
} else {
delay);
}
} else {
/* queue = NULL, all targets. */
} else {
} else {
}
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_abort_target
* Issue abort target mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* delay: in seconds.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
/* Don't send Task Mgt */
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_lun_reset
* Issue LUN reset task management mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* lun: LUN.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_clear_task_set
* Issue clear task set mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* lun: LUN.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_abort_task_set
* Issue abort task set mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* lun: LUN.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_task_mgmt_iocb
* Function issues task management IOCB.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* lun: LUN.
* flags: control flags.
* delay: seconds.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context
*/
static int
{
int rval;
pkt_size = sizeof (ql_mbx_iocb_t);
return (QL_MEMORY_ALLOC_FAILED);
}
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_loop_port_bypass
* Issue loop port bypass mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_loop_port_enable
* Issue loop port enable mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_login_lport
* Issue login loop port mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* loop_id: FC loop id.
* opt: options.
* LLF_NONE, LLF_PLOGI
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
}
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_login_fport
* Issue login fabric port mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* loop_id: FC loop id.
* opt: options.
* LFF_NONE, LFF_NO_PLOGI, LFF_NO_PRLI
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
}
if (opt & LFF_NO_PLOGI) {
}
if (opt & LFF_NO_PRLI) {
}
} else {
} else {
}
/* Return mailbox data. */
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_logout_fabric_port
* Issue logout fabric port mailbox command.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_log_iocb
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* loop_id: FC Loop ID.
* flags: control flags.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
pkt_size = sizeof (ql_mbx_iocb_t);
return (QL_MEMORY_ALLOC_FAILED);
}
}
if (rval == QL_SUCCESS) {
}
case CS0_NO_LINK:
case CS0_FIRMWARE_NOT_READY:
break;
case CS0_NO_IOCB:
case CS0_NO_PCB_ALLOCATED:
break;
case CS0_NO_EXCH_CTRL_BLK:
break;
case CS0_COMMAND_FAILED:
break;
case CS1_PRLI_FAILED:
break;
case CS1_PRLI_RESPONSE_FAILED:
break;
case CS1_COMMAND_LOGGED_OUT:
break;
case CS1_PLOGI_FAILED:
default:
break;
}
break;
case CS0_PORT_NOT_LOGGED_IN:
break;
case CS0_NO_FLOGI_ACC:
case CS0_NO_FABRIC_PRESENT:
break;
case CS0_ELS_REJECT_RECEIVED:
break;
case CS0_PORT_ID_USED:
break;
case CS0_N_PORT_HANDLE_USED:
break;
break;
case CS0_CMD_PARAMETER_ERROR:
default:
break;
}
} else {
}
}
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_port_database
* Issue get port database mailbox command
* and copy context to device queue.
*
* Input:
* ha: adapter state pointer.
* tq: target queue pointer.
* opt: options.
* PDF_NONE, PDF_PLOGI, PDF_ADISC
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (rval);
}
PORT_DATABASE_SIZE)) != QL_SUCCESS) {
return (QL_MEMORY_ALLOC_FAILED);
}
} else {
} else {
}
}
if (rval == QL_SUCCESS) {
}
if (rval == QL_SUCCESS) {
if (PD_PORT_LOGIN(tq)) {
/* Names are big endian. */
}
} else {
if (PD_PORT_LOGIN(tq)) {
/* Names are big endian. */
tq->conc_sequences =
}
}
if (!PD_PORT_LOGIN(tq)) {
} else {
} else {
}
}
}
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_loop_position_map
* Issue get loop position map mailbox command.
*
* Input:
* ha: adapter state pointer.
* size: size of data buffer.
* bufp: data pointer for DMA data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (QL_MEMORY_ALLOC_FAILED);
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_set_rnid_params
* Issue set RNID parameters mailbox command.
*
* Input:
* ha: adapter state pointer.
* size: size of data buffer.
* bufp: data pointer for DMA data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (rval);
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_send_rnid_els
* Issue a send node identfication data mailbox command.
*
* Input:
* ha: adapter state pointer.
* loop_id: FC loop id.
* opt: options.
* size: size of data buffer.
* bufp: data pointer for DMA data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (QL_MEMORY_ALLOC_FAILED);
}
} else {
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_rnid_params
* Issue get RNID parameters mailbox command.
*
* Input:
* ha: adapter state pointer.
* size: size of data buffer.
* bufp: data pointer for DMA data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (QL_MEMORY_ALLOC_FAILED);
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_link_status
* Issue get link status mailbox command.
*
* Input:
* ha: adapter state pointer.
* loop_id: FC loop id or n_port_hdl.
* size: size of data buffer.
* bufp: data pointer for DMA data.
* port_no: port number to query.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval = QL_SUCCESS;
int retry = 0;
do {
return (QL_MEMORY_ALLOC_FAILED);
}
} else {
}
} else {
if (retry) {
}
} else {
port_no);
}
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
}
/*
* Some of the devices want d_id in the payload,
* strictly as per standard. Let's retry.
*/
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_status_counts
* Issue get adapter link status counts mailbox command.
*
* Input:
* ha: adapter state pointer.
* loop_id: FC loop id or n_port_hdl.
* size: size of data buffer.
* bufp: data pointer for DMA data.
* port_no: port number to query.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval = QL_SUCCESS;
return (QL_MEMORY_ALLOC_FAILED);
}
} else {
/* allows reporting when link is down */
}
} else {
port_no);
}
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_reset_link_status
* Issue Reset Link Error Status mailbox command
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_loop_reset
* Issue loop reset.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_initiate_lip
* Initiate LIP mailbox command.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_full_login_lip
* Issue full login LIP mailbox command.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_lip_reset
* Issue lip reset to a port.
*
* Input:
* ha: adapter state pointer.
* loop_id: FC loop id.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_abort_command
* Abort command aborts a specified IOCB.
*
* Input:
* ha: adapter state pointer.
* sp: SRB structure pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
} else {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_abort_cmd_iocb
* Function issues abort command IOCB.
*
* Input:
* ha: adapter state pointer.
* sp: SRB structure pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Interrupt or Kernel context, no mailbox commands allowed.
*/
static int
{
int rval;
pkt_size = sizeof (ql_mbx_iocb_t);
return (QL_MEMORY_ALLOC_FAILED);
}
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_verify_checksum
* Verify loaded RISC firmware.
*
* Input:
* ha = adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_id_list
* Get d_id and loop ID list.
*
* Input:
* ha: adapter state pointer.
* bp: data pointer for DMA data.
* size: size of data buffer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (QL_MEMORY_ALLOC_FAILED);
}
} else {
}
if (rval == QL_SUCCESS) {
}
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_wrt_risc_ram
* Load RISC RAM.
*
* Input:
* ha: adapter state pointer.
* risc_address: risc ram word address.
* bp: DMA pointer.
* word_count: 16/32bit word count.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_rd_risc_ram
* Get RISC RAM.
*
* Input:
* ha: adapter state pointer.
* risc_address: risc ram word address.
* bp: direct data pointer.
* word_count: 16/32bit word count.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_issue_mbx_iocb
* Issue IOCB using mailbox command
*
* Input:
* ha: adapter state pointer.
* bp: buffer pointer.
* size: buffer size.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
QL_SUCCESS) {
return (rval);
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_mbx_wrap_test
* Mailbox register wrap test.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval == QL_SUCCESS) {
}
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_execute_fw
* Start adapter firmware.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
rval = QL_SUCCESS;
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_firmware_option
* Get Firmware Options Mailbox Command.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_set_firmware_option
* Set Firmware Options Mailbox Command.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_init_firmware
* Initialize firmware mailbox command.
*
* Input:
* ha: adapter state pointer.
* ha->init_ctrl_blk = setup for transmit.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
QL_SUCCESS) {
return (rval);
}
0x204c : 0x52);
}
}
} else {
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_firmware_state
* Get adapter firmware state.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_adapter_id
* Get adapter ID and topology.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
}
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_fw_version
* Get firmware version.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_data_rate
* Issue data rate Mailbox Command.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
} else {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_Diag_Loopback
* Issue Reset Link Status mailbox command
*
* Input:
* ha: adapter state pointer.
* bp: buffer pointer.
* size: buffer size.
* opt: command options.
* it_cnt: iteration count.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
QL_SUCCESS) {
return (rval);
}
}
if (rval == QL_SUCCESS) {
}
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_diag_echo
* Issue Diag echo mailbox command. Valid for qla23xx HBA's.
*
* Input:
* ha: adapter state pointer.
* bp: buffer pointer.
* size: buffer size.
* opt: command options.
* mr: pointer to mailbox status.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
QL_SUCCESS) {
return (rval);
}
if (rval == QL_SUCCESS) {
}
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_serdes_param
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_get_timeout_parameters
* Issue get timeout parameters mailbox command.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval == QL_SUCCESS) {
/* Get 2 * R_A_TOV in seconds */
*tov = R_A_TOV_DEFAULT;
} else {
}
/*
* Adjust value to prevent driver timeout at the same
* time as device.
*/
}
} else {
*tov = R_A_TOV_DEFAULT;
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_stop_firmware
* Issue stop firmware Mailbox Command.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_read_sfp
* Issue Read SFP Mailbox command
*
* Input:
* ha: adapter state pointer.
* mem: pointer to dma memory object for command.
* dev: Device address (A0h or A2h).
* addr: Data address on SFP EEPROM (0�255).
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_iidma_rate
*
* Input:
* ha: adapter state pointer.
* idma_rate: Pointer to iidma rate.
* option: iidma firmware option (set or get data).
* 0 --> Get iidma rate
* 1 --> Set iidma rate
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
if (option == 0) {
}
}
return (rval);
}
/*
* ql_set_xmit_parms
* Set transmit parameters
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_fw_etrace
* Firmware extended tracing.
*
* Input:
* ha: adapter state pointer.
* mem: pointer to dma memory object for command.
* opt: options and opcode.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval = QL_SUCCESS;
/* currently no supported options */
switch (op_code) {
case FTO_INSERT_TIME_STAMP:
break;
case FTO_FCE_TRACE_ENABLE:
/* Firmware Fibre Channel Event Trace Buffer */
break;
case FTO_EXT_TRACE_ENABLE:
/* Firmware Extended Trace Buffer */
break;
case FTO_FCE_TRACE_DISABLE:
/* also causes ISP25xx to flush its internal FCE buffer. */
break;
case FTO_EXT_TRACE_DISABLE:
/* just sending the opcode disables it */
break;
default:
break;
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_reset_menlo
* Reset Menlo Mailbox Command.
*
* Input:
* ha: adapter state pointer.
* opt: options.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_restart_mpi
* The Restart MPI Firmware Mailbox Command will reset the MPI RISC,
* reload MPI firmware from Flash, and execute the firmware.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
/* Return mailbox data. */
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}
/*
* ql_idc_request
* Inter-Driver Communication Request.
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval == QL_SUCCESS) {
}
} else {
}
return (rval);
}
/*
* ql_idc_ack
* Inter-Driver Communication Acknowledgement.
*
* Input:
* ha: adapter state pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (rval);
}
/*
* ql_idc_time_extend
* Inter-Driver Communication Time Extend
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (rval);
}
/*
* ql_set_port_config
* The Set Port Configuration command sets the configuration for the
* external 10G port associated with this function
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (rval);
}
/*
* ql_get_port_config
* The Get Port Configuration command retrieves the current configuration
* for the external 10G port associated with this function
*
* Input:
* ha: adapter state pointer.
* mr: pointer for mailbox data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
if (rval == QL_SUCCESS) {
}
} else {
}
return (rval);
}
/*
* ql_flash_access
* The Get Port Configuration command retrieves the current configuration
* for the external 10G port associated with this function
*
* Input:
* ha: adapter state pointer.
* cmd: command.
* start: 32bit word address.
* end: 32bit word address.
* dp: 32bit word pointer.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
} else {
}
if (rval != QL_SUCCESS) {
} else {
}
}
return (rval);
}
/*
* ql_get_xgmac_stats
* Issue et XGMAC Statistics Mailbox command
*
* Input:
* ha: adapter state pointer.
* size: size of data buffer.
* bufp: data pointer for DMA data.
*
* Returns:
* ql local function return status code.
*
* Context:
* Kernel context.
*/
int
{
int rval;
return (QL_MEMORY_ALLOC_FAILED);
}
if (rval == QL_SUCCESS) {
}
if (rval != QL_SUCCESS) {
} else {
/*EMPTY*/
}
return (rval);
}