5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * CDDL HEADER START
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * The contents of this file are subject to the terms of the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Common Development and Distribution License (the "License").
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * You may not use this file except in compliance with the License.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * or http://www.opensolaris.org/os/licensing.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * See the License for the specific language governing permissions
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * and limitations under the License.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * When distributing Covered Code, include this CDDL HEADER in each
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If applicable, add the following below this CDDL HEADER, with the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * fields enclosed by brackets "[]" replaced with your own identifying
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * information: Portions Copyright [yyyy] [name of copyright owner]
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * CDDL HEADER END
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald * Copyright 2014 OmniTI Computer Consulting, Inc. All rights reserved.
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * Copyright (c) 2000 to 2010, LSI Corporation.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * All rights reserved.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Redistribution and use in source and binary forms of all code within
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * this file that is exclusively owned by LSI, with or without
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * modification, is permitted provided that, in addition to the CDDL 1.0
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * License requirements, the following conditions are met:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Neither the name of the author nor the names of its contributors may be
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * used to endorse or promote products derived from this software without
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * specific prior written permission.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * DAMAGE.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * mptsas_impl - This file contains all the basic functions for communicating
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * to MPT based hardware.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#if defined(lint) || defined(DEBUG)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#define MPTSAS_DEBUG
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * standard header files
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/note.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/scsi.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/pci.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#pragma pack(1)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_type.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_cnfg.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_init.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_ioc.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_sas.h>
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada#include <sys/scsi/adapters/mpt_sas/mpi/mpi2_tool.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#pragma pack()
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * private header files.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mptsas_var.h>
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#include <sys/scsi/adapters/mpt_sas/mptsas_smhba.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * FMA header files.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#include <sys/fm/io/ddi.h>
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * prototypes
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic void mptsas_ioc_event_cmdq_add(mptsas_t *mpt, m_event_struct_t *cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic void mptsas_ioc_event_cmdq_delete(mptsas_t *mpt, m_event_struct_t *cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic m_event_struct_t *mptsas_ioc_event_find_by_cmd(mptsas_t *mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China struct mptsas_cmd *cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * add ioc evnet cmd into the queue
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic void
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_ioc_event_cmdq_add(mptsas_t *mpt, m_event_struct_t *cmd)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((cmd->m_event_linkp = mpt->m_ioc_event_cmdq) == NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &cmd->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdq = cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *(mpt->m_ioc_event_cmdtail) = cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &cmd->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * remove specified cmd from the ioc event queue
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic void
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_ioc_event_cmdq_delete(mptsas_t *mpt, m_event_struct_t *cmd)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m_event_struct_t *prev = mpt->m_ioc_event_cmdq;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (prev == cmd) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mpt->m_ioc_event_cmdq = cmd->m_event_linkp) == NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &mpt->m_ioc_event_cmdq;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (prev != NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (prev->m_event_linkp == cmd) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China prev->m_event_linkp = cmd->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (cmd->m_event_linkp == NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail = &prev->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->m_event_linkp = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China prev = prev->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic m_event_struct_t *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_ioc_event_find_by_cmd(mptsas_t *mpt, struct mptsas_cmd *cmd)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = mpt->m_ioc_event_cmdq;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (ioc_cmd != NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (&(ioc_cmd->m_event_cmd) == cmd) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (ioc_cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (ioc_cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinavoid
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_destroy_ioc_event_cmd(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd_tmp = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = mpt->m_ioc_event_cmdq;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * because the IOC event queue is resource of per instance for driver,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * it's not only ACK event commands used it, but also some others used
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * it. We need destroy all ACK event commands when IOC reset, but can't
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * disturb others.So we use filter to clear the ACK event cmd in ioc
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * event queue, and other requests should be reserved, and they would
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * be free by its owner.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (ioc_cmd != NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ioc_cmd->m_event_cmd.cmd_flags & CFLAG_CMDACK) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG20(("destroy!! remove Ack Flag ioc_cmd\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mpt->m_ioc_event_cmdq =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd->m_event_linkp) == NULL)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_ioc_event_cmdtail =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_ioc_event_cmdq;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd_tmp = ioc_cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China kmem_free(ioc_cmd_tmp, M_EVENT_STRUCT_SIZE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * it's not ack cmd, so continue to check next one
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG20(("destroy!! it's not Ack Flag, continue\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = ioc_cmd->m_event_linkp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinavoid
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_start_config_page_access(mptsas_t *mpt, mptsas_cmd_t *cmd)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t request;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SGESimple64_t sge;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt = cmd->cmd_pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_config_request_t *config = pkt->pkt_ha_private;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t direction;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles uint32_t length, flagslength;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles uint64_t request_desc;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Point to the correct message and clear it as well as the global
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * config page memory.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China request = (pMpi2ConfigRequest_t)(mpt->m_req_frame +
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mpt->m_req_frame_size * cmd->cmd_slot));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(request, mpt->m_req_frame_size);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Form the request message.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Function,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_CONFIG);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Action, config->action);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China direction = MPI2_SGE_FLAGS_IOC_TO_HOST;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China length = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sge = (pMpi2SGESimple64_t)&request->PageBufferSGE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config->action == MPI2_CONFIG_ACTION_PAGE_HEADER) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config->page_type > MPI2_CONFIG_PAGETYPE_MASK) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &request->Header.PageType,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &request->ExtPageType, config->page_type);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &request->Header.PageType, config->page_type);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->ExtPageType,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config->ext_page_type);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put16(mpt->m_acc_req_frame_hdl, &request->ExtPageLength,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config->ext_page_length);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageType,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config->page_type);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageLength,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config->page_length);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &request->Header.PageVersion, config->page_version);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((config->page_type & MPI2_CONFIG_PAGETYPE_MASK) ==
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China length = config->ext_page_length * 4;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China length = config->page_length * 4;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config->action == MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China direction = MPI2_SGE_FLAGS_HOST_TO_IOC;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.Low,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (uint32_t)cmd->cmd_dma_addr);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->Address.High,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (uint32_t)(cmd->cmd_dma_addr >> 32));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &request->Header.PageNumber,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config->page_number);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &request->PageAddress,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config->page_address);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flagslength = ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China direction |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flagslength |= length;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_req_frame_hdl, &sge->FlagsLength, flagslength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles request_desc = (cmd->cmd_slot << 16) +
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm = NULL;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPTSAS_START_CMD(mpt, request_desc);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(mpt->m_dma_req_frame_hdl) !=
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_SUCCESS) ||
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(mpt->m_acc_req_frame_hdl) !=
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_SUCCESS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_access_config_page(mptsas_t *mpt, uint8_t action, uint8_t page_type,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t page_number, uint32_t page_address, int (*callback) (mptsas_t *,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China caddr_t, ddi_acc_handle_t, uint16_t, uint32_t, va_list), ...)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_list ap;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t attrs;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t cookie;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada size_t len = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_config_request_t config;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, config_flags = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t reply;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t iocloginfo;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China caddr_t page_memp;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald boolean_t free_dma = B_FALSE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_start(ap, callback);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get a command from the pool.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((rval = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "command pool is full for config "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "page request");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_REQUEST_POOL_CMD;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)&config, sizeof (config));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Save the data for this request to be used in the call to start the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * config header request.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.action = MPI2_CONFIG_ACTION_PAGE_HEADER;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_type = page_type;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_number = page_number;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_address = page_address;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Form a blank cmd/pkt to store the acknowledgement message
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)&config;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_CMDIOC | CFLAG_CONFIG;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Save the config header request message in a slot.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_save_cmd(mpt, cmd) == TRUE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags |= CFLAG_PREPARED;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_waitq_add(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * If this is a request for a RAID info page, or any page called during
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * the RAID info page request, poll because these config page requests
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * are nested. Poll to avoid data corruption due to one page's data
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * overwriting the outer page request's data. This can happen when
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * the mutex is released in cv_wait.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada if ((page_type == MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG) ||
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (page_type == MPI2_CONFIG_PAGETYPE_RAID_VOLUME) ||
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (page_type == MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK)) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (void) mptsas_poll(mpt, cmd, pkt->pkt_time * 1000);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada } else {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada while ((cmd->cmd_flags & CFLAG_FINISHED) == 0) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada cv_wait(&mpt->m_config_cv, &mpt->m_mutex);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Check if the header request completed without timing out
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_flags & CFLAG_TIMEOUT) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config header request timeout");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * cmd_rfm points to the reply message if a reply was given. Check the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * IOCStatus to make sure everything went OK with the header request.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_rfm) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_ADDRESS_REPLY;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles - (mpt->m_reply_frame_dma_addr & 0xffffffffu)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_type = ddi_get8(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->Header.PageType);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_number = ddi_get8(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->Header.PageNumber);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_length = ddi_get8(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->Header.PageLength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_version = ddi_get8(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->Header.PageVersion);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.ext_page_type = ddi_get8(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->ExtPageType);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.ext_page_length = ddi_get16(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->ExtPageLength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->IOCStatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->IOCLogInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG13(("mptsas_access_config_page header: "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocloginfo));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((config.page_type & MPI2_CONFIG_PAGETYPE_MASK) ==
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China len = (config.ext_page_length * 4);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China else
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China len = (config.page_length * 4);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_RESET) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "ioc reset abort config header "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "request");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Put the reply frame back on the free queue, increment the free
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * index, and write the new index to the free index register. But only
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * if this reply is an ADDRESS reply.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_ADDRESS_REPLY) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_free_queue_hdl,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du &((uint32_t *)(void *)mpt->m_free_queue)[mpt->m_free_index],
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_free_queue_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du if (++mpt->m_free_index == mpt->m_free_queue_depth) {
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du mpt->m_free_index = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyFreeHostIndex,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du mpt->m_free_index);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config_flags &= (~MPTSAS_ADDRESS_REPLY);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Allocate DMA buffer here. Store the info regarding this buffer in
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * the cmd struct so that it can be used for this specific command and
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * de-allocated after the command completes. The size of the reply
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * will not be larger than the reply frame size.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China attrs = mpt->m_msg_dma_attr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China attrs.dma_attr_sgllen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China attrs.dma_attr_granular = (uint32_t)len;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, attrs,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &cmd->cmd_dmahandle, &accessp, &page_memp,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada len, &cookie) == FALSE) {
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald rval = DDI_FAILURE;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mptsas_log(mpt, CE_WARN,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles "mptsas_dma_addr_create(len=0x%x) failed", (int)len);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* NOW we can safely call mptsas_dma_addr_destroy(). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_dma = B_TRUE;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_dma_addr = cookie.dmac_laddress;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(page_memp, len);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Save the data for this request to be used in the call to start the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * config page read
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.action = action;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config.page_address = page_address;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Re-use the cmd that was used to get the header. Reset some of the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * values.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)&config;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_PREPARED | CFLAG_CMDIOC | CFLAG_CONFIG;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Send the config page request. cmd is re-used from header request.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_start_config_page_access(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * If this is a request for a RAID info page, or any page called during
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * the RAID info page request, poll because these config page requests
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * are nested. Poll to avoid data corruption due to one page's data
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * overwriting the outer page request's data. This can happen when
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * the mutex is released in cv_wait.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada if ((page_type == MPI2_CONFIG_EXTPAGETYPE_RAID_CONFIG) ||
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (page_type == MPI2_CONFIG_PAGETYPE_RAID_VOLUME) ||
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (page_type == MPI2_CONFIG_PAGETYPE_RAID_PHYSDISK)) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (void) mptsas_poll(mpt, cmd, pkt->pkt_time * 1000);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada } else {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada while ((cmd->cmd_flags & CFLAG_FINISHED) == 0) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada cv_wait(&mpt->m_config_cv, &mpt->m_mutex);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Check if the request completed without timing out
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_flags & CFLAG_TIMEOUT) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config page request timeout");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * cmd_rfm points to the reply message if a reply was given. The reply
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * frame and the config page are returned from this function in the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * param list.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (cmd->cmd_rfm) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config_flags |= MPTSAS_ADDRESS_REPLY;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(cmd->cmd_dmahandle, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China reply = (pMpi2ConfigReply_t)(mpt->m_reply_frame + (cmd->cmd_rfm
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles - (mpt->m_reply_frame_dma_addr & 0xffffffffu)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->IOCStatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocloginfo = ddi_get32(mpt->m_acc_reply_frame_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &reply->IOCLogInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (callback(mpt, page_memp, accessp, iocstatus, iocloginfo, ap)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fma_check(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Check the DMA/ACC handles and then free the DMA buffer.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(cmd->cmd_dmahandle) != DDI_SUCCESS) ||
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(accessp) != DDI_SUCCESS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_TRAN_ERR) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "config fma error");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_RESET) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "ioc reset abort config request");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto page_done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinapage_done:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_end(ap);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Put the reply frame back on the free queue, increment the free
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * index, and write the new index to the free index register. But only
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * if this reply is an ADDRESS reply.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_ADDRESS_REPLY) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_acc_free_queue_hdl,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du &((uint32_t *)(void *)mpt->m_free_queue)[mpt->m_free_index],
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_free_queue_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du if (++mpt->m_free_index == mpt->m_free_queue_depth) {
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du mpt->m_free_index = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->ReplyFreeHostIndex,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du mpt->m_free_index);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_dma)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&cmd->cmd_dmahandle, &accessp);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (cmd && (cmd->cmd_flags & CFLAG_PREPARED)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_remove_cmd(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config_flags &= (~MPTSAS_REQUEST_POOL_CMD);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_REQUEST_POOL_CMD)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (config_flags & MPTSAS_CMD_TIMEOUT) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_restart_ioc(mpt)) == DDI_FAILURE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_send_config_request_msg(mptsas_t *mpt, uint8_t action, uint8_t pagetype,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t pageaddress, uint8_t pagenumber, uint8_t pageversion,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles uint8_t pagelength, uint32_t SGEflagslength, uint64_t SGEaddress)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t config;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int send_numbytes;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(mpt->m_hshk_memp, sizeof (MPI2_CONFIG_REQUEST));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config = (pMpi2ConfigRequest_t)mpt->m_hshk_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Function, MPI2_FUNCTION_CONFIG);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Action, action);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageNumber, pagenumber);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageType, pagetype);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, &config->PageAddress, pageaddress);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageVersion, pageversion);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageLength, pagelength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles &config->PageBufferSGE.MpiSimple.u.Address64.Low, SGEaddress);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles ddi_put32(mpt->m_hshk_acc_hdl,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles &config->PageBufferSGE.MpiSimple.u.Address64.High,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles SGEaddress >> 32);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China send_numbytes = sizeof (MPI2_CONFIG_REQUEST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Post message via handshake
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_send_handshake_msg(mpt, (caddr_t)config, send_numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_hshk_acc_hdl)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_send_extended_config_request_msg(mptsas_t *mpt, uint8_t action,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t extpagetype, uint32_t pageaddress, uint8_t pagenumber,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t pageversion, uint16_t extpagelength,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles uint32_t SGEflagslength, uint64_t SGEaddress)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ConfigRequest_t config;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int send_numbytes;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(mpt->m_hshk_memp, sizeof (MPI2_CONFIG_REQUEST));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China config = (pMpi2ConfigRequest_t)mpt->m_hshk_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Function, MPI2_FUNCTION_CONFIG);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Action, action);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageNumber, pagenumber);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageType,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_EXTENDED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->ExtPageType, extpagetype);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl, &config->PageAddress, pageaddress);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_hshk_acc_hdl, &config->Header.PageVersion, pageversion);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put16(mpt->m_hshk_acc_hdl, &config->ExtPageLength, extpagelength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &config->PageBufferSGE.MpiSimple.FlagsLength, SGEflagslength);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_hshk_acc_hdl,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles &config->PageBufferSGE.MpiSimple.u.Address64.Low, SGEaddress);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles ddi_put32(mpt->m_hshk_acc_hdl,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles &config->PageBufferSGE.MpiSimple.u.Address64.High,
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles SGEaddress >> 32);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China send_numbytes = sizeof (MPI2_CONFIG_REQUEST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Post message via handshake
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_send_handshake_msg(mpt, (caddr_t)config, send_numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_hshk_acc_hdl)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_ioc_wait_for_response(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int polls = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus) & MPI2_HIS_IOP_DOORBELL_STATUS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (polls++ > 60000) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_ioc_wait_for_doorbell(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int polls = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while ((ddi_get32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus) & MPI2_HIM_DIM) == 0) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (polls++ > 300000) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_send_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * clean pending doorbells
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ((MPI2_FUNCTION_HANDSHAKE << MPI2_DOORBELL_FUNCTION_SHIFT) |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ((numbytes / 4) << MPI2_DOORBELL_ADD_DWORDS_SHIFT)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed. Doorbell not ready\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * clean pending doorbells again
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed. Doorbell not "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "cleared\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * post handshake message
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; (i < numbytes / 4); i++, memp += 4) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get32(accessp, (uint32_t *)((void *)(memp))));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_response(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_send_handshake failed posting "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "message\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_check_acc_handle(mpt->m_datap) != DDI_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_acc_err_clear(mpt->m_datap, DDI_FME_VER0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_handshake_msg(mptsas_t *mpt, caddr_t memp, int numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int i, totalbytes, bytesleft;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint16_t val;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * wait for doorbell
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failed. Doorbell not ready\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * get first 2 bytes of handshake message to determine how much
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * data we will be getting
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < 2; i++, memp += 2) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & MPI2_DOORBELL_DATA_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting initial"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " data\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put16(accessp, (uint16_t *)((void *)(memp)), val);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (i == 1) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China totalbytes = (val & 0xFF) * 2;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If we are expecting less bytes than the message wants to send
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * we simply save as much as we expected and then throw out the rest
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * later
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (totalbytes > (numbytes / 2)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bytesleft = ((numbytes / 2) - 2);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bytesleft = (totalbytes - 2);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get the rest of the data
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < bytesleft; i++, memp += 2) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) & MPI2_DOORBELL_DATA_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " main data\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put16(accessp, (uint16_t *)((void *)(memp)), val);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Sometimes the device will send more data than is expected
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * This data is not used by us but needs to be cleared from
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * ioc doorbell. So we just read the values and throw
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * them out.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (totalbytes > (numbytes / 2)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = (numbytes / 2); i < totalbytes; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China val = (ddi_get32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->Doorbell) &
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_DOORBELL_DATA_MASK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostInterruptStatus, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_ioc_wait_for_doorbell(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG19(("mptsas_get_handshake failure getting "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "extra garbage data\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostInterruptStatus, 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_check_acc_handle(mpt->m_datap) != DDI_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_acc_err_clear(mpt->m_datap, DDI_FME_VER0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_kick_start(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int polls = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t diag_reg, ioc_state, saved_HCB_size;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
2856b5e3c5137244fef1ffe380906d7006f41d5bAda * Start a hard reset. Write magic number and wait 500 mSeconds.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPTSAS_ENABLE_DRWE(mpt);
2856b5e3c5137244fef1ffe380906d7006f41d5bAda drv_usecwait(500000);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Read the current Diag Reg and save the Host Controlled Boot size.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China diag_reg = ddi_get32(mpt->m_datap, &mpt->m_reg->HostDiagnostic);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China saved_HCB_size = ddi_get32(mpt->m_datap, &mpt->m_reg->HCBSize);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada * Set Reset Adapter bit and wait 50 mSeconds.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China diag_reg |= MPI2_DIAG_RESET_ADAPTER;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg);
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada drv_usecwait(50000);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Poll, waiting for Reset Adapter bit to clear. 300 Seconds max
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * (600000 * 500 = 300,000,000 uSeconds, 300 seconds).
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If no more adapter (all FF's), just return failure.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (polls = 0; polls < 600000; polls++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China diag_reg = ddi_get32(mpt->m_datap,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &mpt->m_reg->HostDiagnostic);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (diag_reg == 0xFFFFFFFF) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!(diag_reg & MPI2_DIAG_RESET_ADAPTER)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China drv_usecwait(500);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (polls == 600000) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Check if adapter is in Host Boot Mode. If so, restart adapter
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * assuming the HCB points to good FW.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Set BootDeviceSel to HCDW (Host Code and Data Window).
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (diag_reg & MPI2_DIAG_HCB_MODE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China diag_reg &= ~MPI2_DIAG_BOOT_DEVICE_SELECT_MASK;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China diag_reg |= MPI2_DIAG_BOOT_DEVICE_SELECT_HCDW;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Re-enable the HCDW.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HCBSize,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (saved_HCB_size | MPI2_HCB_SIZE_HCB_ENABLE));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Restart the adapter.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China diag_reg &= ~MPI2_DIAG_HOLD_IOC_RESET;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->HostDiagnostic, diag_reg);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Disable writes to the Host Diag register.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put32(mpt->m_datap, &mpt->m_reg->WriteSequence,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_WRSEQ_FLUSH_KEY_VALUE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada * Wait 60 seconds max for FW to come to ready state.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada for (polls = 0; polls < 60000; polls++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_state = ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ioc_state == 0xFFFFFFFF) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((ioc_state & MPI2_IOC_STATE_MASK) ==
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_IOC_STATE_READY) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
76a4caf6c7b8f1c35d80a77bd8005aeae6197786Ada if (polls == 60000) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Clear the ioc ack events queue.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_destroy_ioc_event_cmd(mpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonaldmptsas_ioc_reset(mptsas_t *mpt, int first_time)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int polls = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t reset_msg;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t ioc_state;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_state = ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If chip is already in ready state then there is nothing to do.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ioc_state == MPI2_IOC_STATE_READY) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (MPTSAS_NO_RESET);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If the chip is already operational, we just need to send
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * it a message unit reset to put it back in the ready state
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ioc_state & MPI2_IOC_STATE_OPERATIONAL) {
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald /*
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * If the first time, try MUR anyway, because we haven't even
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * queried the card for m_event_replay and other capabilities.
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * Other platforms do it this way, we can still do a hard
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * reset if we need to, MUR takes less time than a full
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * adapter reset, and there are reports that some HW
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald * combinations will lock up when receiving a hard reset.
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald */
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald if ((first_time || mpt->m_event_replay) &&
e18306b13ed357bd545696aa96b53617b64db4a3Dan McDonald (mpt->m_softstate & MPTSAS_SS_MSG_UNIT_RESET)) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada reset_msg = MPI2_FUNCTION_IOC_MESSAGE_UNIT_RESET;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada ddi_put32(mpt->m_datap, &mpt->m_reg->Doorbell,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada (reset_msg << MPI2_DOORBELL_FUNCTION_SHIFT));
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_ioc_wait_for_response(mpt)) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada NDBG19(("mptsas_ioc_reset failure sending "
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada "message_unit_reset\n"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto hard_reset;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /*
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * Wait no more than 60 seconds for chip to become
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * ready.
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada while ((ddi_get32(mpt->m_datap, &mpt->m_reg->Doorbell) &
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada MPI2_IOC_STATE_READY) == 0x0) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada drv_usecwait(1000);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (polls++ > 60000) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada goto hard_reset;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada }
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada }
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /*
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * Save the last reset mode done on IOC which will be
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * helpful while resuming from suspension.
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_softstate |= MPTSAS_DID_MSG_UNIT_RESET;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada /*
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * the message unit reset would do reset operations
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * clear reply and request queue, so we should clear
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada * ACK event cmd.
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada */
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_destroy_ioc_event_cmd(mpt);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada return (MPTSAS_SUCCESS_MUR);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinahard_reset:
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_softstate &= ~MPTSAS_DID_MSG_UNIT_RESET;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_kick_start(mpt) == DDI_FAILURE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (MPTSAS_RESET_FAIL);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (MPTSAS_SUCCESS_HARDRESET);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_request_from_pool(mptsas_t *mpt, mptsas_cmd_t **cmd,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China struct scsi_pkt **pkt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = kmem_zalloc(M_EVENT_STRUCT_SIZE, KM_SLEEP);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ioc_cmd == NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd->m_event_linkp = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_add(mpt, ioc_cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *cmd = &(ioc_cmd->m_event_cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *pkt = &(ioc_cmd->m_event_pkt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinavoid
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_return_to_pool(mptsas_t *mpt, mptsas_cmd_t *cmd)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m_event_struct_t *ioc_cmd = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = mptsas_ioc_event_find_by_cmd(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ioc_cmd == NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_ioc_event_cmdq_delete(mpt, ioc_cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China kmem_free(ioc_cmd, M_EVENT_STRUCT_SIZE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ioc_cmd = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * NOTE: We should be able to queue TM requests in the controller to make this
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * a lot faster. If resetting all targets, for example, we can load the hi
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * priority queue with its limit and the controller will reply as they are
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * completed. This way, we don't have to poll for one reply at a time.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Think about enhancing this later.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_ioc_task_management(mptsas_t *mpt, int task_type, uint16_t dev_handle,
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada int lun, uint8_t *reply, uint32_t reply_size, int mode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * In order to avoid allocating variables on the stack,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * we make use of the pre-existing mptsas_cmd_t and
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * scsi_pkt which are included in the mptsas_t which
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * is passed to this routine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SCSITaskManagementRequest_t task;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = FALSE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_slots_t *slots = mpt->m_active;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles uint64_t request_desc, i;
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada pMPI2DefaultReply_t reply_msg;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Can't start another task management routine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (slots->m_slot[MPTSAS_TM_SLOT(mpt)] != NULL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "Can only start 1 task management"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " command at a time\n");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (FALSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd = &(mpt->m_event_task_mgmt.m_event_cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt = &(mpt->m_event_task_mgmt.m_event_pkt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb[0];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = (FLAG_NOINTR | FLAG_HEAD);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_address.a_target = dev_handle;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_address.a_lun = (uchar_t)lun;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_scblen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_TM_CMD;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_slot = MPTSAS_TM_SLOT(mpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China slots->m_slot[MPTSAS_TM_SLOT(mpt)] = cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Store the TM message in memory location corresponding to the TM slot
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * number.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China task = (pMpi2SCSITaskManagementRequest_t)(mpt->m_req_frame +
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mpt->m_req_frame_size * cmd->cmd_slot));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(task, mpt->m_req_frame_size);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * form message for requested task
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_init_std_hdr(mpt->m_acc_req_frame_hdl, task, dev_handle, lun, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_FUNCTION_SCSI_TASK_MGMT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Set the task type
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_put8(mpt->m_acc_req_frame_hdl, &task->TaskType, task_type);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Send TM request using High Priority Queue.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles request_desc = (cmd->cmd_slot << 16) +
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPTSAS_START_CMD(mpt, request_desc);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = mptsas_poll(mpt, cmd, MPTSAS_POLL_TIME);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (pkt->pkt_reason == CMD_INCOMPLETE)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = FALSE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada /*
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * If a reply frame was used and there is a reply buffer to copy the
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * reply data into, copy it. If this fails, log a message, but don't
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada * fail the TM request.
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada */
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada if (cmd->cmd_rfm && reply) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (void) ddi_dma_sync(mpt->m_dma_reply_frame_hdl, 0, 0,
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada DDI_DMA_SYNC_FORCPU);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada reply_msg = (pMPI2DefaultReply_t)
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada (mpt->m_reply_frame + (cmd->cmd_rfm -
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles (mpt->m_reply_frame_dma_addr & 0xffffffffu)));
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada if (reply_size > sizeof (MPI2_SCSI_TASK_MANAGE_REPLY)) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada reply_size = sizeof (MPI2_SCSI_TASK_MANAGE_REPLY);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada mutex_exit(&mpt->m_mutex);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada for (i = 0; i < reply_size; i++) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada if (ddi_copyout((uint8_t *)reply_msg + i, reply + i, 1,
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada mode)) {
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada mptsas_log(mpt, CE_WARN, "failed to copy out "
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada "reply data for TM request");
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada break;
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada mutex_enter(&mpt->m_mutex);
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada }
c8f74a56af6974058d11efe681daeb7f4cdb78d1Ada
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * clear the TM slot before returning
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China slots->m_slot[MPTSAS_TM_SLOT(mpt)] = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * If we lost our task management command
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * we need to reset the ioc
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (rval == FALSE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_ioc_task_management failed "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "try to reset ioc to recovery!");
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_restart_ioc(mpt)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = FAILED;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles/*
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles * Complete firmware download frame for v2.0 cards.
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles */
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Gilesstatic void
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Gilesmptsas_uflash2(pMpi2FWDownloadRequest fwdownload,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_acc_handle_t acc_hdl, uint32_t size, uint8_t type,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_dma_cookie_t flsh_cookie)
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles{
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles pMpi2FWDownloadTCSGE_t tcsge;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles pMpi2SGESimple64_t sge;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles uint32_t flagslength;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &fwdownload->Function,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_FUNCTION_FW_DOWNLOAD);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &fwdownload->ImageType, type);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &fwdownload->MsgFlags,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &fwdownload->TotalImageSize, size);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles tcsge = (pMpi2FWDownloadTCSGE_t)&fwdownload->SGL;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &tcsge->ContextSize, 0);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &tcsge->DetailsLength, 12);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &tcsge->Flags, 0);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &tcsge->ImageOffset, 0);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &tcsge->ImageSize, size);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles sge = (pMpi2SGESimple64_t)(tcsge + 1);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles flagslength = size;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_SGE_FLAGS_END_OF_BUFFER |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_SGE_FLAGS_HOST_TO_IOC |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &sge->FlagsLength, flagslength);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &sge->Address.Low,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles flsh_cookie.dmac_address);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &sge->Address.High,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles (uint32_t)(flsh_cookie.dmac_laddress >> 32));
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles}
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles/*
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles * Complete firmware download frame for v2.5 cards.
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles */
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Gilesstatic void
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Gilesmptsas_uflash25(pMpi25FWDownloadRequest fwdownload,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_acc_handle_t acc_hdl, uint32_t size, uint8_t type,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_dma_cookie_t flsh_cookie)
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles{
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles pMpi2IeeeSgeSimple64_t sge;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles uint8_t flags;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &fwdownload->Function,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_FUNCTION_FW_DOWNLOAD);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &fwdownload->ImageType, type);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &fwdownload->MsgFlags,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_FW_DOWNLOAD_MSGFLGS_LAST_SEGMENT);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &fwdownload->TotalImageSize, size);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &fwdownload->ImageOffset, 0);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &fwdownload->ImageSize, size);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles sge = (pMpi2IeeeSgeSimple64_t)&fwdownload->SGL;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles flags = MPI2_IEEE_SGE_FLAGS_SIMPLE_ELEMENT |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI2_IEEE_SGE_FLAGS_SYSTEM_ADDR |
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI25_IEEE_SGE_FLAGS_END_OF_LIST;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put8(acc_hdl, &sge->Flags, flags);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &sge->Length, size);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &sge->Address.Low,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles flsh_cookie.dmac_address);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles ddi_put32(acc_hdl, &sge->Address.High,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles (uint32_t)(flsh_cookie.dmac_laddress >> 32));
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles}
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Gilesstatic int mptsas_enable_mpi25_flashupdate = 0;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_update_flash(mptsas_t *mpt, caddr_t ptrbuffer, uint32_t size,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t type, int mode)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * In order to avoid allocating variables on the stack,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * we make use of the pre-existing mptsas_cmd_t and
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * scsi_pkt which are included in the mptsas_t which
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * is passed to this routine.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t flsh_dma_attrs;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_cookie_t flsh_cookie;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t flsh_dma_handle;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t flsh_accessp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China caddr_t memp, flsh_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_cmd_t *cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rvalue = 0;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles uint64_t request_desc;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles if (mpt->m_MPI25 && !mptsas_enable_mpi25_flashupdate) {
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles /*
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles * The code is there but not tested yet.
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles * User has to know there are risks here.
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles */
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): "
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles "Updating firmware through MPI 2.5 has not been "
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles "tested yet!\n"
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles "To enable set mptsas_enable_mpi25_flashupdate to 1\n");
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles return (-1);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles } /* Otherwise, you pay your money and you take your chances. */
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((rvalue = (mptsas_request_from_pool(mpt, &cmd, &pkt))) == -1) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_update_flash(): allocation "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "failed. event ack command pool is full\n");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rvalue);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)cmd, sizeof (*cmd));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero((caddr_t)pkt, scsi_pkt_size());
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->ioc_cmd_slot = (uint32_t)rvalue;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * that describes the flash file.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flsh_dma_attrs = mpt->m_msg_dma_attr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flsh_dma_attrs.dma_attr_sgllen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, flsh_dma_attrs, &flsh_dma_handle,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &flsh_accessp, &flsh_memp, size, &flsh_cookie) == FALSE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada "(unable to allocate dma resource.");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(flsh_memp, size);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < size; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_copyin(ptrbuffer + i, flsh_memp + i, 1, mode);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(flsh_dma_handle, 0, 0, DDI_DMA_SYNC_FORDEV);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * form a cmd/pkt to store the fw download message
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_cdbp = (opaque_t)&cmd->cmd_cdb[0];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_scbp = (opaque_t)&cmd->cmd_scb;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_ha_private = (opaque_t)cmd;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_flags = FLAG_HEAD;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pkt->pkt_time = 60;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_pkt = pkt;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_scblen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_flags = CFLAG_CMDIOC | CFLAG_FW_CMD;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Save the command in a slot
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_save_cmd(mpt, cmd) == FALSE) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_dma_addr_destroy(&flsh_dma_handle, &flsh_accessp);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_return_to_pool(mpt, cmd);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (-1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Fill in fw download message
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(cmd->cmd_slot != 0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China memp = mpt->m_req_frame + (mpt->m_req_frame_size * cmd->cmd_slot);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(memp, mpt->m_req_frame_size);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles if (mpt->m_MPI25)
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mptsas_uflash25((pMpi25FWDownloadRequest)memp,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mpt->m_acc_req_frame_hdl, size, type, flsh_cookie);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles else
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mptsas_uflash2((pMpi2FWDownloadRequest)memp,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mpt->m_acc_req_frame_hdl, size, type, flsh_cookie);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Start command
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(mpt->m_dma_req_frame_hdl, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORDEV);
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles request_desc = (cmd->cmd_slot << 16) +
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_REQ_DESCRIPT_FLAGS_DEFAULT_TYPE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cmd->cmd_rfm = NULL;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPTSAS_START_CMD(mpt, request_desc);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rvalue = 0;
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni (void) cv_reltimedwait(&mpt->m_fw_cv, &mpt->m_mutex,
d3d50737e566cade9a08d73d2af95105ac7cd960Rafael Vanoni drv_usectohz(60 * MICROSEC), TR_CLOCK_TICK);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!(cmd->cmd_flags & CFLAG_FINISHED)) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mpt->m_softstate &= ~MPTSAS_SS_MSG_UNIT_RESET;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_restart_ioc(mpt)) == DDI_FAILURE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_restart_ioc failed");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rvalue = -1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_remove_cmd(mpt, cmd);
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_dma_addr_destroy(&flsh_dma_handle, &flsh_accessp);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rvalue);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic int
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_sasdevpage_0_cb(mptsas_t *mpt, caddr_t page_memp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_list ap)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifndef __lock_lint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SasDevicePage0_t sasdevpage;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du uint16_t *devhdl, *bay_num, *enclosure;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t *dev_info;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t *physport, *phynum;
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles uint16_t *pdevhdl, *io_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_device_page0 "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "header: IOCStatus=0x%x, IOCLogInfo=0x%x",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * signal that device traversal is complete.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_DEVICE_PGAD_FORM_MASK) ==
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SAS_DEVICE_PGAD_FORM_GET_NEXT_HANDLE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_done_traverse_dev = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China dev_info = va_arg(ap, uint32_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China physport = va_arg(ap, uint8_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China phynum = va_arg(ap, uint8_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pdevhdl = va_arg(ap, uint16_t *);
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du bay_num = va_arg(ap, uint16_t *);
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du enclosure = va_arg(ap, uint16_t *);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles io_flags = va_arg(ap, uint16_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sasdevpage = (pMpi2SasDevicePage0_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *dev_info = ddi_get32(accessp, &sasdevpage->DeviceInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &sasdevpage->DevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&sasdevpage->SASAddress);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *physport = ddi_get8(accessp, &sasdevpage->PhysicalPort);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *phynum = ddi_get8(accessp, &sasdevpage->PhyNum);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *pdevhdl = ddi_get16(accessp, &sasdevpage->ParentDevHandle);
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du *bay_num = ddi_get16(accessp, &sasdevpage->Slot);
9814ff7f66c508579713f72e69cbb6271713c068Yong-Feng Du *enclosure = ddi_get16(accessp, &sasdevpage->EnclosureHandle);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles *io_flags = ddi_get16(accessp, &sasdevpage->Flags);
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles if (*io_flags & MPI25_SAS_DEVICE0_FLAGS_FAST_PATH_CAPABLE) {
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles /*
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles * Leave a messages about FP cabability in the log.
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles */
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles mptsas_log(mpt, CE_CONT,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles "!w%016"PRIx64" FastPath Capable%s", *sas_wwn,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles (*io_flags &
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)?
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles " and Enabled":" but Disabled");
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles }
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS device page 0 to get DevHandle, device
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * info and SAS address.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_sas_device_page0(mptsas_t *mpt, uint32_t page_address,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint16_t *dev_handle, uint64_t *sas_wwn, uint32_t *dev_info,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t *physport, uint8_t *phynum, uint16_t *pdev_handle,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles uint16_t *bay_num, uint16_t *enclosure, uint16_t *io_flags)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_DEVICE, 0, page_address,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_sasdevpage_0_cb, page_address, dev_handle, sas_wwn,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China dev_info, physport, phynum, pdev_handle,
ed7418ae3db79aed594bc486a3b52fc971f4ea4fAndy Giles bay_num, enclosure, io_flags);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic int
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_sasexpdpage_0_cb(mptsas_t *mpt, caddr_t page_memp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_list ap)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifndef __lock_lint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ExpanderPage0_t expddevpage;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint16_t *devhdl;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada uint8_t physport;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada mptsas_phymask_t *phymask;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint16_t *pdevhdl;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t page_address;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page0 "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * signal that device traversal is complete.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) ==
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China devhdl = va_arg(ap, uint16_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada phymask = va_arg(ap, mptsas_phymask_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pdevhdl = va_arg(ap, uint16_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China expddevpage = (pMpi2ExpanderPage0_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *devhdl = ddi_get16(accessp, &expddevpage->DevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China physport = ddi_get8(accessp, &expddevpage->PhysicalPort);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *phymask = mptsas_physport_to_phymask(mpt, physport);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *pdevhdl = ddi_get16(accessp, &expddevpage->ParentDevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&expddevpage->SASAddress);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS device page 0 to get DevHandle, phymask
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * and SAS address.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_sas_expander_page0(mptsas_t *mpt, uint32_t page_address,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_smp_t *info)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_EXPANDER, 0, page_address,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_sasexpdpage_0_cb, page_address, &info->m_devhdl,
da5ab83fc888325fc812733d8a54bc5eab65c65cKeith M Wesolowski &info->m_addr.mta_wwn, &info->m_addr.mta_phymask, &info->m_pdevhdl);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic int
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_sasportpage_0_cb(mptsas_t *mpt, caddr_t page_memp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_list ap)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifndef __lock_lint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, i;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t *sas_addr = NULL;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t tmp_sas_wwn[SAS_WWN_BYTE_SIZE];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t *portwidth;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SasPortPage0_t sasportpage;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_port_page0 "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sas_wwn = va_arg(ap, uint64_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China portwidth = va_arg(ap, uint8_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sasportpage = (pMpi2SasPortPage0_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sas_addr = (uint8_t *)(&sasportpage->SASAddress);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < SAS_WWN_BYTE_SIZE; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China tmp_sas_wwn[i] = ddi_get8(accessp, sas_addr + i);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bcopy(tmp_sas_wwn, sas_wwn, SAS_WWN_BYTE_SIZE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *sas_wwn = LE_64(*sas_wwn);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *portwidth = ddi_get8(accessp, &sasportpage->PortWidth);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Request MPI configuration page SAS port page 0 to get initiator SAS address
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * and port width.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_sas_port_page0(mptsas_t *mpt, uint32_t page_address,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint64_t *sas_wwn, uint8_t *portwidth)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * which holds status info for the request.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PORT, 0, page_address,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_sasportpage_0_cb, sas_wwn, portwidth);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic int
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_sasiou_page_0_cb(mptsas_t *mpt, caddr_t page_memp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_list ap)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifndef __lock_lint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage0_t sasioupage0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int i, num_phys;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada uint32_t cpdi[MPTSAS_MAX_PHYS], *retrypage0, *readpage1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t port_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page0 "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China readpage1 = va_arg(ap, uint32_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China retrypage0 = va_arg(ap, uint32_t *);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sasioupage0 = (pMpi2SasIOUnitPage0_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(accessp, &sasioupage0->NumPhys);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada /*
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada * ASSERT that the num_phys value in SAS IO Unit Page 0 is the same as
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada * was initially set. This should never change throughout the life of
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada * the driver.
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada */
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada ASSERT(num_phys == mpt->m_num_phys);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].PortFlags);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].Port);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].ctrl_devhdl =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get16(accessp, &sasioupage0->
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PhyData[i].ControllerDevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].attached_devhdl =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get16(accessp, &sasioupage0->
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PhyData[i].AttachedDevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (port_flags & DISCOVERY_IN_PROGRESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *retrypage0 = *retrypage0 + 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *retrypage0 = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!(port_flags & AUTO_PORT_CONFIGURATION)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * some PHY configuration described in
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * SAS IO Unit Page1
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *readpage1 = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinastatic int
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_sasiou_page_1_cb(mptsas_t *mpt, caddr_t page_memp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China va_list ap)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#ifndef __lock_lint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China#endif
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int i, num_phys;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada uint32_t cpdi[MPTSAS_MAX_PHYS];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t port_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_io_unit_page1 "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus, iocloginfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(accessp, &sasioupage1->NumPhys);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada /*
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada * ASSERT that the num_phys value in SAS IO Unit Page 1 is the same as
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada * was initially set. This should never change throughout the life of
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada * the driver.
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada */
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada ASSERT(num_phys == mpt->m_num_phys);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(accessp, &sasioupage1->PhyData[i].
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].PortFlags);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].Port);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Read IO unit page 0 to get information for each PHY. If needed, Read IO Unit
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * page1 to update the PHY information. This is the message passing method of
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * this function which should be called except during initialization.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_sas_io_unit_page(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS, state;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t readpage1 = 0, retrypage0 = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 0 and set phy information
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * 2. See if Read IO unit page1 is needed because of port configuration
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * 3. Read IO unit page 1 and update phy information.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (state == IOUC_READ_PAGE0) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_0_cb, &readpage1,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &retrypage0);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else if (state == IOUC_READ_PAGE1) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 1, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_sasiou_page_1_cb);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (rval == DDI_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China switch (state) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * retry 30 times if discovery is in process
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (retrypage0 && (retrypage0 < 30)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000 * 100);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else if (retrypage0 == 30) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "!Discovery in progress, can't "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "after 30 times retry, give "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "up!");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (readpage1 == 0) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Dustatic int
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Dumptsas_biospage_3_cb(mptsas_t *mpt, caddr_t page_memp,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du va_list ap)
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du{
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du#ifndef __lock_lint
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du _NOTE(ARGUNUSED(ap))
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du#endif
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du pMpi2BiosPage3_t sasbiospage;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du int rval = DDI_SUCCESS;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du uint32_t *bios_version;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du mptsas_log(mpt, CE_WARN, "mptsas_get_bios_page3 header: "
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus, iocloginfo);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du rval = DDI_FAILURE;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du return (rval);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du }
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du bios_version = va_arg(ap, uint32_t *);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du sasbiospage = (pMpi2BiosPage3_t)page_memp;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du *bios_version = ddi_get32(accessp, &sasbiospage->BiosVersion);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du return (rval);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du}
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du/*
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du * Request MPI configuration page BIOS page 3 to get BIOS version. Since all
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du * other information in this page is not needed, just ignore it.
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du */
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Duint
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Dumptsas_get_bios_page3(mptsas_t *mpt, uint32_t *bios_version)
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du{
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du int rval = DDI_SUCCESS;
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du ASSERT(mutex_owned(&mpt->m_mutex));
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du /*
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du * Get the header and config page. reply contains the reply frame,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du * which holds status info for the request.
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du */
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du rval = mptsas_access_config_page(mpt,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du MPI2_CONFIG_ACTION_PAGE_READ_CURRENT, MPI2_CONFIG_PAGETYPE_BIOS, 3,
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du 0, mptsas_biospage_3_cb, bios_version);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du return (rval);
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du}
08eb0b82bd557d699e65f7cade6f1cc740ccbadeYong-Feng Du
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Read IO unit page 0 to get information for each PHY. If needed, Read IO Unit
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * page1 to update the PHY information. This is the handshaking version of
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * this function, which should be called during initialization only.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_sas_io_unit_page_hndshk(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada ddi_dma_cookie_t page_cookie;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage0_t sasioupage0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2SasIOUnitPage1_t sasioupage1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int recv_numbytes;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada int i, num_phys, start_phy = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int page0_size =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_0) +
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada (sizeof (MPI2_SAS_IO_UNIT0_PHY_DATA) * (MPTSAS_MAX_PHYS - 1));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int page1_size =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sizeof (MPI2_CONFIG_PAGE_SASIOUNIT_1) +
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada (sizeof (MPI2_SAS_IO_UNIT1_PHY_DATA) * (MPTSAS_MAX_PHYS - 1));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t flags_length;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada uint32_t cpdi[MPTSAS_MAX_PHYS];
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada uint32_t readpage1 = 0, retrypage0 = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint16_t iocstatus;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint8_t port_flags, page_number, action;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t reply_size = 256; /* Big enough for any page */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint_t state;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_FAILURE;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald boolean_t free_recv = B_FALSE, free_page = B_FALSE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Initialize our "state machine". This is a bit convoluted,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * but it keeps us from having to do the ddi allocations numerous
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * times.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG20(("mptsas_get_sas_io_unit_page_hndshk enter"));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * that describes mpt's config reply page request structure.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, recv_dma_attrs,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &recv_dma_handle, &recv_accessp, &recv_memp,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada (sizeof (MPI2_CONFIG_REPLY)), NULL) == FALSE) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_log(mpt, CE_WARN,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada "mptsas_get_sas_io_unit_page_hndshk: recv dma failed");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Now safe to call mptsas_dma_addr_destroy(recv_dma_handle). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_recv = B_TRUE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = reply_size;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, page_dma_attrs,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &page_dma_handle, &page_accessp, &page_memp,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada reply_size, &page_cookie) == FALSE) {
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada mptsas_log(mpt, CE_WARN,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada "mptsas_get_sas_io_unit_page_hndshk: page dma failed");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Now safe to call mptsas_dma_addr_destroy(page_dma_handle). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_page = B_TRUE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Now we cycle through the state machine. Here's what happens:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * 1. Read IO unit page 0 and set phy information
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * 2. See if Read IO unit page1 is needed because of port configuration
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * 3. Read IO unit page 1 and update phy information.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sasioupage0 = (pMpi2SasIOUnitPage0_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China sasioupage1 = (pMpi2SasIOUnitPage1_t)page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China while (state != IOUC_DONE) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China switch (state) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_number = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page0_size;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)(
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) <<
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_number = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China action = MPI2_CONFIG_ACTION_PAGE_READ_CURRENT;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flags_length = (uint32_t)page1_size;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flags_length |= ((uint32_t)(
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_LAST_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SYSTEM_ADDRESS |
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) <<
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China default:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_HEADER,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China 0, page_number, 0, 0, 0, 0)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "mptsas_get_sas_io_unit_page_hndshk: read page "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "header iocstatus = 0x%x", iocstatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (action != MPI2_CONFIG_ACTION_PAGE_WRITE_NVRAM) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(page_memp, reply_size);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_send_extended_config_request_msg(mpt, action,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_IO_UNIT, 0, page_number,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get16(recv_accessp, &configreply->ExtPageLength),
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles flags_length, page_cookie.dmac_laddress)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China iocstatus = MPTSAS_IOCSTATUS(iocstatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus != MPI2_IOCSTATUS_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "mptsas_get_sas_io_unit_page_hndshk: IO unit "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "config failed for action %d, iocstatus = 0x%x",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China action, iocstatus);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China switch (state) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE0:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->NumPhys);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada ASSERT(num_phys == mpt->m_num_phys);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada if (num_phys > MPTSAS_MAX_PHYS) {
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada mptsas_log(mpt, CE_WARN, "Number of phys "
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada "supported by HBA (%d) is more than max "
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada "supported by driver (%d). Driver will "
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada "not attach.", num_phys,
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada MPTSAS_MAX_PHYS);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada rval = DDI_FAILURE;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada goto cleanup;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada }
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada for (i = start_phy; i < num_phys; i++, start_phy = i) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].PortFlags);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage0->PhyData[i].Port);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].ctrl_devhdl =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get16(page_accessp, &sasioupage0->
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PhyData[i].ControllerDevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].attached_devhdl =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get16(page_accessp, &sasioupage0->
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China PhyData[i].AttachedDevHandle);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (port_flags & DISCOVERY_IN_PROGRESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China retrypage0++;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG20(("Discovery in progress, can't "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then NO.%d"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " times retry", retrypage0));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China retrypage0 = 0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (!(port_flags & AUTO_PORT_CONFIGURATION)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * some PHY configuration described in
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * SAS IO Unit Page1
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China readpage1 = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * retry 30 times if discovery is in process
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (retrypage0 && (retrypage0 < 30)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China drv_usecwait(1000 * 100);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE0;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China } else if (retrypage0 == 30) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "!Discovery in progress, can't "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "verify IO unit config, then after"
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China " 30 times retry, give up!");
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (readpage1 == 0) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_READ_PAGE1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China case IOUC_READ_PAGE1:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((ddi_dma_sync(page_dma_handle, 0, 0,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China DDI_DMA_SYNC_FORCPU)) != DDI_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China num_phys = ddi_get8(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage1->NumPhys);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada ASSERT(num_phys == mpt->m_num_phys);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada if (num_phys > MPTSAS_MAX_PHYS) {
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada mptsas_log(mpt, CE_WARN, "Number of phys "
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada "supported by HBA (%d) is more than max "
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada "supported by driver (%d). Driver will "
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada "not attach.", num_phys,
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada MPTSAS_MAX_PHYS);
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada rval = DDI_FAILURE;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada goto cleanup;
cdc7c7fe7b52f0c955073224bbd5fd2002db45d0Ada }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China for (i = 0; i < num_phys; i++) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China cpdi[i] = ddi_get32(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ControllerPhyDeviceInfo);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China port_flags = ddi_get8(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].PortFlags);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_num =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(page_accessp,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China &sasioupage1->PhyData[i].Port);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].port_flags = port_flags;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_phy_info[i].phy_device_type = cpdi[i];
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China state = IOUC_DONE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China break;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) ||
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto cleanup;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinacleanup:
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_recv)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&recv_dma_handle, &recv_accessp);
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_page)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&page_dma_handle, &page_accessp);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (rval != DDI_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_fm_ereport(mpt, DDI_FM_DEVICE_NO_RESPONSE);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_LOST);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China/*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * mptsas_get_manufacture_page5
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China *
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * This function will retrieve the base WWID from the adapter. Since this
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * function is only called during the initialization process, use handshaking.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinaint
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinamptsas_get_manufacture_page5(mptsas_t *mpt)
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China{
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada ddi_dma_cookie_t page_cookie;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int recv_numbytes;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China pMpi2ManufacturingPage5_t m5;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint32_t flagslength;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China uint_t iocstatus;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald boolean_t free_recv = B_FALSE, free_page = B_FALSE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPTSAS_DISABLE_INTR(mpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt, MPI2_CONFIG_ACTION_PAGE_HEADER,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5, 0, 0, 0, 0)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * that describes the MPT's config reply page request structure.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, recv_dma_attrs,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &recv_dma_handle, &recv_accessp, &recv_memp,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada (sizeof (MPI2_CONFIG_REPLY)), NULL) == FALSE) {
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Now safe to call mptsas_dma_addr_destroy(recv_dma_handle). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_recv = B_TRUE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * get config reply message
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * that describes the MPT's config page structure.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_PAGE_MAN_5));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, page_dma_attrs, &page_dma_handle,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &page_accessp, &page_memp, (sizeof (MPI2_CONFIG_PAGE_MAN_5)),
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &page_cookie) == FALSE) {
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Now safe to call mptsas_dma_addr_destroy(page_dma_handle). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_page = B_TRUE;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China bzero(page_memp, sizeof (MPI2_CONFIG_PAGE_MAN_5));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China m5 = (pMpi2ManufacturingPage5_t)page_memp;
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles NDBG20(("mptsas_get_manufacture_page5: paddr 0x%p",
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles (void *)(uintptr_t)page_cookie.dmac_laddress));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Give reply address to IOC to store config page in and send
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * config request out.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_5);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 5,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion),
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageLength),
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles flagslength, page_cookie.dmac_laddress)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * get reply view handshake
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China recv_accessp)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 config: "
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (void) ddi_dma_sync(page_dma_handle, 0, 0, DDI_DMA_SYNC_FORCPU);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Fusion-MPT stores fields in little-endian format. This is
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * why the low-order 32 bits are stored first.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->un.sasaddr.m_base_wwid_lo =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get32(page_accessp, (uint32_t *)(void *)&m5->Phy[0].WWID);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->un.sasaddr.m_base_wwid_hi =
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_get32(page_accessp, (uint32_t *)(void *)&m5->Phy[0].WWID + 1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ddi_prop_update_int64(DDI_DEV_T_NONE, mpt->m_dip,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "base-wwid", mpt->un.m_base_wwid) != DDI_PROP_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG2(("%s%d: failed to create base-wwid property",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * Set the number of PHYs present.
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_num_phys = ddi_get8(page_accessp, (uint8_t *)&m5->NumPhys);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if (ddi_prop_update_int(DDI_DEV_T_NONE, mpt->m_dip,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China "num-phys", mpt->m_num_phys) != DDI_PROP_SUCCESS) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China NDBG2(("%s%d: failed to create num-phys property",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_driver_name(mpt->m_dip), ddi_get_instance(mpt->m_dip)));
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mptsas_log(mpt, CE_NOTE, "!mpt%d: Initiator WWNs: 0x%016llx-0x%016llx",
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China mpt->m_instance, (unsigned long long)mpt->un.m_base_wwid,
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (unsigned long long)mpt->un.m_base_wwid + mpt->m_num_phys - 1);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) ||
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinadone:
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * free up memory
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_recv)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&recv_dma_handle, &recv_accessp);
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_page)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&page_dma_handle, &page_accessp);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPTSAS_ENABLE_INTR(mpt);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinastatic int
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_sasphypage_0_cb(mptsas_t *mpt, caddr_t page_memp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China va_list ap)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#ifndef __lock_lint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#endif
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pMpi2SasPhyPage0_t sasphypage;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint16_t *owner_devhdl, *attached_devhdl;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t *attached_phy_identify;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t *attached_phy_info;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t *programmed_link_rate;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t *hw_link_rate;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t *change_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t *phy_info;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t *negotiated_link_rate;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t page_address;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page0 "
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China iocstatus, iocloginfo);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * signal that device traversal is complete.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) ==
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China owner_devhdl = va_arg(ap, uint16_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China attached_devhdl = va_arg(ap, uint16_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China attached_phy_identify = va_arg(ap, uint8_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China attached_phy_info = va_arg(ap, uint32_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China programmed_link_rate = va_arg(ap, uint8_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China hw_link_rate = va_arg(ap, uint8_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China change_count = va_arg(ap, uint8_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phy_info = va_arg(ap, uint32_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China negotiated_link_rate = va_arg(ap, uint8_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China sasphypage = (pMpi2SasPhyPage0_t)page_memp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *owner_devhdl =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get16(accessp, &sasphypage->OwnerDevHandle);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *attached_devhdl =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get16(accessp, &sasphypage->AttachedDevHandle);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *attached_phy_identify =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->AttachedPhyIdentifier);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *attached_phy_info =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->AttachedPhyInfo);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *programmed_link_rate =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->ProgrammedLinkRate);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *hw_link_rate =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->HwLinkRate);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *change_count =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->ChangeCount);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *phy_info =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->PhyInfo);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *negotiated_link_rate =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(accessp, &sasphypage->NegotiatedLinkRate);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Request MPI configuration page SAS phy page 0 to get DevHandle, phymask
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * and SAS address.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinaint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_get_sas_phy_page0(mptsas_t *mpt, uint32_t page_address,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China smhba_info_t *info)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * which holds status info for the request.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PHY, 0, page_address,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_sasphypage_0_cb, page_address, &info->owner_devhdl,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->attached_devhdl, &info->attached_phy_identify,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->attached_phy_info, &info->programmed_link_rate,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->hw_link_rate, &info->change_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->phy_info, &info->negotiated_link_rate);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinastatic int
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_sasphypage_1_cb(mptsas_t *mpt, caddr_t page_memp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_acc_handle_t accessp, uint16_t iocstatus, uint32_t iocloginfo,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China va_list ap)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#ifndef __lock_lint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China _NOTE(ARGUNUSED(ap))
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China#endif
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pMpi2SasPhyPage1_t sasphypage;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t *invalid_dword_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t *running_disparity_error_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t *loss_of_dword_sync_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t *phy_reset_problem_count;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t page_address;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((iocstatus != MPI2_IOCSTATUS_SUCCESS) &&
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (iocstatus != MPI2_IOCSTATUS_CONFIG_INVALID_PAGE)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_sas_expander_page1 "
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "config: IOCStatus=0x%x, IOCLogInfo=0x%x",
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China iocstatus, iocloginfo);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_address = va_arg(ap, uint32_t);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * The INVALID_PAGE status is normal if using GET_NEXT_HANDLE and there
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * are no more pages. If everything is OK up to this point but the
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * status is INVALID_PAGE, change rval to FAILURE and quit. Also,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * signal that device traversal is complete.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (iocstatus == MPI2_IOCSTATUS_CONFIG_INVALID_PAGE) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((page_address & MPI2_SAS_EXPAND_PGAD_FORM_MASK) ==
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_SAS_EXPAND_PGAD_FORM_GET_NEXT_HNDL) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_done_traverse_smp = 1;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China invalid_dword_count = va_arg(ap, uint32_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China running_disparity_error_count = va_arg(ap, uint32_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China loss_of_dword_sync_count = va_arg(ap, uint32_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China phy_reset_problem_count = va_arg(ap, uint32_t *);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China sasphypage = (pMpi2SasPhyPage1_t)page_memp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *invalid_dword_count =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->InvalidDwordCount);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *running_disparity_error_count =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->RunningDisparityErrorCount);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *loss_of_dword_sync_count =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->LossDwordSynchCount);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *phy_reset_problem_count =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(accessp, &sasphypage->PhyResetProblemCount);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Request MPI configuration page SAS phy page 0 to get DevHandle, phymask
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * and SAS address.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinaint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_get_sas_phy_page1(mptsas_t *mpt, uint32_t page_address,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China smhba_info_t *info)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ASSERT(mutex_owned(&mpt->m_mutex));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Get the header and config page. reply contains the reply frame,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * which holds status info for the request.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = mptsas_access_config_page(mpt,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_EXTPAGETYPE_SAS_PHY, 1, page_address,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_sasphypage_1_cb, page_address,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->invalid_dword_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->running_disparity_error_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->loss_of_dword_sync_count,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China &info->phy_reset_problem_count);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China return (rval);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China}
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China/*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * mptsas_get_manufacture_page0
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China *
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * This function will retrieve the base
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Chip name, Board Name,Board Trace number from the adapter.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Since this function is only called during the
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * initialization process, use handshaking.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinaint
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing Chinamptsas_get_manufacture_page0(mptsas_t *mpt)
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China{
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_dma_attr_t recv_dma_attrs, page_dma_attrs;
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada ddi_dma_cookie_t page_cookie;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_dma_handle_t recv_dma_handle, page_dma_handle;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_acc_handle_t recv_accessp, page_accessp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pMpi2ConfigReply_t configreply;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China caddr_t recv_memp, page_memp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int recv_numbytes;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China pMpi2ManufacturingPage0_t m0;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint32_t flagslength;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China int rval = DDI_SUCCESS;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint_t iocstatus;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China uint8_t i = 0;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald boolean_t free_recv = B_FALSE, free_page = B_FALSE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPTSAS_DISABLE_INTR(mpt);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt, MPI2_CONFIG_ACTION_PAGE_HEADER,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 0, 0, 0, 0, 0)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * that describes the MPT's config reply page request structure.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China recv_dma_attrs = mpt->m_msg_dma_attr;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_sgllen = 1;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China recv_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_REPLY));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, recv_dma_attrs, &recv_dma_handle,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &recv_accessp, &recv_memp, (sizeof (MPI2_CONFIG_REPLY)),
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada NULL) == FALSE) {
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Now safe to call mptsas_dma_addr_destroy(recv_dma_handle). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_recv = B_TRUE;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China bzero(recv_memp, sizeof (MPI2_CONFIG_REPLY));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China configreply = (pMpi2ConfigReply_t)recv_memp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China recv_numbytes = sizeof (MPI2_CONFIG_REPLY);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * get config reply message
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China recv_accessp)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page5 update: "
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * dynamically create a customized dma attribute structure
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * that describes the MPT's config page structure.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_dma_attrs = mpt->m_msg_dma_attr;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_sgllen = 1;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China page_dma_attrs.dma_attr_granular = (sizeof (MPI2_CONFIG_PAGE_MAN_0));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada if (mptsas_dma_addr_create(mpt, page_dma_attrs, &page_dma_handle,
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &page_accessp, &page_memp, (sizeof (MPI2_CONFIG_PAGE_MAN_0)),
a9b510629bb89d580bb11ce66254ff44bf4959d1Ada &page_cookie) == FALSE) {
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald /* Now safe to call mptsas_dma_addr_destroy(page_dma_handle). */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald free_page = B_TRUE;
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China bzero(page_memp, sizeof (MPI2_CONFIG_PAGE_MAN_0));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China m0 = (pMpi2ManufacturingPage0_t)page_memp;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Give reply address to IOC to store config page in and send
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * config request out.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China flagslength = sizeof (MPI2_CONFIG_PAGE_MAN_0);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China flagslength |= ((uint32_t)(MPI2_SGE_FLAGS_LAST_ELEMENT |
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_BUFFER | MPI2_SGE_FLAGS_SIMPLE_ELEMENT |
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles MPI2_SGE_FLAGS_SYSTEM_ADDRESS | MPI2_SGE_FLAGS_64_BIT_ADDRESSING |
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_IOC_TO_HOST |
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_SGE_FLAGS_END_OF_LIST) << MPI2_SGE_FLAGS_SHIFT);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (mptsas_send_config_request_msg(mpt,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_ACTION_PAGE_READ_CURRENT,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China MPI2_CONFIG_PAGETYPE_MANUFACTURING, 0, 0,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageVersion),
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(recv_accessp, &configreply->Header.PageLength),
940efceed6b67909bbec473feca747d2fbaa32b9Andy Giles flagslength, page_cookie.dmac_laddress)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * get reply view handshake
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (mptsas_get_handshake_msg(mpt, recv_memp, recv_numbytes,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China recv_accessp)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China rval = DDI_FAILURE;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if (iocstatus = ddi_get16(recv_accessp, &configreply->IOCStatus)) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mptsas_log(mpt, CE_WARN, "mptsas_get_manufacture_page0 config: "
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China "IOCStatus=0x%x, IOCLogInfo=0x%x", iocstatus,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get32(recv_accessp, &configreply->IOCLogInfo));
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China goto done;
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (void) ddi_dma_sync(page_dma_handle, 0, 0, DDI_DMA_SYNC_FORCPU);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China /*
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * Fusion-MPT stores fields in little-endian format. This is
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China * why the low-order 32 bits are stored first.
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China */
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.ChipName[i] =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->ChipName[i]);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < 8; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.ChipRevision[i] =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->ChipRevision[i]);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.BoardName[i] =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->BoardName[i]);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.BoardAssembly[i] =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->BoardAssembly[i]);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China for (i = 0; i < 16; i++) {
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China mpt->m_MANU_page0.BoardTracerNumber[i] =
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China ddi_get8(page_accessp,
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China (uint8_t *)(void *)&m0->BoardTracerNumber[i]);
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China }
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China
f2e8686e6101ad6ab3df43205537e610151b5434xun ni - Sun Microsystems - Beijing China if ((mptsas_check_dma_handle(recv_dma_handle) != DDI_SUCCESS) ||
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mptsas_check_dma_handle(page_dma_handle) != DDI_SUCCESS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China goto done;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China if ((mptsas_check_acc_handle(recv_accessp) != DDI_SUCCESS) ||
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China (mptsas_check_acc_handle(page_accessp) != DDI_SUCCESS)) {
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China ddi_fm_service_impact(mpt->m_dip, DDI_SERVICE_UNAFFECTED);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China rval = DDI_FAILURE;
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China }
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing Chinadone:
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China /*
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China * free up memory
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China */
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_recv)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&recv_dma_handle, &recv_accessp);
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald if (free_page)
f7d0d869a9ae78d8244009efb4980a1f057bc8f8Dan McDonald mptsas_dma_addr_destroy(&page_dma_handle, &page_accessp);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China MPTSAS_ENABLE_INTR(mpt);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China return (rval);
5b5046010dc014958659914f953b1197da4054acjiang wu - Sun Microsystems - Beijing China}