dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mr_sas.c: source for mr_sas driver
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Solaris MegaRAID device driver for SAS2.0 controllers
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Copyright (c) 2008-2012, LSI Logic Corporation.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * All rights reserved.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Version:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Author:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Swaminathan K S
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Arun Chandrashekhar
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Manju R
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Rasheed
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Shakeel Bukhari
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Redistribution and use in source and binary forms, with or without
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * modification, are permitted provided that the following conditions are met:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 1. Redistributions of source code must retain the above copyright notice,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * this list of conditions and the following disclaimer.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 2. Redistributions in binary form must reproduce the above copyright notice,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * this list of conditions and the following disclaimer in the documentation
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * and/or other materials provided with the distribution.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 3. Neither the name of the author nor the names of its contributors may be
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * used to endorse or promote products derived from this software without
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * specific prior written permission.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * DAMAGE.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
89b43686db1fe9681d80a7cf5662730cb9378caeBayard Bell * Copyright (c) 2011 Bayard G. Bell. All rights reserved.
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman * Copyright 2015 Citrus IT Limited. All rights reserved.
a1ed883a3c2acc53bbb9a171ef07aeb8eaf78736Garrett D'Amore * Copyright 2015 Garrett D'Amore <garrett@damore.org>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/types.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/param.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/file.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/errno.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/open.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/cred.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/modctl.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/conf.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/devops.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/cmn_err.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/kmem.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/stat.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/mkdev.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/pci.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/scsi/scsi.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/ddi.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/sunddi.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/atomic.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/signal.h>
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China#include <sys/byteorder.h>
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele#include <sys/sdt.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/fs/dv_node.h> /* devfs_clean */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include "mr_sas.h"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * FMA header files
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/ddifm.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/fm/protocol.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/fm/util.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#include <sys/fm/io/ddi.h>
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald/* Macros to help Skinny and stock 2108/MFI live together. */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald#define WR_IB_PICK_QPORT(addr, instance) \
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if ((instance)->skinny) { \
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_LOW_QPORT((addr), (instance)); \
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_HIGH_QPORT(0, (instance)); \
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald } else { \
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_QPORT((addr), (instance)); \
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald }
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Local static data
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void *mrsas_state = NULL;
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing Chinastatic volatile boolean_t mrsas_relaxed_ordering = B_TRUE;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvolatile int debug_level_g = CL_NONE;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic volatile int msi_enable = 1;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing Chinastatic volatile int ctio_enable = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China/* Default Timeout value to issue online controller reset */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvolatile int debug_timeout_g = 0xF0; /* 0xB4; */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China/* Simulate consecutive firmware fault */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic volatile int debug_fw_faults_after_ocr_g = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China#ifdef OCRDEBUG
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China/* Simulate three consecutive timeout for an IO */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic volatile int debug_consecutive_timeout_after_ocr_g = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China#endif
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#pragma weak scsi_hba_open
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#pragma weak scsi_hba_close
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#pragma weak scsi_hba_ioctl
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/* Local static prototypes. */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_getinfo(dev_info_t *, ddi_info_cmd_t, void *, void **);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_attach(dev_info_t *, ddi_attach_cmd_t);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef __sparc
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_reset(dev_info_t *, ddi_reset_cmd_t);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_quiesce(dev_info_t *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_detach(dev_info_t *, ddi_detach_cmd_t);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_open(dev_t *, int, int, cred_t *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_close(dev_t, int, int, cred_t *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_tgt_init(dev_info_t *, dev_info_t *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald scsi_hba_tran_t *, struct scsi_device *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic struct scsi_pkt *mrsas_tran_init_pkt(struct scsi_address *, register
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct scsi_pkt *, struct buf *, int, int, int, int,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int (*)(), caddr_t);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_start(struct scsi_address *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald register struct scsi_pkt *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_abort(struct scsi_address *, struct scsi_pkt *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_reset(struct scsi_address *, int);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_getcap(struct scsi_address *, char *, int);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_setcap(struct scsi_address *, char *, int, int);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_tran_destroy_pkt(struct scsi_address *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct scsi_pkt *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_tran_dmafree(struct scsi_address *, struct scsi_pkt *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_tran_sync_pkt(struct scsi_address *, struct scsi_pkt *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_quiesce(dev_info_t *dip);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_unquiesce(dev_info_t *dip);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic uint_t mrsas_isr();
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic uint_t mrsas_softintr();
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_undo_resources(dev_info_t *, struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void free_space_for_mfi(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic uint32_t read_fw_status_reg_ppc(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void issue_cmd_ppc(struct mrsas_cmd *, struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int issue_cmd_in_poll_mode_ppc(struct mrsas_instance *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int issue_cmd_in_sync_mode_ppc(struct mrsas_instance *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void enable_intr_ppc(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void disable_intr_ppc(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int intr_ack_ppc(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void flush_cache(struct mrsas_instance *instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid display_scsi_inquiry(caddr_t);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int start_mfi_aen(struct mrsas_instance *instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int handle_drv_ioctl(struct mrsas_instance *instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_ioctl *ioctl, int mode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int handle_mfi_ioctl(struct mrsas_instance *instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_ioctl *ioctl, int mode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int handle_mfi_aen(struct mrsas_instance *instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_aen *aen);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic struct mrsas_cmd *build_cmd(struct mrsas_instance *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct scsi_address *, struct scsi_pkt *, uchar_t *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int alloc_additional_dma_buffer(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void complete_cmd_in_sync_mode(struct mrsas_instance *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_kill_adapter(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_issue_init_mfi(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_reset_ppc(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic uint32_t mrsas_initiate_ocr_if_fw_is_faulty(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int wait_for_outstanding(struct mrsas_instance *instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int register_mfi_aen(struct mrsas_instance *instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t seq_num, uint32_t class_locale_word);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int issue_mfi_pthru(struct mrsas_instance *instance, struct
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int issue_mfi_dcmd(struct mrsas_instance *instance, struct
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int issue_mfi_smp(struct mrsas_instance *instance, struct
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int issue_mfi_stp(struct mrsas_instance *instance, struct
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_ioctl *ioctl, struct mrsas_cmd *cmd, int mode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int abort_aen_cmd(struct mrsas_instance *instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd *cmd_to_abort);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_rem_intrs(struct mrsas_instance *instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_add_intrs(struct mrsas_instance *instance, int intr_type);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_tran_tgt_free(dev_info_t *, dev_info_t *,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald scsi_hba_tran_t *, struct scsi_device *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_tran_bus_config(dev_info_t *, uint_t,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_bus_config_op_t, void *, dev_info_t **);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_parse_devname(char *, int *, int *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_config_all_devices(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_config_ld(struct mrsas_instance *, uint16_t,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint8_t, dev_info_t **);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int mrsas_name_node(dev_info_t *, char *, int);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_issue_evt_taskq(struct mrsas_eventinfo *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void free_additional_dma_buffer(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void io_timeout_checker(void *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_fm_init(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void mrsas_fm_fini(struct mrsas_instance *);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic struct mrsas_function_template mrsas_function_template_ppc = {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .read_fw_status_reg = read_fw_status_reg_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .issue_cmd = issue_cmd_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .issue_cmd_in_sync_mode = issue_cmd_in_sync_mode_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .issue_cmd_in_poll_mode = issue_cmd_in_poll_mode_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .enable_intr = enable_intr_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .disable_intr = disable_intr_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .intr_ack = intr_ack_ppc,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .init_adapter = mrsas_init_adapter_ppc
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald};
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic struct mrsas_function_template mrsas_function_template_fusion = {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .read_fw_status_reg = tbolt_read_fw_status_reg,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .issue_cmd = tbolt_issue_cmd,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .issue_cmd_in_sync_mode = tbolt_issue_cmd_in_sync_mode,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .issue_cmd_in_poll_mode = tbolt_issue_cmd_in_poll_mode,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .enable_intr = tbolt_enable_intr,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .disable_intr = tbolt_disable_intr,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .intr_ack = tbolt_intr_ack,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald .init_adapter = mrsas_init_adapter_tbolt
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald};
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldddi_dma_attr_t mrsas_generic_dma_attr = {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DMA_ATTR_V0, /* dma_attr_version */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, /* low DMA address range */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0xFFFFFFFFU, /* high DMA address range */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 0xFFFFFFFFU, /* DMA counter register */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 8, /* DMA address alignment */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0x07, /* DMA burstsizes */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, /* min DMA size */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0xFFFFFFFFU, /* max DMA size */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0xFFFFFFFFU, /* segment boundary */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MRSAS_MAX_SGE_CNT, /* dma_attr_sglen */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 512, /* granularity of device */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0 /* bus specific DMA flags */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleint32_t mrsas_max_cap_maxxfer = 0x1000000;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Fix for: Thunderbolt controller IO timeout when IO write size is 1MEG,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Limit size to 256K
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonalduint32_t mrsas_tbolt_max_cap_maxxfer = (512 * 512);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * cb_ops contains base level routines
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct cb_ops mrsas_cb_ops = {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_open, /* open */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_close, /* close */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* strategy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* print */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* dump */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* read */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* write */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_ioctl, /* ioctl */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* devmap */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* mmap */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* segmap */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nochpoll, /* poll */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* cb_prop_op */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, /* streamtab */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele D_NEW | D_HOTPLUG, /* cb_flag */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele CB_REV, /* cb_rev */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev, /* cb_aread */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nodev /* cb_awrite */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * dev_ops contains configuration routines
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct dev_ops mrsas_ops = {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DEVO_REV, /* rev, */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, /* refcnt */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_getinfo, /* getinfo */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nulldev, /* identify */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele nulldev, /* probe */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_attach, /* attach */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_detach, /* detach */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef __sparc
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_reset, /* reset */
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China#else /* __sparc */
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China nodev,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif /* __sparc */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &mrsas_cb_ops, /* char/block ops */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele NULL, /* bus ops */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele NULL, /* power */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef __sparc
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China ddi_quiesce_not_needed
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China#else /* __sparc */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_quiesce /* quiesce */
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China#endif /* __sparc */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct modldrv modldrv = {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &mod_driverops, /* module type - driver */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MRSAS_VERSION,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &mrsas_ops, /* driver ops */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct modlinkage modlinkage = {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MODREV_1, /* ml_rev - must be MODREV_1 */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &modldrv, /* ml_linkage */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele NULL /* end of driver linkage */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct ddi_device_acc_attr endian_attr = {
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson DDI_DEVICE_ATTR_V1,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_STRUCTURE_LE_ACC,
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson DDI_STRICTORDER_ACC,
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson DDI_DEFAULT_ACC
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/* Use the LSI Fast Path for the 2208 (tbolt) commands. */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldunsigned int enable_fp = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * common entry points - for loadable kernel modules *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * _init - initialize a loadable module
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @void
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The driver should perform any one-time resource allocation or data
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * initialization during driver loading in _init(). For example, the driver
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * should initialize any mutexes global to the driver in this routine.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The driver should not, however, use _init() to allocate or initialize
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * anything that has to do with a particular instance of the device.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Per-instance initialization must be done in attach().
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele_init(void)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = ddi_soft_state_init(&mrsas_state,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_instance), 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ret != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmn_err(CE_WARN, "mr_sas: could not init state");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ret = scsi_hba_init(&modlinkage)) != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmn_err(CE_WARN, "mr_sas: could not init scsi hba");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_soft_state_fini(&mrsas_state);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = mod_install(&modlinkage);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ret != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmn_err(CE_WARN, "mr_sas: mod_install failed");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_fini(&modlinkage);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_soft_state_fini(&mrsas_state);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * _info - returns information about a loadable module.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @void
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * _info() is called to return module information. This is a typical entry
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * point that does predefined role. It simply calls mod_info().
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele_info(struct modinfo *modinfop)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (mod_info(&modlinkage, modinfop));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * _fini - prepare a loadable module for unloading
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @void
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * In _fini(), the driver should release any resources that were allocated in
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * _init(). The driver must remove itself from the system module list.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele_fini(void)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((ret = mod_remove(&modlinkage)) != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_WARN, "_fini: mod_remove() failed, error 0x%X", ret));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_fini(&modlinkage);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "_fini: scsi_hba_fini() done."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_soft_state_fini(&mrsas_state);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "_fini: ddi_soft_state_fini() done."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * common entry points - for autoconfiguration *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * attach - adds a device to the system as part of initialization
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dip:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cmd:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The kernel calls a driver's attach() entry point to attach an instance of
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * a device (for MegaRAID, it is instance of a controller) or to resume
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * operation for an instance of a device that has been suspended or has been
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * shut down by the power management framework
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The attach() entry point typically includes the following types of
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * processing:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - allocate a soft-state structure for the device instance (for MegaRAID,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * controller instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - initialize per-instance mutexes
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - initialize condition variables
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - register the device's interrupts (for MegaRAID, controller's interrupts)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - map the registers and memory of the device instance (for MegaRAID,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * controller instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - create minor device nodes for the device instance (for MegaRAID,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * controller instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - report that the device instance (for MegaRAID, controller instance) has
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * attached
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int instance_no;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int nregs;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int i = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint8_t irq;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t vendor_id;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t device_id;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t subsysvid;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t subsysid;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t command;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele off_t reglength = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int intr_types = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *data;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_tran_t *tran;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_dma_attr_t tran_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* CONSTCOND */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ASSERT(NO_COMPETING_THREADS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance_no = ddi_get_instance(dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * check to see whether this device is in a DMA-capable slot.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_slaveonly(dip) == DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "Device in slave-only slot, unused");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (cmd) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case DDI_ATTACH:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* allocate the soft state for the instance */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_soft_state_zalloc(mrsas_state, instance_no)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "Failed to allocate soft state");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance = (struct mrsas_instance *)ddi_get_soft_state
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (mrsas_state, instance_no);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance == NULL) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "Bad soft state");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_soft_state_free(mrsas_state, instance_no);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.softs = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Setup the PCI configuration space handles */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (pci_config_setup(dip, &instance->pci_handle) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "pci config setup failed");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_soft_state_free(mrsas_state, instance_no);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_dev_nregs(dip, &nregs) != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "Failed to get registers");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pci_config_teardown(&instance->pci_handle);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_soft_state_free(mrsas_state, instance_no);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald vendor_id = pci_config_get16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_VENID);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald device_id = pci_config_get16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_DEVID);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald subsysvid = pci_config_get16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_SUBVENID);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald subsysid = pci_config_get16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_SUBSYSID);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pci_config_put16(instance->pci_handle, PCI_CONF_COMM,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (pci_config_get16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_COMM) | PCI_COMM_ME));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald irq = pci_config_get8(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_ILINE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_CONT,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "?0x%x:0x%x 0x%x:0x%x, irq:%d drv-ver:%s\n",
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman vendor_id, device_id, subsysvid,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman subsysid, irq, MRSAS_VERSION);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* enable bus-mastering */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald command = pci_config_get16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_COMM);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (!(command & PCI_COMM_ME)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald command |= PCI_COMM_ME;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pci_config_put16(instance->pci_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PCI_CONF_COMM, command);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "mr_sas%d: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "enable bus-mastering", instance_no));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_CONT, "mr_sas%d: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "bus-mastering already set", instance_no));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* initialize function pointers */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald switch (device_id) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case PCI_DEVICE_ID_LSI_TBOLT:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case PCI_DEVICE_ID_LSI_INVADER:
a1ed883a3c2acc53bbb9a171ef07aeb8eaf78736Garrett D'Amore case PCI_DEVICE_ID_LSI_FURY:
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_CONT, "?TBOLT device detected\n");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &mrsas_function_template_fusion;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->tbolt = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald case PCI_DEVICE_ID_LSI_SKINNY:
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald case PCI_DEVICE_ID_LSI_SKINNY_NEW:
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /*
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * FALLTHRU to PPC-style functions, but mark this
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * instance as Skinny, because the register set is
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * slightly different (See WR_IB_PICK_QPORT), and
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * certain other features are available to a Skinny
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * HBA.
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald instance->skinny = 1;
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* FALLTHRU */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case PCI_DEVICE_ID_LSI_2108VDE:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case PCI_DEVICE_ID_LSI_2108V:
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_CONT,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "?2108 Liberator device detected\n");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &mrsas_function_template_ppc;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald default:
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "Invalid device detected");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pci_config_teardown(&instance->pci_handle);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_soft_state_free(mrsas_state, instance_no);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->baseaddress = pci_config_get32(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->pci_handle, PCI_CONF_BASE0);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->baseaddress &= 0x0fffc;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->dip = dip;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->vendor_id = vendor_id;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->device_id = device_id;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->subsysvid = subsysvid;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->subsysid = subsysid;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->instance = instance_no;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Initialize FMA */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->fm_capabilities = ddi_prop_get_int(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_DEV_T_ANY, instance->dip, DDI_PROP_DONTPASS,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "fm-capable", DDI_FM_EREPORT_CAPABLE |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_FM_ACCCHK_CAPABLE | DDI_FM_DMACHK_CAPABLE
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald | DDI_FM_ERRCB_CAPABLE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_fm_init(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Setup register map */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((ddi_dev_regsize(instance->dip,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald REGISTER_SET_IO_2108, &reglength) != DDI_SUCCESS) ||
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald reglength < MINIMUM_MFI_MEM_SZ) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (reglength > DEFAULT_MFI_MEM_SZ) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald reglength = DEFAULT_MFI_MEM_SZ;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mr_sas: register length to map is 0x%lx bytes",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald reglength));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_regs_map_setup(instance->dip,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald REGISTER_SET_IO_2108, &instance->regmap, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald reglength, &endian_attr, &instance->regmap_handle)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "couldn't map control registers");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.regs = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Disable Interrupt Now.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Setup Software interrupt
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr->disable_intr(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas-enable-msi", &data) == DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (strncmp(data, "no", 3) == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald msi_enable = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "msi_enable = %d disabled", msi_enable));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_prop_free(data);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_CONT, "?msi_enable = %d\n", msi_enable);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas-enable-fp", &data) == DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (strncmp(data, "no", 3) == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald enable_fp = 0;
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "enable_fp = %d, Fast-Path disabled.\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald enable_fp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_prop_free(data);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_CONT, "?enable_fp = %d\n", enable_fp);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Check for all supported interrupt types */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_intr_get_supported_types(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald dip, &intr_types) != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "ddi_intr_get_supported_types() failed");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "ddi_intr_get_supported_types() ret: 0x%x", intr_types));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Initialize and Setup Interrupt handler */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (msi_enable && (intr_types & DDI_INTR_TYPE_MSIX)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_add_intrs(instance, DDI_INTR_TYPE_MSIX) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "MSIX interrupt query failed");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_type = DDI_INTR_TYPE_MSIX;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else if (msi_enable && (intr_types & DDI_INTR_TYPE_MSI)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_add_intrs(instance, DDI_INTR_TYPE_MSI) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "MSI interrupt query failed");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_type = DDI_INTR_TYPE_MSI;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else if (intr_types & DDI_INTR_TYPE_FIXED) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald msi_enable = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_add_intrs(instance, DDI_INTR_TYPE_FIXED) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "FIXED interrupt query failed");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto fail_attach;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_type = DDI_INTR_TYPE_FIXED;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "Device cannot "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "suppport either FIXED or MSI/X "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "interrupts");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.intr = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas-enable-ctio", &data) == DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (strncmp(data, "no", 3) == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ctio_enable = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "ctio_enable = %d disabled", ctio_enable));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_prop_free(data);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_CONT, "?ctio_enable = %d\n", ctio_enable);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* setup the mfi based low level driver */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_init_adapter(instance) != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "could not initialize the low level driver");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Initialize all Mutex */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->completed_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->completed_pool_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->sync_map_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->app_cmd_pool_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->config_dev_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->cmd_pend_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->ocr_flags_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->int_cmd_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cv_init(&instance->int_cmd_cv, NULL, CV_DRIVER, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->cmd_pool_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->reg_write_mtx, NULL,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->cmd_app_pool_mtx, NULL,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_init(&instance->chip_mtx, NULL,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.mutexs = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->timeout_id = (timeout_id_t)-1;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Register our soft-isr for highlevel interrupts. */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->isr_level = instance->intr_pri;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (!(instance->tbolt)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->isr_level == HIGH_LEVEL_INTR) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_add_softintr(dip,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SOFTINT_HIGH,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &instance->soft_intr_id, NULL, NULL,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_softintr, (caddr_t)instance) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Software ISR did not register");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto fail_attach;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.soft_isr = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->softint_running = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Allocate a transport structure */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (tran == NULL) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "scsi_hba_tran_alloc failed");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->tran = tran;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.tran = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_hba_private = instance;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_tgt_init = mrsas_tran_tgt_init;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_tgt_probe = scsi_hba_probe;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_tgt_free = mrsas_tran_tgt_free;
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald tran->tran_init_pkt = mrsas_tran_init_pkt;
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->tbolt)
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald tran->tran_start = mrsas_tbolt_tran_start;
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald else
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald tran->tran_start = mrsas_tran_start;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_abort = mrsas_tran_abort;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_reset = mrsas_tran_reset;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_getcap = mrsas_tran_getcap;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_setcap = mrsas_tran_setcap;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_destroy_pkt = mrsas_tran_destroy_pkt;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_dmafree = mrsas_tran_dmafree;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_sync_pkt = mrsas_tran_sync_pkt;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_quiesce = mrsas_tran_quiesce;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_unquiesce = mrsas_tran_unquiesce;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran->tran_bus_config = mrsas_tran_bus_config;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_relaxed_ordering)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_generic_dma_attr.dma_attr_flags |=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_DMA_RELAXED_ORDERING;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran_dma_attr = mrsas_generic_dma_attr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tran_dma_attr.dma_attr_sgllen = instance->max_num_sge;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Attach this instance of the hba */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (scsi_hba_attach_setup(dip, &tran_dma_attr, tran, 0)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "scsi_hba_attach failed");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.tranSetup = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_CONT, "scsi_hba_attach_setup() done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* create devctl node for cfgadm command */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_create_minor_node(dip, "devctl",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald S_IFCHR, INST2DEVCTL(instance_no),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_NT_SCSI_NEXUS, 0) == DDI_FAILURE) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "failed to create devctl node.");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.devctl = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* create scsi node for cfgadm command */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_create_minor_node(dip, "scsi", S_IFCHR,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INST2SCSI(instance_no), DDI_NT_SCSI_ATTACHMENT_POINT, 0) ==
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_FAILURE) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "failed to create scsi node.");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.scsictl = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman (void) sprintf(instance->iocnode, "%d:lsirdctl", instance_no);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Create a node for applications
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * for issuing ioctl to the driver.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_create_minor_node(dip, instance->iocnode,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald S_IFCHR, INST2LSIRDCTL(instance_no), DDI_PSEUDO, 0) ==
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_FAILURE) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "failed to create ioctl node.");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.ioctl = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Create a taskq to handle dr events */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((instance->taskq = ddi_taskq_create(dip,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_dr_taskq", 1, TASKQ_DEFAULTPRI, 0)) == NULL) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "failed to create taskq.");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->taskq = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.taskq = 1;
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman con_log(CL_ANN1, (CE_CONT, "ddi_taskq_create() done."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* enable interrupt */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr->enable_intr(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* initiate AEN */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (start_mfi_aen(instance)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "failed to initiate AEN.");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.aenPend = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_CONT, "AEN started for instance %d.", instance_no));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Finally! We are on the air. */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_report_dev(dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* FMA handle checking. */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_check_acc_handle(instance->regmap_handle) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_check_acc_handle(instance->pci_handle) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_attach;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_ld_list =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_zalloc(MRDRV_MAX_LD * sizeof (struct mrsas_ld),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald KM_SLEEP);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.ldlist_buff = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_max = MRSAS_TBOLT_PD_TGT_MAX;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_zalloc(MRSAS_TBOLT_GET_PD_MAX(instance) *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (struct mrsas_tbolt_pd), KM_SLEEP);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ASSERT(instance->mr_tbolt_pd_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < instance->mr_tbolt_pd_max; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[i].lun_type =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_TBOLT_PD_LUN;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[i].dev_id =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t)i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.pdlist_buff = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case DDI_PM_RESUME:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "mr_sas: DDI_PM_RESUME"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case DDI_RESUME:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "mr_sas: DDI_RESUME"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald default:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_WARN, "mr_sas: invalid attach cmd=%x", cmd));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_NOTE, "mrsas_attach() return SUCCESS instance_num %d",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance_no));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelefail_attach:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_undo_resources(dip, instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_fm_fini(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_config_teardown(&instance->pci_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_soft_state_free(mrsas_state, instance_no);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * getinfo - gets device information
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dip:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cmd:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @arg:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @resultp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The system calls getinfo() to obtain configuration information that only
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the driver knows. The mapping of minor numbers to device instance is
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * entirely under the control of the driver. The system sometimes needs to ask
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the driver which device a particular dev_t represents.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Given the device number return the devinfo pointer from the scsi_device
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * structure.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd, void *arg, void **resultp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int mrsas_minor = getminor((dev_t)arg);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (cmd) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_INFO_DEVT2DEVINFO:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = (struct mrsas_instance *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get_soft_state(mrsas_state,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MINOR2INST(mrsas_minor));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *resultp = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *resultp = instance->dip;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_INFO_DEVT2INSTANCE:
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China *resultp = (void *)(intptr_t)
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (MINOR2INST(getminor((dev_t)arg)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *resultp = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * detach - detaches a device from the system
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dip: pointer to the device's dev_info structure
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cmd: type of detach
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * A driver's detach() entry point is called to detach an instance of a device
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * that is bound to the driver. The entry point is called with the instance of
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the device node to be detached and with DDI_DETACH, which is specified as
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the cmd argument to the entry point.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * This routine is called during driver unload. We free all the allocated
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * resources and call the corresponding LLD so that it can also release all
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * its resources.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int instance_no;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* CONSTCOND */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ASSERT(NO_COMPETING_THREADS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance_no = ddi_get_instance(dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = (struct mrsas_instance *)ddi_get_soft_state(mrsas_state,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance_no);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!instance) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "could not get instance in detach");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (cmd) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case DDI_DETACH:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_detach: DDI_DETACH"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->timeout_id != (timeout_id_t)-1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) untimeout(instance->timeout_id);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->timeout_id = (timeout_id_t)-1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.timer = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.tranSetup == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (scsi_hba_detach(dip) != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "failed to detach");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.tranSetup = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_CONT, "scsi_hba_dettach() done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald flush_cache(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_undo_resources(dip, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_fm_fini(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pci_config_teardown(&instance->pci_handle);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_soft_state_free(mrsas_state, instance_no);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case DDI_PM_SUSPEND:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_detach: DDI_PM_SUSPEND"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case DDI_SUSPEND:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_detach: DDI_SUSPEND"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald default:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "invalid detach command:0x%x", cmd));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_undo_resources(dev_info_t *dip, struct mrsas_instance *instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.ioctl == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_remove_minor_node(dip, instance->iocnode);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.ioctl = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.scsictl == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_remove_minor_node(dip, "scsi");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.scsictl = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.devctl == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_remove_minor_node(dip, "devctl");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.devctl = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.tranSetup == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (scsi_hba_detach(dip) != DDI_SUCCESS) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "failed to detach");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return; /* DDI_FAILURE */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.tranSetup = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "scsi_hba_dettach() done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.tran == 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_tran_free(instance->tran);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.tran = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "scsi_hba_tran_free() done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.syncCmd == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (abort_syncmap_cmd(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->map_update_cmd)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "mrsas_detach: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "failed to abort previous syncmap command");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.syncCmd = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "sync cmd aborted, done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.aenPend == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (abort_aen_cmd(instance, instance->aen_cmd))
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN, "mrsas_detach: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "failed to abort prevous AEN command");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.aenPend = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "aen cmd aborted, done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* This means the controller is fully initialized and running */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Shutdown should be a last command to controller. */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* shutdown_controller(); */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.timer == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->timeout_id != (timeout_id_t)-1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) untimeout(instance->timeout_id);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->timeout_id = (timeout_id_t)-1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.timer = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr->disable_intr(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.mutexs == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->cmd_pool_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->app_cmd_pool_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->cmd_pend_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->completed_pool_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->sync_map_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->int_cmd_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cv_destroy(&instance->int_cmd_cv);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->ocr_flags_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->reg_write_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->cmd_app_pool_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_destroy(&instance->chip_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.mutexs = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "Destroy mutex & cv, done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.soft_isr == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_remove_softintr(instance->soft_intr_id);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.soft_isr = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.intr == 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_rem_intrs(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.intr = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.taskq == 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->taskq) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_taskq_destroy(instance->taskq);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.taskq = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * free dma memory allocated for
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * cmds/frames/queues/driver version etc
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.verBuff == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_free_dma_obj(instance, instance->drv_ver_dma_obj);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.verBuff = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.pdlist_buff == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->mr_tbolt_pd_list != NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->mr_tbolt_pd_list,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_TBOLT_GET_PD_MAX(instance) *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (struct mrsas_tbolt_pd));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.pdlist_buff = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.ldlist_buff == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->mr_ld_list != NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->mr_ld_list, MRDRV_MAX_LD
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * sizeof (struct mrsas_ld));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_ld_list = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.ldlist_buff = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.alloc_space_mpi2 == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald free_space_for_mpi2(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.alloc_space_mpi2 = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.alloc_space_mfi == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald free_space_for_mfi(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.alloc_space_mfi = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->unroll.regs == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_regs_map_free(&instance->regmap_handle);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.regs = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "ddi_regs_map_free() done."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * common entry points - for character driver types *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * open - gets access to a device
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dev:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @openflags:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @otyp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @credp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Access to a device by one or more application programs is controlled
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * through the open() and close() entry points. The primary function of
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * open() is to verify that the open request is allowed.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_open(dev_t *dev, int openflags, int otyp, cred_t *credp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Check root permissions */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (drv_priv(credp) != 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: Non-root ioctl access denied!"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (EPERM);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Verify we are being opened as a character device */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (otyp != OTYP_CHR) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: ioctl node must be a char node"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (EINVAL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_get_soft_state(mrsas_state, MINOR2INST(getminor(*dev)))
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENXIO);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (scsi_hba_open) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = scsi_hba_open(dev, openflags, otyp, credp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * close - gives up access to a device
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dev:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @openflags:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @otyp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @credp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * close() should perform any cleanup necessary to finish using the minor
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * device, and prepare the device (and driver) to be opened again.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_close(dev_t dev, int openflags, int otyp, cred_t *credp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* no need for locks! */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (scsi_hba_close) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = scsi_hba_close(dev, openflags, otyp, credp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * ioctl - performs a range of I/O commands for character drivers
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dev:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cmd:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @arg:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @mode:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @credp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @rvalp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * ioctl() routine must make sure that user data is copied into or out of the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * kernel address space explicitly using copyin(), copyout(), ddi_copyin(),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * and ddi_copyout(), as appropriate.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * This is a wrapper routine to serialize access to the actual ioctl routine.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * ioctl() should return 0 on success, or the appropriate error number. The
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * driver may also set the value returned to the calling process through rvalp.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int *rvalp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_ioctl *ioctl;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_aen aen;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = ddi_get_soft_state(mrsas_state, MINOR2INST(getminor(dev)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* invalid minor number */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mr_sas: adapter not found."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENXIO);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ioctl = (struct mrsas_ioctl *)kmem_zalloc(sizeof (struct mrsas_ioctl),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele KM_SLEEP);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ASSERT(ioctl);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch ((uint_t)cmd) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MRSAS_IOCTL_FIRMWARE:
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ddi_copyin((void *)arg, ioctl,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China sizeof (struct mrsas_ioctl), mode)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_WARN, "mrsas_ioctl: "
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "ERROR IOCTL copyin"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China kmem_free(ioctl, sizeof (struct mrsas_ioctl));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (EFAULT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ioctl->control_code == MRSAS_DRIVER_IOCTL_COMMON) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = handle_drv_ioctl(instance, ioctl, mode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = handle_mfi_ioctl(instance, ioctl, mode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ddi_copyout((void *)ioctl, (void *)arg,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China (sizeof (struct mrsas_ioctl) - 1), mode)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_WARN,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "mrsas_ioctl: copy_to_user failed"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MRSAS_IOCTL_AEN:
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ddi_copyin((void *) arg, &aen,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China sizeof (struct mrsas_aen), mode)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_WARN,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "mrsas_ioctl: ERROR AEN copyin"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China kmem_free(ioctl, sizeof (struct mrsas_ioctl));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (EFAULT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = handle_mfi_aen(instance, &aen);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ddi_copyout((void *) &aen, (void *)arg,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China sizeof (struct mrsas_aen), mode)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_WARN,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "mrsas_ioctl: copy_to_user failed"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = scsi_hba_ioctl(dev, cmd, arg,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mode, credp, rvalp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "scsi_hba_ioctl called, ret = %x.", rval));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_free(ioctl, sizeof (struct mrsas_ioctl));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * common entry points - for block driver types *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef __sparc
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * reset - TBD
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dip:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cmd:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * TBD
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_reset(dev_info_t *dip, ddi_reset_cmd_t cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int instance_no;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance_no = ddi_get_instance(dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = (struct mrsas_instance *)ddi_get_soft_state
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (mrsas_state, instance_no);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!instance) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mr_sas:%d could not get adapter "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "in reset", instance_no));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->func_ptr->disable_intr(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "flushing cache for instance %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance_no));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele flush_cache(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China#else /* __sparc */
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China/*ARGSUSED*/
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing Chinastatic int
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing Chinamrsas_quiesce(dev_info_t *dip)
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China{
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China int instance_no;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China struct mrsas_instance *instance;
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China instance_no = ddi_get_instance(dip);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China instance = (struct mrsas_instance *)ddi_get_soft_state
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China (mrsas_state, instance_no);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (!instance) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN, "mr_sas:%d could not get adapter "
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China "in quiesce", instance_no));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (instance->deadadapter || instance->adapterresetinprogress) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN, "mr_sas:%d adapter is not in "
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China "healthy state", instance_no));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (abort_aen_cmd(instance, instance->aen_cmd)) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN, "mrsas_quiesce: "
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China "failed to abort prevous AEN command QUIESCE"));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (abort_syncmap_cmd(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->map_update_cmd)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_detach: failed to abort "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "previous syncmap command");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China instance->func_ptr->disable_intr(instance);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "flushing cache for instance %d",
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China instance_no));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China flush_cache(instance);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (wait_for_outstanding(instance)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_CONT, "wait_for_outstanding: return FAIL.\n"));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China}
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China#endif /* __sparc */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * entry points (SCSI HBA) *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_tgt_init - initialize a target device instance
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @hba_dip:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @tgt_dip:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @tran:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @sd:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_tgt_init() entry point enables the HBA to allocate and initialize
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * any per-target resources. tran_tgt_init() also enables the HBA to qualify
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the device's address as valid and supportable for that particular HBA.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * By returning DDI_FAILURE, the instance of the target driver for that device
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * is not probed or attached.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_tran_t *tran, struct scsi_device *sd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t tgt = sd->sd_address.a_target;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint8_t lun = sd->sd_address.a_lun;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald dev_info_t *child = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "mrsas_tgt_init target %d lun %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = ADDR2MR(&sd->sd_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * If no persistent node exists, we don't allow .conf node
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * to be created.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((child = mrsas_find_child(instance, tgt, lun)) != NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_NOTE, "mrsas_tgt_init find child ="
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " %p t = %d l = %d", (void *)child, tgt, lun));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ndi_merge_node(tgt_dip, mrsas_name_node) !=
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_SUCCESS)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Create this .conf node */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "mrsas_tgt_init in ndi_per "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "DDI_FAILURE t = %d l = %d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "mrsas_tgt_init dev_dip %p tgt_dip %p",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void *)instance->mr_ld_list[tgt].dip, (void *)tgt_dip));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (tgt < MRDRV_MAX_LD && lun == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->mr_ld_list[tgt].dip == NULL &&
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele strcmp(ddi_driver_name(sd->sd_dev), "sd") == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mr_ld_list[tgt].dip = tgt_dip;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mr_ld_list[tgt].lun_type = MRSAS_LD_LUN;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_ld_list[tgt].flag = MRDRV_TGT_VALID;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald else if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->mr_tbolt_pd_list[tgt].dip == NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[tgt].dip = tgt_dip;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[tgt].flag =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRDRV_TGT_VALID;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "mrsas_tran_tgt_init:"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "t%xl%x", tgt, lun));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int tgt = sd->sd_address.a_target;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int lun = sd->sd_address.a_lun;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = ADDR2MR(&sd->sd_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "tgt_free t = %d l = %d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (tgt < MRDRV_MAX_LD && lun == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->mr_ld_list[tgt].dip == tgt_dip) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mr_ld_list[tgt].dip = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald else if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[tgt].dip = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "tgt_free: Setting dip = NULL"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "for tgt:%x", tgt));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonalddev_info_t *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_find_child(struct mrsas_instance *instance, uint16_t tgt, uint8_t lun)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dev_info_t *child = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char addr[SCSI_MAXNAMELEN];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char tmp[MAXNAMELEN];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) sprintf(addr, "%x,%x", tgt, lun);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (child = ddi_get_child(instance->dip); child;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele child = ddi_get_next_sibling(child)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ndi_dev_is_persistent_node(child) == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald continue;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_name_node(child, tmp, MAXNAMELEN) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele continue;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (strcmp(addr, tmp) == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "mrsas_find_child: return child = %p",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void *)child));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (child);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * mrsas_name_node -
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @dip:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @name:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @len:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_name_node(dev_info_t *dip, char *name, int len)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int tgt, lun;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tgt = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_PROP_DONTPASS, "target", -1);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mrsas_name_node: dip %p tgt %d", (void *)dip, tgt));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (tgt == -1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele lun = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "lun", -1);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (CE_NOTE, "mrsas_name_node: tgt %d lun %d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (lun == -1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) snprintf(name, len, "%x,%x", tgt, lun);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_init_pkt - allocate & initialize a scsi_pkt structure
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @pkt:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @bp:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cmdlen:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @statuslen:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @tgtlen:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @flags:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @callback:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_init_pkt() entry point allocates and initializes a scsi_pkt
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * structure and DMA resources for a target driver request. The
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_init_pkt() entry point is called when the target driver calls the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * SCSA function scsi_init_pkt(). Each call of the tran_init_pkt() entry point
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * is a request to perform one or more of three possible services:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - allocation and initialization of a scsi_pkt structure
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - allocation of DMA resources for data transfer
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - reallocation of DMA resources for the next portion of the data transfer
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct scsi_pkt *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_init_pkt(struct scsi_address *ap, register struct scsi_pkt *pkt,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct buf *bp, int cmdlen, int statuslen, int tgtlen,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int flags, int (*callback)(), caddr_t arg)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_pkt *new_pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance = ADDR2MR(ap);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* step #1 : pkt allocation */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (pkt == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt = scsi_hba_pkt_alloc(instance->dip, ap, cmdlen, statuslen,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tgtlen, sizeof (struct scsa_cmd), callback, arg);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (pkt == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Initialize the new pkt - we redundantly initialize
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * all the fields for illustrative purposes.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_pkt = pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_scblen = statuslen;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cdblen = cmdlen;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmahandle = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_ncookies = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookie = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookiecnt = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_nwin = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_address = *ap;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_comp = (void (*)())NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_flags = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_time = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_resid = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_state = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele new_pkt = pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele new_pkt = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* step #2 : dma allocation/move */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (bp && bp->b_bcount != 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_dmahandle == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_dma_alloc(instance, pkt, bp, flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele callback) == DDI_FAILURE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (new_pkt) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_pkt_free(ap, new_pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return ((struct scsi_pkt *)NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_dma_move(instance, pkt, bp) == DDI_FAILURE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return ((struct scsi_pkt *)NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_start - transport a SCSI command to the addressed target
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @pkt:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_start() entry point for a SCSI HBA driver is called to transport a
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * SCSI command to the addressed target. The SCSI command is described
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * entirely within the scsi_pkt structure, which the target driver allocated
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * through the HBA driver's tran_init_pkt() entry point. If the command
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * involves a data transfer, DMA resources must also have been allocated for
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the scsi_pkt structure.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Return Values :
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * TRAN_BUSY - request queue is full, no more free scbs
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * TRAN_ACCEPT - pkt has been submitted to the instance
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_start(struct scsi_address *ap, register struct scsi_pkt *pkt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uchar_t cmd_done = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance = ADDR2MR(ap);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->deadadapter == 1) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_tran_start: return TRAN_FATAL_ERROR "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "for IO, as the HBA doesnt take any more IOs"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt->pkt_reason = CMD_DEV_GONE;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt->pkt_statistics = STAT_DISCON;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (TRAN_FATAL_ERROR);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "mrsas_tran_start: Reset flag set, "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "returning mfi_pkt and setting TRAN_BUSY\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (TRAN_BUSY);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "chkpnt:%s:%d:SCSI CDB[0]=0x%x time:%x",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China __func__, __LINE__, pkt->pkt_cdbp[0], pkt->pkt_time));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *pkt->pkt_scbp = STATUS_GOOD; /* clear arq scsi_status */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd = build_cmd(instance, ap, pkt, &cmd_done);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Check if the command is already completed by the mrsas_build_cmd()
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * routine. In which case the busy_flag would be clear and scb will be
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * NULL and appropriate reason provided in pkt_reason field
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd_done) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_scbp[0] = STATUS_GOOD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_SENT_CMD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (((pkt->pkt_flags & FLAG_NOINTR) == 0) && pkt->pkt_comp) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (*pkt->pkt_comp)(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (TRAN_ACCEPT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (TRAN_BUSY);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((pkt->pkt_flags & FLAG_NOINTR) == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->fw_outstanding > instance->max_fw_cmds) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_CONT, "mr_sas:Firmware busy"));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(start_tran_err,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint16_t, instance->fw_outstanding,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint16_t, instance->max_fw_cmds);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (TRAN_BUSY);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Synchronize the Cmd frame for the controller */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle, 0, 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_SYNC_FORDEV);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "issue_cmd_ppc: SCSI CDB[0]=0x%x"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "cmd->index:%x\n", pkt->pkt_cdbp[0], cmd->index));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->func_ptr->issue_cmd(cmd, instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_header *hdr = &cmd->frame->hdr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_state |= STATE_XFERRED_DATA | STATE_GOT_STATUS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (ddi_get8(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &hdr->cmd_status)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_OK:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_scbp[0] = STATUS_GOOD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_SCSI_DONE_WITH_ERROR:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_tran_start: scsi done with error"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((struct scsi_status *)pkt->pkt_scbp)->sts_chk = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_DEVICE_NOT_FOUND:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_tran_start: device not found error"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_DEV_GONE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = STAT_DISCON;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((struct scsi_status *)pkt->pkt_scbp)->sts_busy = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_common_check(instance, cmd);
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(start_nointr_done, uint8_t, hdr->cmd,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint8_t, hdr->cmd_status);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (pkt->pkt_comp) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (*pkt->pkt_comp)(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (TRAN_ACCEPT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_abort - Abort any commands that are currently in transport
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @pkt:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_abort() entry point for a SCSI HBA driver is called to abort any
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * commands that are currently in transport for a particular target. This entry
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * point is called when a target driver calls scsi_abort(). The tran_abort()
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * entry point should attempt to abort the command denoted by the pkt
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * parameter. If the pkt parameter is NULL, tran_abort() should attempt to
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * abort all outstanding commands in the transport layer for the particular
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * target or logical unit.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_abort(struct scsi_address *ap, struct scsi_pkt *pkt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* abort command not supported by H/W */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_reset - reset either the SCSI bus or target
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @level:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_reset() entry point for a SCSI HBA driver is called to reset either
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the SCSI bus or a particular SCSI target device. This entry point is called
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * when a target driver calls scsi_reset(). The tran_reset() entry point must
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * reset the SCSI bus if level is RESET_ALL. If level is RESET_TARGET, just the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * particular target or logical unit must be reset.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_reset(struct scsi_address *ap, int level)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_instance *instance = ADDR2MR(ap);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (wait_for_outstanding(instance)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_CONT, "wait_for_outstanding: return FAIL.\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_getcap - get one of a set of SCSA-defined capabilities
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @whom:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The target driver can request the current setting of the capability for a
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * particular target by setting the whom parameter to nonzero. A whom value of
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * zero indicates a request for the current setting of the general capability
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * for the SCSI bus or for adapter hardware. The tran_getcap() should return -1
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * for undefined capabilities or the current value of the requested capability.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_getcap(struct scsi_address *ap, char *cap, int whom)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance = ADDR2MR(ap);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* we do allow inquiring about capabilities for other targets */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cap == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (scsi_hba_lookup_capstr(cap)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_DMA_MAX:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Limit to 256k max transfer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_tbolt_max_cap_maxxfer;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Limit to 16MB max transfer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_max_cap_maxxfer;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_MSG_OUT:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_DISCONNECT:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_SYNCHRONOUS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_WIDE_XFER:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_TAGGED_QING:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_UNTAGGED_QING:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_PARITY:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_INITIATOR_ID:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = instance->init_id;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_ARQ:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_LINKED_CMDS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_RESET_NOTIFICATION:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_GEOMETRY:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = -1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_DLEVEL2, (CE_NOTE, "Default cap coming 0x%x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_lookup_capstr(cap)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = -1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_setcap - set one of a set of SCSA-defined capabilities
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @cap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @value:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @whom:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The target driver might request that the new value be set for a particular
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * target by setting the whom parameter to nonzero. A whom value of zero
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * means that request is to set the new value for the SCSI bus or for adapter
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * hardware in general.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_setcap() should return the following values as appropriate:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - -1 for undefined capabilities
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - 0 if the HBA driver cannot set the capability to the requested value
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - 1 if the HBA driver is able to set the capability to the requested value
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_setcap(struct scsi_address *ap, char *cap, int value, int whom)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* We don't allow setting capabilities for other targets */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cap == NULL || whom == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (scsi_hba_lookup_capstr(cap)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_DMA_MAX:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_MSG_OUT:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_PARITY:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_LINKED_CMDS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_RESET_NOTIFICATION:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_DISCONNECT:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_SYNCHRONOUS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_UNTAGGED_QING:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_WIDE_XFER:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_INITIATOR_ID:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_ARQ:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * None of these are settable via
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * the capability interface.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_TAGGED_QING:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_SECTOR_SIZE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCSI_CAP_TOTAL_SECTORS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = -1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_destroy_pkt - deallocate scsi_pkt structure
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @pkt:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_destroy_pkt() entry point is the HBA driver function that
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * deallocates scsi_pkt structures. The tran_destroy_pkt() entry point is
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * called when the target driver calls scsi_destroy_pkt(). The
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_destroy_pkt() entry point must free any DMA resources that have been
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * allocated for the packet. An implicit DMA synchronization occurs if the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * DMA resources are freed and any cached data remains after the completion
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * of the transfer.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_DMAVALID) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags &= ~CFLAG_DMAVALID;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_unbind_handle(acmd->cmd_dmahandle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_free_handle(&acmd->cmd_dmahandle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmahandle = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free the pkt */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_pkt_free(ap, pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_dmafree - deallocates DMA resources
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @pkt:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_dmafree() entry point deallocates DMAQ resources that have been
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * allocated for a scsi_pkt structure. The tran_dmafree() entry point is
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * called when the target driver calls scsi_dmafree(). The tran_dmafree() must
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * free only DMA resources allocated for a scsi_pkt structure, not the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * scsi_pkt itself. When DMA resources are freed, a DMA synchronization is
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * implicitly performed.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele register struct scsa_cmd *acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_DMAVALID) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags &= ~CFLAG_DMAVALID;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_unbind_handle(acmd->cmd_dmahandle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_free_handle(&acmd->cmd_dmahandle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmahandle = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * tran_sync_pkt - synchronize the DMA object allocated
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @ap:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @pkt:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * The tran_sync_pkt() entry point synchronizes the DMA object allocated for
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * the scsi_pkt structure before or after a DMA transfer. The tran_sync_pkt()
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * entry point is called when the target driver calls scsi_sync_pkt(). If the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * data transfer direction is a DMA read from device to memory, tran_sync_pkt()
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * must synchronize the CPU's view of the data. If the data transfer direction
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * is a DMA write from memory to device, tran_sync_pkt() must synchronize the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * device's view of the data.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele register struct scsa_cmd *acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_DMAVALID) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(acmd->cmd_dmahandle, acmd->cmd_dma_offset,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_len, (acmd->cmd_flags & CFLAG_DMASEND) ?
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*ARGSUSED*/
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_tran_quiesce(dev_info_t *dip)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (1);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*ARGSUSED*/
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic int
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_tran_unquiesce(dev_info_t *dip)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (1);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mrsas_isr(caddr_t)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * The Interrupt Service Routine
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Collect status for all completed commands and do callback
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic uint_t
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_isr(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int need_softintr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t producer;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t consumer;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t context;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int retval;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_header *hdr;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ASSERT(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->chip_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((instance->intr_type == DDI_INTR_TYPE_FIXED) &&
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald !(instance->func_ptr->intr_ack(instance))) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->chip_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_INTR_UNCLAIMED);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald retval = mr_sas_tbolt_process_outstanding_cmd(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->chip_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (retval);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((instance->intr_type == DDI_INTR_TYPE_FIXED) &&
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald !instance->func_ptr->intr_ack(instance)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_INTR_UNCLAIMED);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, 0, DDI_DMA_SYNC_FORCPU);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mr_sas_isr(): FMA check, returning DDI_INTR_UNCLAIMED"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China#ifdef OCRDEBUG
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (debug_consecutive_timeout_after_ocr_g == 1) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "simulating consecutive timeout after ocr"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China#endif
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_enter(&instance->completed_pool_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->cmd_pend_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele producer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele instance->producer);
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele consumer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele instance->consumer);
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, " producer %x consumer %x ",
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele producer, consumer));
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele if (producer == consumer) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_WARN, "producer == consumer case"));
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele DTRACE_PROBE2(isr_pc_err, uint32_t, producer,
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele uint32_t, consumer);
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele mutex_exit(&instance->cmd_pend_mtx);
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->completed_pool_mtx);
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele return (DDI_INTR_CLAIMED);
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele }
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele while (consumer != producer) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele context = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &instance->reply_queue[consumer]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd = instance->cmd_list[context];
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd->sync_cmd == MRSAS_TRUE) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald hdr = (struct mrsas_header *)&cmd->frame->hdr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (hdr) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mlist_del_init(&cmd->list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_del_init(&cmd->list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mlist_add_tail(&cmd->list, &instance->completed_pool_list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele consumer++;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (consumer == (instance->max_fw_cmds + 1)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele consumer = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
b13a95430748795770df36722891ee4065f08f5aSusan Scheufele instance->consumer, consumer);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_exit(&instance->completed_pool_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, 0, DDI_DMA_SYNC_FORDEV);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->softint_running) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele need_softintr = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele need_softintr = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->isr_level == HIGH_LEVEL_INTR) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (need_softintr) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_trigger_softintr(instance->soft_intr_id);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Not a high-level interrupt, therefore call the soft level
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * interrupt explicitly
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_softintr(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_INTR_CLAIMED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * libraries *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ************************************************************************** *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * get_mfi_pkt : Get a command from the free pool
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * After successful allocation, the caller of this routine
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * must clear the frame buffer (memset to zero) before
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * using the packet further.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ***** Note *****
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * After clearing the frame buffer the context id of the
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * frame buffer SHOULD be restored back.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonaldstruct mrsas_cmd *
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonaldmrsas_get_mfi_pkt(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mlist_t *head = &instance->cmd_pool_list;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_enter(&instance->cmd_pool_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!mlist_empty(head)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd = mlist_entry(head->next, struct mrsas_cmd, list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mlist_del_init(head->next);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt = NULL;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->retry_count_for_ocr = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_exit(&instance->cmd_pool_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic struct mrsas_cmd *
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinaget_mfi_app_pkt(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_t *head = &instance->app_cmd_pool_list;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_cmd *cmd = NULL;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->app_cmd_pool_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (!mlist_empty(head)) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd = mlist_entry(head->next, struct mrsas_cmd, list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_del_init(head->next);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd != NULL) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->pkt = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->retry_count_for_ocr = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->drv_pkt_time = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->app_cmd_pool_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (cmd);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * return_mfi_pkt : Return a cmd to free command pool
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonaldvoid
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonaldmrsas_return_mfi_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_enter(&instance->cmd_pool_mtx);
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China /* use mlist_add_tail for debug assistance */
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China mlist_add_tail(&cmd->list, &instance->cmd_pool_list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_exit(&instance->cmd_pool_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic void
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinareturn_mfi_app_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->app_cmd_pool_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_add(&cmd->list, &instance->app_cmd_pool_list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->app_cmd_pool_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinapush_pending_mfi_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_header *hdr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_NOTE, "push_pending_pkt(): Called\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_del_init(&cmd->list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_add_tail(&cmd->list, &instance->cmd_pend_list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd->sync_cmd == MRSAS_TRUE) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China hdr = (struct mrsas_header *)&cmd->frame->hdr;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (hdr) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "push_pending_mfi_pkt: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "cmd %p index %x "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "time %llx",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)cmd, cmd->index,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China gethrtime()));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Wait for specified interval */
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = ddi_get16(
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->frame_dma_obj.acc_handle, &hdr->timeout);
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (cmd->drv_pkt_time < debug_timeout_g)
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "push_pending_pkt(): "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Called IO Timeout Value %x\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->drv_pkt_time));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (hdr && instance->timeout_id == (timeout_id_t)-1) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->timeout_id = timeout(io_timeout_checker,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *) instance, drv_usectohz(MRSAS_1_SECOND));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "push_pending_mfi_pkt: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "cmd %p index %x pkt %p, "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "time %llx",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)cmd, cmd->index, (void *)pkt,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China gethrtime()));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt && instance->timeout_id == (timeout_id_t)-1) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->timeout_id = timeout(io_timeout_checker,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *) instance, drv_usectohz(MRSAS_1_SECOND));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_print_pending_cmds(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_t *head = &instance->cmd_pend_list;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_t *tmp = head;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_cmd *cmd = NULL;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_header *hdr;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China unsigned int flag = 1;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int saved_level;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int cmd_count = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald saved_level = debug_level_g;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald debug_level_g = CL_ANN1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_NOTE,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "mrsas_print_pending_cmds(): Called");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China while (flag) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China tmp = tmp->next;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (tmp == head) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China flag = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "mrsas_print_pending_cmds():"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " NO MORE CMDS PENDING....\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China break;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd = mlist_entry(tmp, struct mrsas_cmd, list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd->sync_cmd == MRSAS_TRUE) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald hdr = (struct mrsas_header *)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &cmd->frame->hdr;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (hdr) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "print: cmd %p index 0x%x "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "drv_pkt_time 0x%x (NO-PKT)"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " hdr %p\n", (void *)cmd,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->index,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->drv_pkt_time,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)hdr));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "print: cmd %p index 0x%x "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "drv_pkt_time 0x%x pkt %p \n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)cmd, cmd->index,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->drv_pkt_time, (void *)pkt));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (++cmd_count == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_print_cmd_details(instance, cmd,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 0xDD);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_print_cmd_details(instance, cmd,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 1);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "mrsas_print_pending_cmds(): Done\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald debug_level_g = saved_level;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_complete_pending_cmds(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_cmd *cmd = NULL;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_header *hdr;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mlist_head *pos, *next;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_complete_pending_cmds(): Called"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_for_each_safe(pos, next, &instance->cmd_pend_list) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd = mlist_entry(pos, struct mrsas_cmd, list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (pkt) { /* for IO */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (((pkt->pkt_flags & FLAG_NOINTR)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China == 0) && pkt->pkt_comp) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt->pkt_reason
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China = CMD_DEV_GONE;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt->pkt_statistics
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China = STAT_DISCON;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "fail and posting to scsa "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "cmd %p index %x"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China " pkt %p "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "time : %llx",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)cmd, cmd->index,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)pkt, gethrtime()));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (*pkt->pkt_comp)(pkt);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else { /* for DCMDS */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd->sync_cmd == MRSAS_TRUE) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China hdr = (struct mrsas_header *)&cmd->frame->hdr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "posting invalid status to application "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "cmd %p index %x"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China " hdr %p "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "time : %llx",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)cmd, cmd->index,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)hdr, gethrtime()));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China hdr->cmd_status = MFI_STAT_INVALID_STATUS;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China complete_cmd_in_sync_mode(instance, cmd);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_del_init(&cmd->list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_complete_pending_cmds:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "NULL command\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_complete_pending_cmds:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "looping for more commands\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "mrsas_complete_pending_cmds(): DONE\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_print_cmd_details(struct mrsas_instance *instance, struct mrsas_cmd *cmd,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int detail)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct scsi_pkt *pkt = cmd->pkt;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald Mpi2RaidSCSIIORequest_t *scsi_io = cmd->scsi_io_request;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int i;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int saved_level;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_acc_handle_t acc_handle =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mpi2_frame_pool_dma_obj.acc_handle;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (detail == 0xDD) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald saved_level = debug_level_g;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald debug_level_g = CL_ANN1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "print_cmd_details: cmd %p "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "cmd->index 0x%x SMID 0x%x timer 0x%x sec\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)cmd, cmd->index, cmd->SMID, cmd->drv_pkt_time));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "print_cmd_details: cmd %p "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "cmd->index 0x%x timer 0x%x sec\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)cmd, cmd->index, cmd->drv_pkt_time));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (pkt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "scsi_pkt CDB[0]=0x%x",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pkt->pkt_cdbp[0]));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "NO-PKT"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((detail == 0xDD) && instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "RAID_SCSI_IO_REQUEST\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "DevHandle=0x%X Function=0x%X "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "IoFlags=0x%X SGLFlags=0x%X DataLength=0x%X\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle, &scsi_io->DevHandle),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->Function),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle, &scsi_io->IoFlags),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle, &scsi_io->SGLFlags),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get32(acc_handle, &scsi_io->DataLength)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < 32; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "CDB[%d]=0x%x ", i,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->CDB.CDB32[i])));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "RAID-CONTEXT\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "status=0x%X extStatus=0x%X "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "ldTargetId=0x%X timeoutValue=0x%X regLockFlags=0x%X "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "RAIDFlags=0x%X regLockRowLBA=0x%" PRIu64
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " regLockLength=0x%X spanArm=0x%X\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->RaidContext.status),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->RaidContext.extStatus),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle, &scsi_io->RaidContext.ldTargetId),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle, &scsi_io->RaidContext.timeoutValue),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->RaidContext.regLockFlags),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->RaidContext.RAIDFlags),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get64(acc_handle, &scsi_io->RaidContext.regLockRowLBA),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get32(acc_handle, &scsi_io->RaidContext.regLockLength),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get8(acc_handle, &scsi_io->RaidContext.spanArm)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (detail == 0xDD) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald debug_level_g = saved_level;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_issue_pending_cmds(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_t *head = &instance->cmd_pend_list;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_t *tmp = head->next;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_cmd *cmd = NULL;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_issue_pending_cmds(): Called"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China while (tmp != head) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd = mlist_entry(tmp, struct mrsas_cmd, list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China tmp = tmp->next;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_pending_cmds(): "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Got a cmd: cmd %p index 0x%x drv_pkt_time 0x%x ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)cmd, cmd->index, cmd->drv_pkt_time));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Reset command timeout value */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd->drv_pkt_time < debug_timeout_g)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->retry_count_for_ocr++;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_CONT,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "cmd retry count = %d\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->retry_count_for_ocr);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd->retry_count_for_ocr > IO_RETRY_COUNT) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman CE_WARN, "mrsas_issue_pending_cmds(): "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "cmd->retry_count exceeded limit >%d\n",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald IO_RETRY_COUNT);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_print_cmd_details(instance, cmd, 0xDD);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_pending_cmds():"
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "Calling KILL Adapter");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_tbolt_kill_adapter(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_kill_adapter(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "PENDING PKT-CMD ISSUE: cmd %p index %x "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "pkt %p time %llx",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)cmd, cmd->index,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)pkt,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China gethrtime()));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_issue_pending_cmds(): NO-PKT, "
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "cmd %p index 0x%x drv_pkt_time 0x%x",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)cmd, cmd->index, cmd->drv_pkt_time);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (cmd->sync_cmd == MRSAS_TRUE) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_CONT,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "mrsas_issue_pending_cmds(): "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "SYNC_CMD == TRUE \n");
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->issue_cmd_in_sync_mode(
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance, cmd);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->issue_cmd(cmd, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_pending_cmds: NULL command\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_pending_cmds:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "looping for more commands"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "mrsas_issue_pending_cmds(): DONE\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * destroy_mfi_frame_pool
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeledestroy_mfi_frame_pool(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t max_cmd = instance->max_fw_cmds;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* return all frames to pool */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < max_cmd; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd = instance->cmd_list[i];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd->frame_dma_obj_status == DMA_OBJ_ALLOCATED)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_free_dma_obj(instance, cmd->frame_dma_obj);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj_status = DMA_OBJ_FREED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * create_mfi_frame_pool
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelecreate_mfi_frame_pool(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int cookie_cnt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t max_cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t sge_sz;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t sgl_sz;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t tot_frame_size;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int retval = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele max_cmd = instance->max_fw_cmds;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China sge_sz = sizeof (struct mrsas_sge_ieee);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* calculated the number of 64byte frames required for SGL */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sgl_sz = sge_sz * instance->max_num_sge;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tot_frame_size = sgl_sz + MRMFI_FRAME_SIZE + SENSE_LENGTH;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_DLEVEL3, (CE_NOTE, "create_mfi_frame_pool: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "sgl_sz %x tot_frame_size %x", sgl_sz, tot_frame_size));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald while (i < max_cmd) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd = instance->cmd_list[i];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.size = tot_frame_size;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_attr.dma_attr_align = 64;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cookie_cnt = mrsas_alloc_dma_obj(instance, &cmd->frame_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cookie_cnt == -1 || cookie_cnt > 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "create_mfi_frame_pool: could not alloc.");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald retval = DDI_FAILURE;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_undo_frame_pool;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bzero(cmd->frame_dma_obj.buffer, tot_frame_size);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj_status = DMA_OBJ_ALLOCATED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame = (union mrsas_frame *)cmd->frame_dma_obj.buffer;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_phys_addr =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_cookie[0].dmac_address;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sense = (uint8_t *)(((unsigned long)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.buffer) +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tot_frame_size - SENSE_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sense_phys_addr =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.dma_cookie[0].dmac_address +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tot_frame_size - SENSE_LENGTH;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!cmd->frame || !cmd->sense) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "pci_pool_alloc failed");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald retval = ENOMEM;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_undo_frame_pool;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &cmd->frame->io.context, cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i++;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_DLEVEL3, (CE_NOTE, "[%x]-%x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index, cmd->frame_phys_addr));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_undo_frame_pool:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (i > 0)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald destroy_mfi_frame_pool(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (retval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * free_additional_dma_buffer
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelefree_additional_dma_buffer(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->mfi_internal_dma_obj.status == DMA_OBJ_ALLOCATED) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_free_dma_obj(instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->mfi_evt_detail_obj.status == DMA_OBJ_ALLOCATED) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_free_dma_obj(instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.status = DMA_OBJ_FREED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * alloc_additional_dma_buffer
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelealloc_additional_dma_buffer(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t reply_q_sz;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t internal_buf_size = PAGESIZE*2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* max cmds plus 1 + producer & consumer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele reply_q_sz = sizeof (uint32_t) * (instance->max_fw_cmds + 1 + 2);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.size = internal_buf_size;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_attr.dma_attr_count_max =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &instance->mfi_internal_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "could not alloc reply queue");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bzero(instance->mfi_internal_dma_obj.buffer, internal_buf_size);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.status |= DMA_OBJ_ALLOCATED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->producer = (uint32_t *)((unsigned long)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.buffer);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->consumer = (uint32_t *)((unsigned long)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.buffer + 4);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->reply_queue = (uint32_t *)((unsigned long)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.buffer + 8);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->internal_buf = (caddr_t)(((unsigned long)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.buffer) + reply_q_sz + 8);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->internal_buf_dmac_add =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (reply_q_sz + 8);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->internal_buf_size = internal_buf_size -
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (reply_q_sz + 8);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate evt_detail */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.size = sizeof (struct mrsas_evt_detail);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &instance->mfi_evt_detail_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "alloc_additional_dma_buffer: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "could not allocate data transfer buffer.");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_undo_internal_buff;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bzero(instance->mfi_evt_detail_obj.buffer,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_detail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.status |= DMA_OBJ_ALLOCATED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_undo_internal_buff:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->mfi_internal_dma_obj.status == DMA_OBJ_ALLOCATED) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_free_dma_obj(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mfi_internal_dma_obj);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_free_cmd_pool(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t max_cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald size_t sz;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* already freed */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->cmd_list == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_cmd = instance->max_fw_cmds;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* size of cmd_list array */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sz = sizeof (struct mrsas_cmd *) * max_cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* First free each cmd */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < max_cmd; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->cmd_list[i] != NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->cmd_list[i],
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (struct mrsas_cmd));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->cmd_list[i] = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Now, free cmd_list array */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->cmd_list != NULL)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->cmd_list, sz);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->cmd_list = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->cmd_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->cmd_pend_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->cmd_app_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->app_cmd_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * mrsas_alloc_cmd_pool
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_alloc_cmd_pool(struct mrsas_instance *instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int i;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int count;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t max_cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t reserve_cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald size_t sz;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd *cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_cmd = instance->max_fw_cmds;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "mrsas_alloc_cmd_pool: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "max_cmd %x", max_cmd));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sz = sizeof (struct mrsas_cmd *) * max_cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * instance->cmd_list is an array of struct mrsas_cmd pointers.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Allocate the dynamic array first and then allocate individual
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * commands.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->cmd_list = kmem_zalloc(sz, KM_SLEEP);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ASSERT(instance->cmd_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* create a frame pool and assign one frame to each cmd */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (count = 0; count < max_cmd; count++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->cmd_list[count] =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_zalloc(sizeof (struct mrsas_cmd), KM_SLEEP);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ASSERT(instance->cmd_list[count]);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* add all the commands to command pool */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->cmd_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->cmd_pend_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald INIT_LIST_HEAD(&instance->app_cmd_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /*
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * When max_cmd is lower than MRSAS_APP_RESERVED_CMDS, how do I split
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * into app_cmd and regular cmd? For now, just take
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * max(1/8th of max, 4);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald reserve_cmd = min(MRSAS_APP_RESERVED_CMDS,
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald max(max_cmd >> 3, MRSAS_APP_MIN_RESERVED_CMDS));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < reserve_cmd; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = instance->cmd_list[i];
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->index = i;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mlist_add_tail(&cmd->list, &instance->app_cmd_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = reserve_cmd; i < max_cmd; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = instance->cmd_list[i];
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->index = i;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mlist_add_tail(&cmd->list, &instance->cmd_pool_list);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_undo_cmds:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (count > 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* free each cmd */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < count; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->cmd_list[i] != NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->cmd_list[i],
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (struct mrsas_cmd));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->cmd_list[i] = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_undo_cmd_list:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->cmd_list != NULL)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->cmd_list, sz);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->cmd_list = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * free_space_for_mfi
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic void
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldfree_space_for_mfi(struct mrsas_instance *instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* already freed */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->cmd_list == NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Free additional dma buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald free_additional_dma_buffer(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Free the MFI frame pool */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald destroy_mfi_frame_pool(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Free all the commands in the cmd_list */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Free the cmd_list buffer itself */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_free_cmd_pool(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * alloc_space_for_mfi
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelealloc_space_for_mfi(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Allocate command pool (memory for cmd_list & individual commands) */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_alloc_cmd_pool(instance)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "error creating cmd pool");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Allocate MFI Frame pool */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (create_mfi_frame_pool(instance)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "error creating frame DMA pool");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mfi_undo_cmd_pool;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Allocate additional DMA buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (alloc_additional_dma_buffer(instance)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "error creating frame DMA pool");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mfi_undo_frame_pool;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmfi_undo_frame_pool:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald destroy_mfi_frame_pool(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmfi_undo_cmd_pool:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_free_cmd_pool(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * get_ctrl_info
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleget_ctrl_info(struct mrsas_instance *instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_ctrl_info *ctrl_info)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_ctrl_info *ci;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = get_raid_msg_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!cmd) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "Failed to get a cmd for ctrl info"));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(info_mfi_err, uint16_t, instance->fw_outstanding,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd = &cmd->frame->dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ci = (struct mrsas_ctrl_info *)instance->internal_buf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!ci) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Failed to alloc mem for ctrl info");
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(ci, 0, sizeof (struct mrsas_ctrl_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* for( i = 0; i < DCMD_MBOX_SZ; i++ ) dcmd->mbox.b[i] = 0; */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_CMD_STATUS_POLL_MODE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_FRAME_DIR_READ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_ctrl_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MR_DCMD_CTRL_GET_INFO);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->internal_buf_dmac_add);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_ctrl_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (!instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ret = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ctrl_info->max_request_size = ddi_get32(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->frame_dma_obj.acc_handle, &ci->max_request_size);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ctrl_info->ld_present_count = ddi_get16(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->frame_dma_obj.acc_handle, &ci->ld_present_count);
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ctrl_info->properties.on_off_properties = ddi_get32(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->frame_dma_obj.acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &ci->properties.on_off_properties);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_rep_get8(cmd->frame_dma_obj.acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t *)(ctrl_info->product_name),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t *)(ci->product_name), 80 * sizeof (char),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_DEV_AUTOINCR);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* should get more members of ci with ddi_get when needed */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "get_ctrl_info: Ctrl info failed");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = -1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = -1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return_raid_msg_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * abort_aen_cmd
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleabort_aen_cmd(struct mrsas_instance *instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd_to_abort)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_abort_frame *abort_fr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "chkpnt: abort_aen:%d", __LINE__));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = get_raid_msg_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!cmd) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China "abort_aen_cmd():Failed to get a cmd for abort_aen_cmd"));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(abort_mfi_err, uint16_t, instance->fw_outstanding,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele abort_fr = &cmd->frame->abort;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* prepare and issue the abort frame */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &abort_fr->cmd, MFI_CMD_OP_ABORT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &abort_fr->cmd_status,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_CMD_STATUS_SYNC_MODE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &abort_fr->flags, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &abort_fr->abort_context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd_to_abort->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &abort_fr->abort_mfi_phys_addr_lo, cmd_to_abort->frame_phys_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &abort_fr->abort_mfi_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->aen_cmd->abort_aen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China "abort_aen_cmd: issue_cmd_in_poll_mode failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = -1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->aen_cmd->abort_aen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->aen_cmd = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return_raid_msg_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China atomic_add_16(&instance->fw_outstanding, (-1));
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_build_init_cmd(struct mrsas_instance *instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd **cmd_ptr)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_init_frame *init_frame;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_init_queue_info *initq_info;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_drv_ver drv_ver_info;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Prepare a init frame. Note the init frame points to queue info
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * structure. Each frame has SGL allocated after first 64 bytes. For
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * this frame - since we don't need any SGL - we use SGL's space as
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * queue info structure
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = *cmd_ptr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele init_frame = (struct mrsas_init_frame *)cmd->frame;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele initq_info = (struct mrsas_init_queue_info *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((unsigned long)init_frame + 64);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(init_frame, 0, MRMFI_FRAME_SIZE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(initq_info, 0, sizeof (struct mrsas_init_queue_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &initq_info->init_flags, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->reply_queue_entries, instance->max_fw_cmds + 1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->producer_index_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->producer_index_phys_addr_lo,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->consumer_index_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->consumer_index_phys_addr_lo,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 4);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->reply_queue_start_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &initq_info->reply_queue_start_phys_addr_lo,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 8);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &init_frame->cmd, MFI_CMD_OP_INIT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &init_frame->cmd_status,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_CMD_STATUS_POLL_MODE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &init_frame->flags, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &init_frame->queue_info_new_phys_addr_lo,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_phys_addr + 64);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &init_frame->queue_info_new_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* fill driver version information */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald fill_up_drv_ver(&drv_ver_info);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* allocate the driver version data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.size = sizeof (drv_ver_info.drv_ver);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.dma_attr = mrsas_generic_dma_attr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.dma_attr.dma_attr_sgllen = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.dma_attr.dma_attr_align = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_alloc_dma_obj(instance, &instance->drv_ver_dma_obj,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "init_mfi : Could not allocate driver version buffer."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* copy driver version to dma buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) memset(instance->drv_ver_dma_obj.buffer, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (drv_ver_info.drv_ver));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_rep_put8(cmd->frame_dma_obj.acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t *)drv_ver_info.drv_ver,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t *)instance->drv_ver_dma_obj.buffer,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (drv_ver_info.drv_ver), DDI_DEV_AUTOINCR);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* copy driver version physical address to init frame */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_put64(cmd->frame_dma_obj.acc_handle, &init_frame->driverversion,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->drv_ver_dma_obj.dma_cookie[0].dmac_address);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &init_frame->data_xfer_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_init_queue_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *cmd_ptr = cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * mrsas_init_adapter_ppc - Initialize MFI interface adapter.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_init_adapter_ppc(struct mrsas_instance *instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_cmd *cmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * allocate memory for mfi adapter(cmd pool, individual commands, mfi
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * frames etc
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (alloc_space_for_mfi(instance) != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Error, failed to allocate memory for MFI adapter"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Build INIT command */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (cmd == NULL) {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald DTRACE_PROBE2(init_adapter_mfi_err, uint16_t,
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald return (DDI_FAILURE);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_build_init_cmd(instance, &cmd) != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_NOTE, "Error, failed to build INIT command"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto fail_undo_alloc_mfi_space;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Disable interrupt before sending init frame ( see linux driver code)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * send INIT MFI frame in polled mode
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "failed to init firmware"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto fail_fw_init;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_common_check(instance, cmd) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto fail_fw_init;
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China if (ctio_enable &&
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China (instance->func_ptr->read_fw_status_reg(instance) & 0x04000000)) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_NOTE, "mr_sas: IEEE SGL's supported"));
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China instance->flag_ieee = 1;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China } else {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China instance->flag_ieee = 0;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China }
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald ASSERT(!instance->skinny || instance->flag_ieee);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.alloc_space_mfi = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->unroll.verBuff = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldfail_fw_init:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_free_dma_obj(instance, instance->drv_ver_dma_obj);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldfail_undo_alloc_mfi_space:
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald free_space_for_mfi(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * mrsas_init_adapter - Initialize adapter.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_init_adapter(struct mrsas_instance *instance)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_ctrl_info ctrl_info;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* we expect the FW state to be READY */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mfi_state_transition_to_ready(instance)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_WARN, "mr_sas: F/W is not ready"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* get various operational parameters from status register */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->max_num_sge =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (instance->func_ptr->read_fw_status_reg(instance) &
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 0xFF0000) >> 0x10;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->max_num_sge =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (instance->max_num_sge > MRSAS_MAX_SGE_CNT) ?
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_MAX_SGE_CNT : instance->max_num_sge;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Reduce the max supported cmds by 1. This is to ensure that the
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * reply_q_sz (1 more than the max cmd that driver may send)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * does not exceed max cmds that the FW can support
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->max_fw_cmds =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr->read_fw_status_reg(instance) & 0xFFFF;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->max_fw_cmds = instance->max_fw_cmds - 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Initialize adapter */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->func_ptr->init_adapter(instance) != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_WARN, "mr_sas: could not initialize adapter"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* gather misc FW related information */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->disable_online_ctrl_reset = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!get_ctrl_info(instance, &ctrl_info)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->max_sectors_per_req = ctrl_info.max_request_size;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "product name %s ld present %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ctrl_info.product_name, ctrl_info.ld_present_count));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->max_sectors_per_req = instance->max_num_sge *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele PAGESIZE / 512;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (ctrl_info.properties.on_off_properties & DISABLE_OCR_PROP_FLAG)
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China instance->disable_online_ctrl_reset = 1;
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic int
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_issue_init_mfi(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_cmd *cmd;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_init_frame *init_frame;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_init_queue_info *initq_info;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China/*
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * Prepare a init frame. Note the init frame points to queue info
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * structure. Each frame has SGL allocated after first 64 bytes. For
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * this frame - since we don't need any SGL - we use SGL's space as
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * queue info structure
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_init_mfi: entry\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd = get_mfi_app_pkt(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (!cmd) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_init_mfi: get_pkt failed\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China /* Clear the frame buffer and assign back the context id */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->index);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China init_frame = (struct mrsas_init_frame *)cmd->frame;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China initq_info = (struct mrsas_init_queue_info *)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ((unsigned long)init_frame + 64);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) memset(init_frame, 0, MRMFI_FRAME_SIZE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) memset(initq_info, 0, sizeof (struct mrsas_init_queue_info));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle, &initq_info->init_flags, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->reply_queue_entries, instance->max_fw_cmds + 1);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->producer_index_phys_addr_hi, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->producer_index_phys_addr_lo,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->consumer_index_phys_addr_hi, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->consumer_index_phys_addr_lo,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 4);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->reply_queue_start_phys_addr_hi, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &initq_info->reply_queue_start_phys_addr_lo,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 8);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put8(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &init_frame->cmd, MFI_CMD_OP_INIT);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put8(cmd->frame_dma_obj.acc_handle, &init_frame->cmd_status,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China MFI_CMD_STATUS_POLL_MODE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put16(cmd->frame_dma_obj.acc_handle, &init_frame->flags, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &init_frame->queue_info_new_phys_addr_lo,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->frame_phys_addr + 64);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China &init_frame->queue_info_new_phys_addr_hi, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle, &init_frame->data_xfer_len,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China sizeof (struct mrsas_init_queue_info));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->frame_count = 1;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China /* issue the init frame in polled mode */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_init_mfi():failed to "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "init firmware"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return_mfi_app_pkt(instance, cmd);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald return_mfi_app_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return_mfi_app_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "mrsas_issue_init_mfi: Done"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mfi_state_transition_to_ready : Move the FW to READY state
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @reg_set : MFI register set
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemfi_state_transition_to_ready(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint8_t max_wait;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t fw_ctrl = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t fw_state;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t cur_state;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t cur_abs_reg_val;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t prev_abs_reg_val;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t status;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cur_abs_reg_val =
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->read_fw_status_reg(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fw_state =
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cur_abs_reg_val & MFI_STATE_MASK;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mfi_state_transition_to_ready:FW state = 0x%x", fw_state));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele while (fw_state != MFI_STATE_READY) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mfi_state_transition_to_ready:FW state%x", fw_state));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (fw_state) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_FAULT:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: FW in FAULT state!!"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENODEV);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_WAIT_HANDSHAKE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* set the CLR bit in IMR0 */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: FW waiting for HANDSHAKE"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * PCI_Hot Plug: MFI F/W requires
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * (MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * to be set
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* WR_IB_MSG_0(MFI_INIT_CLEAR_HANDSHAKE, instance); */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (!instance->tbolt && !instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_IB_DOORBELL(MFI_INIT_CLEAR_HANDSHAKE |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MFI_INIT_HOTPLUG, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_RESERVED0_REGISTER(MFI_INIT_CLEAR_HANDSHAKE |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MFI_INIT_HOTPLUG, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = (instance->tbolt == 1) ? 180 : 2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_WAIT_HANDSHAKE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_BOOT_MESSAGE_PENDING:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* set the CLR bit in IMR0 */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: FW state boot message pending"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * PCI_Hot Plug: MFI F/W requires
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * (MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * to be set
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (!instance->tbolt && !instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_IB_DOORBELL(MFI_INIT_HOTPLUG, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_RESERVED0_REGISTER(MFI_INIT_HOTPLUG,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = (instance->tbolt == 1) ? 180 : 10;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_BOOT_MESSAGE_PENDING;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_OPERATIONAL:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* bring it to READY state; assuming max wait 2 secs */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->func_ptr->disable_intr(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: FW in OPERATIONAL state"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * PCI_Hot Plug: MFI F/W requires
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * (MFI_INIT_READY | MFI_INIT_MFIMODE | MFI_INIT_ABORT)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * to be set
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* WR_IB_DOORBELL(MFI_INIT_READY, instance); */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (!instance->tbolt && !instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_IB_DOORBELL(MFI_RESET_FLAGS, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_RESERVED0_REGISTER(MFI_RESET_FLAGS,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < (10 * 1000); i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald status =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald RD_RESERVED0_REGISTER(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (status & 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald delay(1 *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald drv_usectohz(MILLISEC));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = (instance->tbolt == 1) ? 180 : 10;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_OPERATIONAL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_UNDEFINED:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* this state should not last for more than 2 seconds */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "FW state undefined"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = (instance->tbolt == 1) ? 180 : 2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_UNDEFINED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_BB_INIT:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = (instance->tbolt == 1) ? 180 : 2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_BB_INIT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_FW_INIT:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = (instance->tbolt == 1) ? 180 : 2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_FW_INIT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case MFI_STATE_FW_INIT_2:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = 180;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cur_state = MFI_STATE_FW_INIT_2;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STATE_DEVICE_SCAN:
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China max_wait = 180;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cur_state = MFI_STATE_DEVICE_SCAN;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China prev_abs_reg_val = cur_abs_reg_val;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_NONE, (CE_NOTE,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "Device scan in progress ...\n"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case MFI_STATE_FLUSH_CACHE:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald max_wait = 180;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cur_state = MFI_STATE_FLUSH_CACHE;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: Unknown state 0x%x", fw_state));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENODEV);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* the cur_state should not last for more than max_wait secs */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < (max_wait * MILLISEC); i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* fw_state = RD_OB_MSG_0(instance) & MFI_STATE_MASK; */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cur_abs_reg_val =
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->read_fw_status_reg(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China fw_state = cur_abs_reg_val & MFI_STATE_MASK;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (fw_state == cur_state) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele delay(1 * drv_usectohz(MILLISEC));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (fw_state == MFI_STATE_DEVICE_SCAN) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (prev_abs_reg_val != cur_abs_reg_val) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China continue;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* return error if fw_state hasn't changed after max_wait */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (fw_state == cur_state) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "FW state hasn't changed in %d secs", max_wait));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENODEV);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele };
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* This may also need to apply to Skinny, but for now, don't worry. */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (!instance->tbolt && !instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald fw_ctrl = RD_IB_DOORBELL(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mfi_state_transition_to_ready:FW ctrl = 0x%x", fw_ctrl));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * Write 0xF to the doorbell register to do the following.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - Abort all outstanding commands (bit 0).
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - Transition from OPERATIONAL to READY state (bit 1).
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - Discard (possible) low MFA posted in 64-bit mode (bit-2).
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * - Set to release FW to continue running (i.e. BIOS handshake
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * (bit 3).
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_IB_DOORBELL(0xF, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (EIO);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * get_seq_num
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleget_seq_num(struct mrsas_instance *instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_evt_log_info *eli)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t dcmd_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *dcmd;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China struct mrsas_evt_log_info *eli_tmp;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = get_raid_msg_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!cmd) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "failed to get a cmd");
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(seq_num_mfi_err, uint16_t,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENOMEM);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald dcmd = &cmd->frame->dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.size = sizeof (struct mrsas_evt_log_info);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &dcmd_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "get_seq_num: could not allocate data transfer buffer.");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(dcmd_dma_obj.buffer, 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_log_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_FRAME_DIR_READ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_log_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MR_DCMD_CTRL_EVENT_GET_INFO);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_log_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sync_cmd = MRSAS_TRUE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "get_seq_num: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "failed to issue MRSAS_DCMD_CTRL_EVENT_GET_INFO");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China eli_tmp = (struct mrsas_evt_log_info *)dcmd_dma_obj.buffer;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China eli->newest_seq_num = ddi_get32(cmd->frame_dma_obj.acc_handle,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China &eli_tmp->newest_seq_num);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return_raid_msg_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * start_mfi_aen
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestart_mfi_aen(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_evt_log_info eli;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele union mrsas_evt_class_locale class_locale;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* get the latest sequence number from FW */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(&eli, 0, sizeof (struct mrsas_evt_log_info));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (get_seq_num(instance, &eli)) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "start_mfi_aen: failed to get seq num");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* register AEN with FW for latest sequence number plus 1 */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele class_locale.members.reserved = 0;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China class_locale.members.locale = LE_16(MR_EVT_LOCALE_ALL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele class_locale.members.class = MR_EVT_CLASS_INFO;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China class_locale.word = LE_32(class_locale.word);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = register_mfi_aen(instance, eli.newest_seq_num + 1,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele class_locale.word);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ret) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "start_mfi_aen: aen registration failed");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * flush_cache
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleflush_cache(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *dcmd;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = get_raid_msg_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (!cmd) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China "flush_cache():Failed to get a cmd for flush_cache"));
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China DTRACE_PROBE2(flush_cache_err, uint16_t,
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return;
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China /* Clear the frame buffer and assign back the context id */
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->index);
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd = &cmd->frame->dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_FRAME_DIR_NONE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MR_DCMD_CTRL_CACHE_FLUSH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.b[0],
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "flush_cache: failed to issue MFI_DCMD_CTRL_CACHE_FLUSH"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "flush_cache done"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return_raid_msg_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * service_mfi_aen- Completes an AEN command
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @instance: Adapter soft state
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @cmd: Command to be completed
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleservice_mfi_aen(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t seq_num;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_evt_detail *evt_detail =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (struct mrsas_evt_detail *)instance->mfi_evt_detail_obj.buffer;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int tgt = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint8_t dtype;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_pd_address_t *pd_addr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_acc_handle_t acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald acc_handle = cmd->frame_dma_obj.acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->cmd_status = ddi_get8(acc_handle, &cmd->frame->io.cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd->cmd_status == ENODATA) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->cmd_status = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * log the MFI AEN event to the sysevent queue so that
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * application will get noticed
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_log_sysevent(instance->dip, DDI_VENDOR_LSI, "LSIMEGA", "SAS",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele NULL, NULL, DDI_NOSLEEP) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int instance_no = ddi_get_instance(instance->dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas%d: Failed to log AEN event", instance_no));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Check for any ld devices that has changed state. i.e. online
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * or offline.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "AEN: code = %x class = %x locale = %x args = %x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get32(acc_handle, &evt_detail->code),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele evt_detail->cl.members.class,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get16(acc_handle, &evt_detail->cl.members.locale),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get8(acc_handle, &evt_detail->arg_type)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (ddi_get32(acc_handle, &evt_detail->code)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MR_EVT_CFG_CLEARED: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (tgt = 0; tgt < MRDRV_MAX_LD; tgt++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->mr_ld_list[tgt].dip != NULL) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_ld_list[tgt].flag =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t)~MRDRV_TGT_VALID;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = mrsas_service_evt(instance, tgt, 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MRSAS_EVT_UNCONFIG_TGT, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: CFG CLEARED AEN rval = %d "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "tgt id = %d", rval, tgt));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MR_EVT_LD_DELETED: {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tgt = ddi_get16(acc_handle, &evt_detail->args.ld.target_id);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_ld_list[tgt].flag = (uint8_t)~MRDRV_TGT_VALID;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = mrsas_service_evt(instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get16(acc_handle, &evt_detail->args.ld.target_id), 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MRSAS_EVT_UNCONFIG_TGT, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: LD DELETED AEN rval = %d "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "tgt id = %d index = %d", rval,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get16(acc_handle, &evt_detail->args.ld.target_id),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get8(acc_handle, &evt_detail->args.ld.ld_index)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } /* End of MR_EVT_LD_DELETED */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MR_EVT_LD_CREATED: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = mrsas_service_evt(instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get16(acc_handle, &evt_detail->args.ld.target_id), 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MRSAS_EVT_CONFIG_TGT, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: LD CREATED AEN rval = %d "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "tgt id = %d index = %d", rval,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get16(acc_handle, &evt_detail->args.ld.target_id),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get8(acc_handle, &evt_detail->args.ld.ld_index)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } /* End of MR_EVT_LD_CREATED */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case MR_EVT_PD_REMOVED_EXT: {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pd_addr = &evt_detail->args.pd_addr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald dtype = pd_addr->scsi_dev_type;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " MR_EVT_PD_REMOVED_EXT: dtype = %x,"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " arg_type = %d ", dtype, evt_detail->arg_type));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tgt = ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[tgt].flag =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t)~MRDRV_TGT_VALID;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_service_evt(instance, ddi_get16(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald acc_handle, &evt_detail->args.pd.device_id),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 1, MRSAS_EVT_UNCONFIG_TGT, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN, "mr_sas: PD_REMOVED:"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "rval = %d tgt id = %d ", rval,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } /* End of MR_EVT_PD_REMOVED_EXT */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case MR_EVT_PD_INSERTED_EXT: {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_service_evt(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 1, MRSAS_EVT_CONFIG_TGT, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN, "mr_sas: PD_INSERTEDi_EXT:"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "rval = %d tgt id = %d ", rval,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } /* End of MR_EVT_PD_INSERTED_EXT */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case MR_EVT_PD_STATE_CHANGE: {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tgt = ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((evt_detail->args.pd_state.prevState ==
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PD_SYSTEM) &&
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (evt_detail->args.pd_state.newState != PD_SYSTEM)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->mr_tbolt_pd_list[tgt].flag =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t)~MRDRV_TGT_VALID;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_service_evt(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 1, MRSAS_EVT_UNCONFIG_TGT, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN, "mr_sas: PD_REMOVED:"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "rval = %d tgt id = %d ", rval,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((evt_detail->args.pd_state.prevState
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald == UNCONFIGURED_GOOD) &&
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (evt_detail->args.pd_state.newState == PD_SYSTEM)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_service_evt(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 1, MRSAS_EVT_CONFIG_TGT, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mr_sas: PD_INSERTED: rval = %d "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " tgt id = %d ", rval,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_get16(acc_handle,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald &evt_detail->args.pd.device_id)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } /* End of Main Switch */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* get copy of seq_num and class/locale for re-registration */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele seq_num = ddi_get32(acc_handle, &evt_detail->seq_num);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele seq_num++;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(instance->mfi_evt_detail_obj.buffer, 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_detail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &cmd->frame->dcmd.cmd_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &cmd->frame->dcmd.mbox.w[0], seq_num);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->aen_seq_num = seq_num;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->retry_count_for_ocr = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->drv_pkt_time = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Issue the aen registration frame */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->func_ptr->issue_cmd(cmd, instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * complete_cmd_in_sync_mode - Completes an internal command
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @instance: Adapter soft state
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @cmd: Command to be completed
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * The issue_cmd_in_sync_mode() function waits for a command to complete
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * after it issues a command. This function wakes up that waiting routine by
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * calling wake_up() on the wait queue.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelecomplete_cmd_in_sync_mode(struct mrsas_instance *instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->cmd_status = ddi_get8(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &cmd->frame->io.cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sync_cmd = MRSAS_FALSE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "complete_cmd_in_sync_mode called %p \n",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)cmd));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->int_cmd_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd->cmd_status == ENODATA) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd->cmd_status = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cv_broadcast(&instance->int_cmd_cv);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->int_cmd_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China/*
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * Call this function inside mrsas_softintr.
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * mrsas_initiate_ocr_if_fw_is_faulty - Initiates OCR if FW status is faulty
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * @instance: Adapter soft state
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic uint32_t
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_initiate_ocr_if_fw_is_faulty(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t cur_abs_reg_val;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t fw_state;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cur_abs_reg_val = instance->func_ptr->read_fw_status_reg(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China fw_state = cur_abs_reg_val & MFI_STATE_MASK;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (fw_state == MFI_STATE_FAULT) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->disable_online_ctrl_reset == 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_initiate_ocr_if_fw_is_faulty: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "FW in Fault state, detected in ISR: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "FW doesn't support ocr ");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (ADAPTER_RESET_NOT_REQUIRED);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mrsas_initiate_ocr_if_fw_is_faulty: FW in Fault "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "state, detected in ISR: FW supports ocr "));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (ADAPTER_RESET_REQUIRED);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (ADAPTER_RESET_NOT_REQUIRED);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mrsas_softintr - The Software ISR
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * @param arg : HBA soft state
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * called from high-level interrupt if hi-level interrupt are not there,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * otherwise triggered as a soft interrupt
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic uint_t
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_softintr(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_pkt *pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mlist_head *pos, *next;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mlist_t process_list;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_header *hdr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_arq_status *arqstat;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "mrsas_softintr() called."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ASSERT(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_enter(&instance->completed_pool_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mlist_empty(&instance->completed_pool_list)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_exit(&instance->completed_pool_mtx);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->softint_running = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele INIT_LIST_HEAD(&process_list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mlist_splice(&instance->completed_pool_list, &process_list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele INIT_LIST_HEAD(&instance->completed_pool_list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_exit(&instance->completed_pool_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* perform all callbacks first, before releasing the SCBs */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mlist_for_each_safe(pos, next, &process_list) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd = mlist_entry(pos, struct mrsas_cmd, list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* syncronize the Cmd frame for the controller */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, 0, DDI_DMA_SYNC_FORCPU);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(cmd->frame_dma_obj.dma_handle) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_WARN,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_softintr: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "FMA check reports DMA handle failure"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (DDI_INTR_CLAIMED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele hdr = &cmd->frame->hdr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* remove the internal command from the process list */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mlist_del_init(&cmd->list);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (ddi_get8(cmd->frame_dma_obj.acc_handle, &hdr->cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_PD_SCSI:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_LD_SCSI:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_LD_READ:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_LD_WRITE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * MFI_CMD_OP_PD_SCSI and MFI_CMD_OP_LD_SCSI
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * could have been issued either through an
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * IO path or an IOCTL path. If it was via IOCTL,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * we will send it to internal completion.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd->sync_cmd == MRSAS_TRUE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele complete_cmd_in_sync_mode(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* regular commands */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd = cmd->cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt = CMD2PKT(acmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_DMAVALID) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_CONSISTENT) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(acmd->cmd_dmahandle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_offset,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_SYNC_FORCPU);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_state = STATE_GOT_BUS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_GOT_TARGET | STATE_SENT_CMD
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_XFERRED_DATA | STATE_GOT_STATUS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "CDB[0] = %x completed for %s: size %lx context %x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_cdbp[0], ((acmd->islogical) ? "LD" : "PD"),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmacount, hdr->context));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE3(softintr_cdb, uint8_t, pkt->pkt_cdbp[0],
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint_t, acmd->cmd_cdblen, ulong_t,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele acmd->cmd_dmacount);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (pkt->pkt_cdbp[0] == SCMD_INQUIRY) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_inquiry *inq;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_dmacount != 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bp_mapin(acmd->cmd_buf);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele inq = (struct scsi_inquiry *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_buf->b_un.b_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald#ifdef PDSUPPORT
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (hdr->cmd_status == MFI_STAT_OK) {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald display_scsi_inquiry(
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald (caddr_t)inq);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald }
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald#else
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* don't expose physical drives to OS */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->islogical &&
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (hdr->cmd_status == MFI_STAT_OK)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele display_scsi_inquiry(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (caddr_t)inq);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else if ((hdr->cmd_status ==
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_STAT_OK) && inq->inq_dtype ==
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DTYPE_DIRECT) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele display_scsi_inquiry(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (caddr_t)inq);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* for physical disk */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele hdr->cmd_status =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_STAT_DEVICE_NOT_FOUND;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald#endif /* PDSUPPORT */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(softintr_done, uint8_t, hdr->cmd,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint8_t, hdr->cmd_status);
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (hdr->cmd_status) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_OK:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_scbp[0] = STATUS_GOOD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_LD_CC_IN_PROGRESS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_LD_RECON_IN_PROGRESS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_scbp[0] = STATUS_GOOD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_LD_INIT_IN_PROGRESS:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (CE_WARN, "Initialization in Progress"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_SCSI_DONE_WITH_ERROR:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "scsi_done error"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((struct scsi_status *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_scbp)->sts_chk = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (pkt->pkt_cdbp[0] == SCMD_TEST_UNIT_READY) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (CE_WARN, "TEST_UNIT_READY fail"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_state |= STATE_ARQ_DONE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat = (void *)(pkt->pkt_scbp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_rqpkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_rqpkt_resid = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_rqpkt_state |=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele STATE_GOT_BUS | STATE_GOT_TARGET
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_SENT_CMD
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_XFERRED_DATA;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *(uint8_t *)&arqstat->sts_rqpkt_status =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele STATUS_GOOD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_rep_get8(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &(arqstat->sts_sensedata),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sense,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sizeof (struct scsi_extended_sense),
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_DEV_AUTOINCR);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_LD_OFFLINE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_DEVICE_NOT_FOUND:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_softintr:device not found error"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_DEV_GONE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = STAT_DISCON;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_STAT_LD_LBA_OUT_OF_RANGE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_state |= STATE_ARQ_DONE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((struct scsi_status *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_scbp)->sts_chk = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat = (void *)(pkt->pkt_scbp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_rqpkt_reason = CMD_CMPLT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_rqpkt_resid = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_rqpkt_state |= STATE_GOT_BUS
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_GOT_TARGET | STATE_SENT_CMD
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele | STATE_XFERRED_DATA;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *(uint8_t *)&arqstat->sts_rqpkt_status =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele STATUS_GOOD;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_sensedata.es_valid = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_sensedata.es_key =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele KEY_ILLEGAL_REQUEST;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_sensedata.es_class =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele CLASS_EXTENDED_SENSE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * LOGICAL BLOCK ADDRESS OUT OF RANGE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * ASC: 0x21h; ASCQ: 0x00h;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_sensedata.es_add_code = 0x21;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele arqstat->sts_sensedata.es_qual_code = 0x00;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_CONT, "Unknown status!"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele atomic_add_16(&instance->fw_outstanding, (-1));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_common_check(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_dmahandle) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmahandle) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SERVICE_UNAFFECTED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Call the callback routine */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (((pkt->pkt_flags & FLAG_NOINTR) == 0) &&
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_comp) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (*pkt->pkt_comp)(pkt);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_SMP:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_STP:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele complete_cmd_in_sync_mode(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_DCMD:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* see if got an event notification */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_get32(cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &cmd->frame->dcmd.opcode) ==
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MR_DCMD_CTRL_EVENT_WAIT) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((instance->aen_cmd == cmd) &&
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (instance->aen_cmd->abort_aen)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mrsas_softintr: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "aborted_aen returned"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele atomic_add_16(&instance->fw_outstanding,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (-1));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele service_mfi_aen(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele complete_cmd_in_sync_mode(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_ABORT:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "MFI_CMD_OP_ABORT complete"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * MFI_CMD_OP_ABORT successfully completed
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * in the synchronous mode
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele complete_cmd_in_sync_mode(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd->pkt != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt = cmd->pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (((pkt->pkt_flags & FLAG_NOINTR) == 0) &&
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_comp) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_CONT, "posting to "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "scsa cmd %p index %x pkt %p"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "time %llx, default ", (void *)cmd,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->index, (void *)pkt,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China gethrtime()));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (*pkt->pkt_comp)(pkt);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "Cmd type unknown !"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->softint_running = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_INTR_CLAIMED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mrsas_alloc_dma_obj
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Allocate the memory and other resources for an dma object.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_alloc_dma_obj(struct mrsas_instance *instance, dma_obj_t *obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uchar_t endian_flags)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele size_t alen = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint_t cookie_cnt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct ddi_device_acc_attr tmp_endian_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tmp_endian_attr = endian_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tmp_endian_attr.devacc_attr_endian_flags = endian_flags;
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson tmp_endian_attr.devacc_attr_access = DDI_DEFAULT_ACC;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i = ddi_dma_alloc_handle(instance->dip, &obj->dma_attr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_SLEEP, NULL, &obj->dma_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (i != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (i) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_BADATTR :
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "Failed ddi_dma_alloc_handle- Bad attribute"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_NORESOURCES :
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "Failed ddi_dma_alloc_handle- No Resources"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default :
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "Failed ddi_dma_alloc_handle: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "unknown status %d", i));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ddi_dma_mem_alloc(obj->dma_handle, obj->size, &tmp_endian_attr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_RDWR | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &obj->buffer, &alen, &obj->acc_handle) != DDI_SUCCESS) ||
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele alen < obj->size) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_free_handle(&obj->dma_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "Failed : ddi_dma_mem_alloc"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_dma_addr_bind_handle(obj->dma_handle, NULL, obj->buffer,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele obj->size, DDI_DMA_RDWR | DDI_DMA_STREAMING, DDI_DMA_SLEEP,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele NULL, &obj->dma_cookie[0], &cookie_cnt) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_mem_free(&obj->acc_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_free_handle(&obj->dma_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "Failed : ddi_dma_addr_bind_handle"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(obj->dma_handle) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_acc_handle(obj->acc_handle) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (-1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (cookie_cnt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mrsas_free_dma_obj(struct mrsas_instance *, dma_obj_t)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * De-allocate the memory and other resources for an dma object, which must
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * have been alloated by a previous call to mrsas_alloc_dma_obj()
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_free_dma_obj(struct mrsas_instance *instance, dma_obj_t obj)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if ((obj.dma_handle == NULL) || (obj.acc_handle == NULL)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * NOTE: These check-handle functions fail if *_handle == NULL, but
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * this function succeeds because of the previous check.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(obj.dma_handle) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_acc_handle(obj.acc_handle) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_unbind_handle(obj.dma_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_mem_free(&obj.acc_handle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_free_handle(&obj.dma_handle);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald obj.acc_handle = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mrsas_dma_alloc(instance_t *, struct scsi_pkt *, struct buf *,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * int, int (*)())
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Allocate dma resources for a new scsi command
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_dma_alloc(struct mrsas_instance *instance, struct scsi_pkt *pkt,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct buf *bp, int flags, int (*callback)())
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int dma_flags;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int (*cb)(caddr_t);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_attr_t tmp_dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_buf = bp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (bp->b_flags & B_READ) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags &= ~CFLAG_DMASEND;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_flags = DDI_DMA_READ;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags |= CFLAG_DMASEND;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_flags = DDI_DMA_WRITE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (flags & PKT_CONSISTENT) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags |= CFLAG_CONSISTENT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_flags |= DDI_DMA_CONSISTENT;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (flags & PKT_DMA_PARTIAL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_flags |= DDI_DMA_PARTIAL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_flags |= DDI_DMA_REDZONE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cb = (callback == NULL_FUNC) ? DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tmp_dma_attr.dma_attr_sgllen = instance->max_num_sge;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tmp_dma_attr.dma_attr_addr_hi = 0xffffffffffffffffull;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* OCR-RESET FIX */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tmp_dma_attr.dma_attr_count_max =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (U64)mrsas_tbolt_max_cap_maxxfer; /* limit to 256K */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tmp_dma_attr.dma_attr_maxxfer =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (U64)mrsas_tbolt_max_cap_maxxfer; /* limit to 256K */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((i = ddi_dma_alloc_handle(instance->dip, &tmp_dma_attr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cb, 0, &acmd->cmd_dmahandle)) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (i) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_BADATTR:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bioerror(bp, EFAULT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_NORESOURCES:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bioerror(bp, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_PANIC, "ddi_dma_alloc_handle: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "impossible result (0x%x)", i));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bioerror(bp, EFAULT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i = ddi_dma_buf_bind_handle(acmd->cmd_dmahandle, bp, dma_flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cb, 0, &acmd->cmd_dmacookies[0], &acmd->cmd_ncookies);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (i) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_PARTIAL_MAP:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((dma_flags & DDI_DMA_PARTIAL) == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_PANIC, "ddi_dma_buf_bind_handle: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "DDI_DMA_PARTIAL_MAP impossible"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto no_dma_cookies;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_dma_numwin(acmd->cmd_dmahandle, &acmd->cmd_nwin) ==
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_FAILURE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_PANIC, "ddi_dma_numwin failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto no_dma_cookies;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_dma_getwin(acmd->cmd_dmahandle, acmd->cmd_curwin,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dma_offset, &acmd->cmd_dma_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dmacookies[0], &acmd->cmd_ncookies) ==
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_FAILURE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_PANIC, "ddi_dma_getwin failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto no_dma_cookies;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto get_dma_cookies;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_MAPPED:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_nwin = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_len = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_offset = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleget_dma_cookies:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmacount = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (;;) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmacount +=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmacookies[i++].dmac_size;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (i == instance->max_num_sge ||
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i == acmd->cmd_ncookies)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_nextcookie(acmd->cmd_dmahandle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dmacookies[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookie = i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookiecnt = i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags |= CFLAG_DMAVALID;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (bp->b_bcount >= acmd->cmd_dmacount) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_resid = bp->b_bcount - acmd->cmd_dmacount;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_resid = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_NORESOURCES:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bioerror(bp, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_NOMAPPING:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bioerror(bp, EFAULT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_TOOBIG:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bioerror(bp, EINVAL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case DDI_DMA_INUSE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_PANIC, "ddi_dma_buf_bind_handle:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " DDI_DMA_INUSE impossible"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_PANIC, "ddi_dma_buf_bind_handle: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "impossible result (0x%x)", i));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleno_dma_cookies:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_free_handle(&acmd->cmd_dmahandle);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmahandle = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_flags &= ~CFLAG_DMAVALID;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * mrsas_dma_move(struct mrsas_instance *, struct scsi_pkt *, struct buf *)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * move dma resources to next dma window
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_dma_move(struct mrsas_instance *instance, struct scsi_pkt *pkt,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct buf *bp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * If there are no more cookies remaining in this window,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * must move to the next window first.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_cookie == acmd->cmd_ncookies) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_curwin == acmd->cmd_nwin && acmd->cmd_nwin == 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* at last window, cannot move */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (++acmd->cmd_curwin >= acmd->cmd_nwin) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_dma_getwin(acmd->cmd_dmahandle, acmd->cmd_curwin,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dma_offset, &acmd->cmd_dma_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dmacookies[0], &acmd->cmd_ncookies) ==
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_FAILURE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookie = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* still more cookies in this window - get the next one */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_nextcookie(acmd->cmd_dmahandle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dmacookies[0]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* get remaining cookies in this window, up to our maximum */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (;;) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dmacount += acmd->cmd_dmacookies[i++].dmac_size;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookie++;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (i == instance->max_num_sge ||
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookie == acmd->cmd_ncookies) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_dma_nextcookie(acmd->cmd_dmahandle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &acmd->cmd_dmacookies[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookiecnt = i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (bp->b_bcount >= acmd->cmd_dmacount) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_resid = bp->b_bcount - acmd->cmd_dmacount;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pkt->pkt_resid = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * build_cmd
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic struct mrsas_cmd *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelebuild_cmd(struct mrsas_instance *instance, struct scsi_address *ap,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_pkt *pkt, uchar_t *cmd_done)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t flags = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t i;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t context;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t sge_bytes;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t tmp_data_xfer_len;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_acc_handle_t acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_sge64 *mfi_sgl;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China struct mrsas_sge_ieee *mfi_sgl_ieee;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd = PKT2CMD(pkt);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald struct mrsas_pthru_frame *pthru;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_io_frame *ldio;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* find out if this is logical or physical drive command. */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->islogical = MRDRV_IS_LOGICAL(ap);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->device_id = MAP_DEVICE_ID(instance, ap);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *cmd_done = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* get the command packet */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (!(cmd = mrsas_get_mfi_pkt(instance))) {
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(build_cmd_mfi_err, uint16_t,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acc_handle = cmd->frame_dma_obj.acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &cmd->frame->hdr.context, cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt = pkt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->cmd = acmd;
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE3(build_cmds, uint8_t, pkt->pkt_cdbp[0],
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele ulong_t, acmd->cmd_dmacount, ulong_t, acmd->cmd_dma_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* lets get the command directions */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_DMASEND) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele flags = MFI_FRAME_DIR_WRITE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_CONSISTENT) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(acmd->cmd_dmahandle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_offset, acmd->cmd_dma_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_SYNC_FORDEV);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else if (acmd->cmd_flags & ~CFLAG_DMASEND) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele flags = MFI_FRAME_DIR_READ;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_flags & CFLAG_CONSISTENT) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_dma_sync(acmd->cmd_dmahandle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_dma_offset, acmd->cmd_dma_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DMA_SYNC_FORCPU);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele flags = MFI_FRAME_DIR_NONE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China if (instance->flag_ieee) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China flags |= MFI_FRAME_IEEE;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele flags |= MFI_FRAME_SGL64;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (pkt->pkt_cdbp[0]) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * case SCMD_SYNCHRONIZE_CACHE:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * flush_cache(instance);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * mrsas_return_mfi_pkt(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * *cmd_done = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * return (NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCMD_READ:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCMD_WRITE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCMD_READ_G1:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCMD_WRITE_G1:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case SCMD_READ_G4:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case SCMD_WRITE_G4:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case SCMD_READ_G5:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald case SCMD_WRITE_G5:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->islogical) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ldio = (struct mrsas_io_frame *)cmd->frame;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * preare the Logical IO frame:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * 2nd bit is zero for all read cmds
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->cmd,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (pkt->pkt_cdbp[0] & 0x02) ? MFI_CMD_OP_LD_WRITE
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele : MFI_CMD_OP_LD_READ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->cmd_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->scsi_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->target_id, acmd->device_id);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &ldio->timeout, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->reserved_0, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &ldio->pad_0, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &ldio->flags, flags);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Initialize sense Information */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bzero(cmd->sense, SENSE_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->sense_len, SENSE_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->sense_buf_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->sense_buf_phys_addr_lo,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sense_phys_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->start_lba_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->access_byte,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (acmd->cmd_cdblen != 6) ? pkt->pkt_cdbp[1] : 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &ldio->sge_count,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd->cmd_cookiecnt);
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China if (instance->flag_ieee) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China mfi_sgl_ieee =
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China (struct mrsas_sge_ieee *)&ldio->sgl;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China } else {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China mfi_sgl = (struct mrsas_sge64 *)&ldio->sgl;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele context = ddi_get32(acc_handle, &ldio->context);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (acmd->cmd_cdblen == CDB_GROUP0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* 6-byte cdb */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->lba_count, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint16_t)(pkt->pkt_cdbp[4])));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->start_lba_lo, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[3])) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[2]) << 8) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)((pkt->pkt_cdbp[1]) & 0x1F)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele << 16)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else if (acmd->cmd_cdblen == CDB_GROUP1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* 10-byte cdb */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->lba_count, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint16_t)(pkt->pkt_cdbp[8])) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint16_t)(pkt->pkt_cdbp[7]) << 8)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->start_lba_lo, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[5])) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[4]) << 8) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[3]) << 16) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[2]) << 24)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else if (acmd->cmd_cdblen == CDB_GROUP5) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* 12-byte cdb */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->lba_count, (
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[9])) |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[8]) << 8) |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[7]) << 16) |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[6]) << 24)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->start_lba_lo, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[5])) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[4]) << 8) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[3]) << 16) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[2]) << 24)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else if (acmd->cmd_cdblen == CDB_GROUP4) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* 16-byte cdb */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->lba_count, (
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[13])) |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[12]) << 8) |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[11]) << 16) |
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ((uint32_t)(pkt->pkt_cdbp[10]) << 24)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &ldio->start_lba_lo, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[9])) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[8]) << 8) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[7]) << 16) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[6]) << 24)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_put32(acc_handle, &ldio->start_lba_hi, (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[5])) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[4]) << 8) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[3]) << 16) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((uint32_t)(pkt->pkt_cdbp[2]) << 24)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* fall through For all non-rd/wr and physical disk cmds */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (pkt->pkt_cdbp[0]) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCMD_MODE_SENSE:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case SCMD_MODE_SENSE_G1: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele union scsi_cdb *cdbp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t page_code;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cdbp = (void *)pkt->pkt_cdbp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page_code = (uint16_t)cdbp->cdb_un.sg.scsi[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (page_code) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case 0x3:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case 0x4:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_mode_sense_build(pkt);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *cmd_done = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru = (struct mrsas_pthru_frame *)cmd->frame;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* prepare the DCDB frame */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->cmd, (acmd->islogical) ?
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_CMD_OP_LD_SCSI : MFI_CMD_OP_PD_SCSI);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->cmd_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->scsi_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->target_id, acmd->device_id);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->lun, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->cdb_len, acmd->cmd_cdblen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &pthru->timeout, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &pthru->flags, flags);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tmp_data_xfer_len = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < acmd->cmd_cookiecnt; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tmp_data_xfer_len += acmd->cmd_dmacookies[i].dmac_size;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->data_xfer_len,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tmp_data_xfer_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->sge_count, acmd->cmd_cookiecnt);
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China if (instance->flag_ieee) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China mfi_sgl_ieee = (struct mrsas_sge_ieee *)&pthru->sgl;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China } else {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China mfi_sgl = (struct mrsas_sge64 *)&pthru->sgl;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bzero(cmd->sense, SENSE_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->sense_len, SENSE_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_hi, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_lo,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sense_phys_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele context = ddi_get32(acc_handle, &pthru->context);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_rep_put8(acc_handle, (uint8_t *)pkt->pkt_cdbp,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)pthru->cdb, acmd->cmd_cdblen, DDI_DEV_AUTOINCR);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef lint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele context = context;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* prepare the scatter-gather list for the firmware */
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China if (instance->flag_ieee) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China for (i = 0; i < acmd->cmd_cookiecnt; i++, mfi_sgl_ieee++) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China ddi_put64(acc_handle, &mfi_sgl_ieee->phys_addr,
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China acmd->cmd_dmacookies[i].dmac_laddress);
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China ddi_put32(acc_handle, &mfi_sgl_ieee->length,
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China acmd->cmd_dmacookies[i].dmac_size);
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China }
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China sge_bytes = sizeof (struct mrsas_sge_ieee)*acmd->cmd_cookiecnt;
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China } else {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China for (i = 0; i < acmd->cmd_cookiecnt; i++, mfi_sgl++) {
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China ddi_put64(acc_handle, &mfi_sgl->phys_addr,
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China acmd->cmd_dmacookies[i].dmac_laddress);
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China ddi_put32(acc_handle, &mfi_sgl->length,
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China acmd->cmd_dmacookies[i].dmac_size);
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China }
062f001418b7b511ab1e42bb0cb228df94bed9e7Yu Wu - Sun Microsystems - Beijing China sge_bytes = sizeof (struct mrsas_sge64)*acmd->cmd_cookiecnt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = (sge_bytes / MRMFI_FRAME_SIZE) +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ((sge_bytes % MRMFI_FRAME_SIZE) ? 1 : 0) + 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd->frame_count >= 8) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 8;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * wait_for_outstanding - Wait for all outstanding cmds
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * @instance: Adapter soft state
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald *
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * This function waits for upto MRDRV_RESET_WAIT_TIME seconds for FW to
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * complete all its outstanding commands. Returns error if one or more IOs
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * are pending after this time period.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing Chinastatic int
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing Chinawait_for_outstanding(struct mrsas_instance *instance)
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China{
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China int i;
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China uint32_t wait_time = 90;
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China for (i = 0; i < wait_time; i++) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (!instance->fw_outstanding) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China break;
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China drv_usecwait(MILLISEC); /* wait for 1000 usecs */;
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China if (instance->fw_outstanding) {
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China return (1);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China }
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China return (0);
a3db1ba6847706f55b646f53f6bceb2bf8e468e5Yu Wu - Sun Microsystems - Beijing China}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * issue_mfi_pthru
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_mfi_pthru(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd, int mode)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t kphys_addr = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t xferlen = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t new_xfer_length = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint_t model;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_acc_handle_t acc_handle = cmd->frame_dma_obj.acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t pthru_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_pthru_frame *kpthru;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_pthru_frame *pthru;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru = &cmd->frame->pthru;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kpthru = (struct mrsas_pthru_frame *)&ioctl->frame[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN, "issue_mfi_pthru: Reset flag set, "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "returning mfi_pkt and setting TRAN_BUSY\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele model = ddi_model_convert_from(mode & FMODELS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (model == DDI_MODEL_ILP32) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_pthru: DDI_MODEL_LP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kpthru->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kpthru->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef _ILP32
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_pthru: DDI_MODEL_LP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kpthru->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kpthru->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_pthru: DDI_MODEL_LP64"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kpthru->sgl.sge64[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kpthru->sgl.sge64[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* means IOCTL requires DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* pthru_dma_obj.size = xferlen; */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_GET_BOUNDARY_ALIGNED_LEN(xferlen, new_xfer_length,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PAGESIZE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pthru_dma_obj.size = new_xfer_length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate kernel buffer for DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &pthru_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_pthru: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "could not allocate data transfer buffer."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (void) memset(pthru_dma_obj.buffer, 0, xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (kpthru->flags & MFI_FRAME_DIR_WRITE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyin((uint8_t *)ubuf+i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)pthru_dma_obj.buffer+i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_pthru : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy from user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kphys_addr = pthru_dma_obj.dma_cookie[0].dmac_address;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->cmd, kpthru->cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ddi_put8(acc_handle, &pthru->sense_len, SENSE_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->cmd_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->scsi_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->target_id, kpthru->target_id);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->lun, kpthru->lun);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->cdb_len, kpthru->cdb_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &pthru->sge_count, kpthru->sge_count);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &pthru->timeout, kpthru->timeout);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->data_xfer_len, kpthru->data_xfer_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_hi, 0);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald pthru->sense_buf_phys_addr_lo = cmd->sense_phys_addr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_lo, 0); */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_rep_put8(acc_handle, (uint8_t *)kpthru->cdb, (uint8_t *)pthru->cdb,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pthru->cdb_len, DDI_DEV_AUTOINCR);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &pthru->flags, kpthru->flags & ~MFI_FRAME_SGL64);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->sgl.sge32[0].length, xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &pthru->sgl.sge32[0].phys_addr, kphys_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sync_cmd = MRSAS_TRUE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_pthru: fw_ioctl failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (xferlen && kpthru->flags & MFI_FRAME_DIR_READ) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyout(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)pthru_dma_obj.buffer+i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)ubuf+i, 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_pthru : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy to user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kpthru->cmd_status = ddi_get8(acc_handle, &pthru->cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kpthru->scsi_status = ddi_get8(acc_handle, &pthru->scsi_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "issue_mfi_pthru: cmd_status %x, "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "scsi_status %x", kpthru->cmd_status, kpthru->scsi_status));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE3(issue_pthru, uint8_t, kpthru->cmd, uint8_t,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele kpthru->cmd_status, uint8_t, kpthru->scsi_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (kpthru->sense_len) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint_t sense_len = SENSE_LENGTH;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald void *sense_ubuf =
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void *)(ulong_t)kpthru->sense_buf_phys_addr_lo;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (kpthru->sense_len <= SENSE_LENGTH) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald sense_len = kpthru->sense_len;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < sense_len; i++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (ddi_copyout(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t *)cmd->sense+i,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uint8_t *)sense_ubuf+i, 1, mode)) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "issue_mfi_pthru : "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "copy to user space failed"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Copying Sense info sense_buff[%d] = 0x%X",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald i, *((uint8_t *)cmd->sense + i)));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle, 0, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_DMA_SYNC_FORDEV);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free kernel buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, pthru_dma_obj) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * issue_mfi_dcmd
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_mfi_dcmd(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd, int mode)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t kphys_addr = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t xferlen = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t new_xfer_length = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t model;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t dcmd_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *kdcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_acc_handle_t acc_handle = cmd->frame_dma_obj.acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd = &cmd->frame->dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd = (struct mrsas_dcmd_frame *)&ioctl->frame[0];
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "Reset flag set, "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "returning mfi_pkt and setting TRAN_BUSY"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele model = ddi_model_convert_from(mode & FMODELS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (model == DDI_MODEL_ILP32) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_dcmd: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kdcmd->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef _ILP32
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_dcmd: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kdcmd->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_dcmd: DDI_MODEL_LP64"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kdcmd->sgl.sge64[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kdcmd->sgl.sge64[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* means IOCTL requires DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* dcmd_dma_obj.size = xferlen; */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_GET_BOUNDARY_ALIGNED_LEN(xferlen, new_xfer_length,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PAGESIZE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald dcmd_dma_obj.size = new_xfer_length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate kernel buffer for DMA */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (mrsas_alloc_dma_obj(instance, &dcmd_dma_obj,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_WARN, "issue_mfi_dcmd: could not "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "allocate data transfer buffer."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (void) memset(dcmd_dma_obj.buffer, 0, xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (kdcmd->flags & MFI_FRAME_DIR_WRITE) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyin((uint8_t *)ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)dcmd_dma_obj.buffer + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_dcmd : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy from user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kphys_addr = dcmd_dma_obj.dma_cookie[0].dmac_address;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &dcmd->cmd, kdcmd->cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &dcmd->cmd_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &dcmd->sge_count, kdcmd->sge_count);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &dcmd->timeout, kdcmd->timeout);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &dcmd->data_xfer_len, kdcmd->data_xfer_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &dcmd->opcode, kdcmd->opcode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_rep_put8(acc_handle, (uint8_t *)kdcmd->mbox.b,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)dcmd->mbox.b, DCMD_MBOX_SZ, DDI_DEV_AUTOINCR);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &dcmd->flags, kdcmd->flags & ~MFI_FRAME_SGL64);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &dcmd->sgl.sge32[0].length, xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &dcmd->sgl.sge32[0].phys_addr, kphys_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sync_cmd = MRSAS_TRUE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_dcmd: fw_ioctl failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (xferlen && (kdcmd->flags & MFI_FRAME_DIR_READ)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyout(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)dcmd_dma_obj.buffer + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_dcmd : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy to user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd->cmd_status = ddi_get8(acc_handle, &dcmd->cmd_status);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (CE_CONT, "issue_mfi_dcmd: cmd_status %x", kdcmd->cmd_status));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE3(issue_dcmd, uint32_t, kdcmd->opcode, uint8_t,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele kdcmd->cmd, uint8_t, kdcmd->cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free kernel buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * issue_mfi_smp
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_mfi_smp(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd, int mode)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *request_ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *response_ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t request_xferlen = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t response_xferlen = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t new_xfer_length1 = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t new_xfer_length2 = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint_t model;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t request_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t response_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_acc_handle_t acc_handle = cmd->frame_dma_obj.acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_smp_frame *ksmp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_smp_frame *smp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_sge32 *sge32;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifndef _ILP32
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_sge64 *sge64;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint64_t tmp_sas_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele smp = &cmd->frame->smp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ksmp = (struct mrsas_smp_frame *)&ioctl->frame[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN, "Reset flag set, "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "returning mfi_pkt and setting TRAN_BUSY\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele model = ddi_model_convert_from(mode & FMODELS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (model == DDI_MODEL_ILP32) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_smp: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sge32 = &ksmp->sgl[0].sge32[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_xferlen = sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_xferlen = sge32[1].length;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "response_xferlen = %x, request_xferlen = %x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_xferlen, request_xferlen));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_ubuf = (void *)(ulong_t)sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_ubuf = (void *)(ulong_t)sge32[1].phys_addr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "response_ubuf = %p, request_ubuf = %p",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_ubuf, request_ubuf));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef _ILP32
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_smp: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sge32 = &ksmp->sgl[0].sge32[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_xferlen = sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_xferlen = sge32[1].length;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "response_xferlen = %x, request_xferlen = %x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_xferlen, request_xferlen));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_ubuf = (void *)(ulong_t)sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_ubuf = (void *)(ulong_t)sge32[1].phys_addr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "response_ubuf = %p, request_ubuf = %p",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_ubuf, request_ubuf));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_smp: DDI_MODEL_LP64"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sge64 = &ksmp->sgl[0].sge64[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_xferlen = sge64[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_xferlen = sge64[1].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_ubuf = (void *)(ulong_t)sge64[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_ubuf = (void *)(ulong_t)sge64[1].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (request_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* means IOCTL requires DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* request_dma_obj.size = request_xferlen; */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_GET_BOUNDARY_ALIGNED_LEN(request_xferlen,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald new_xfer_length1, PAGESIZE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald request_dma_obj.size = new_xfer_length1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate kernel buffer for DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &request_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "could not allocate data transfer buffer."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (void) memset(request_dma_obj.buffer, 0, request_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < request_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyin((uint8_t *)request_ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)request_dma_obj.buffer + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy from user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (response_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* means IOCTL requires DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* response_dma_obj.size = response_xferlen; */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_GET_BOUNDARY_ALIGNED_LEN(response_xferlen,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald new_xfer_length2, PAGESIZE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald response_dma_obj.size = new_xfer_length2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate kernel buffer for DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &response_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "could not allocate data transfer buffer."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (void) memset(response_dma_obj.buffer, 0, response_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < response_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyin((uint8_t *)response_ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)response_dma_obj.buffer + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy from user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &smp->cmd, ksmp->cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &smp->cmd_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &smp->connection_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &smp->sge_count, ksmp->sge_count);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* smp->context = ksmp->context; */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &smp->timeout, ksmp->timeout);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &smp->data_xfer_len, ksmp->data_xfer_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bcopy((void *)&ksmp->sas_addr, (void *)&tmp_sas_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (uint64_t));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put64(acc_handle, &smp->sas_addr, tmp_sas_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &smp->flags, ksmp->flags & ~MFI_FRAME_SGL64);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele model = ddi_model_convert_from(mode & FMODELS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (model == DDI_MODEL_ILP32) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "issue_mfi_smp: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sge32 = &smp->sgl[0].sge32[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[0].length, response_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[1].length, request_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[1].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef _ILP32
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "issue_mfi_smp: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sge32 = &smp->sgl[0].sge32[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[0].length, response_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[1].length, request_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge32[1].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_smp: DDI_MODEL_LP64"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sge64 = &smp->sgl[0].sge64[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge64[0].length, response_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put64(acc_handle, &sge64[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele response_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &sge64[1].length, request_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put64(acc_handle, &sge64[1].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele request_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_smp : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "smp->response_xferlen = %d, smp->request_xferlen = %d "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "smp->data_xfer_len = %d", ddi_get32(acc_handle, &sge32[0].length),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get32(acc_handle, &sge32[1].length),
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get32(acc_handle, &smp->data_xfer_len)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sync_cmd = MRSAS_TRUE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_smp: fw_ioctl failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_smp: copy to user space"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (request_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < request_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyout(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)request_dma_obj.buffer +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i, (uint8_t *)request_ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_smp : copy to user space"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (response_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < response_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyout(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)response_dma_obj.buffer
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele + i, (uint8_t *)response_ubuf
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele + i, 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_smp : copy to "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ksmp->cmd_status = ddi_get8(acc_handle, &smp->cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: smp->cmd_status = %d",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald ksmp->cmd_status));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(issue_smp, uint8_t, ksmp->cmd, uint8_t, ksmp->cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (request_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free kernel buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, request_dma_obj) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (response_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free kernel buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, response_dma_obj) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * issue_mfi_stp
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_mfi_stp(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd, int mode)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *fis_ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *data_ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t fis_xferlen = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t new_xfer_length1 = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint32_t new_xfer_length2 = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t data_xferlen = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint_t model;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t fis_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dma_obj_t data_dma_obj;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_stp_frame *kstp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_stp_frame *stp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_acc_handle_t acc_handle = cmd->frame_dma_obj.acc_handle;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele stp = &cmd->frame->stp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kstp = (struct mrsas_stp_frame *)&ioctl->frame[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN, "Reset flag set, "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "returning mfi_pkt and setting TRAN_BUSY\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele model = ddi_model_convert_from(mode & FMODELS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (model == DDI_MODEL_ILP32) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_stp: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_xferlen = kstp->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_xferlen = kstp->sgl.sge32[1].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_ubuf = (void *)(ulong_t)kstp->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_ubuf = (void *)(ulong_t)kstp->sgl.sge32[1].phys_addr;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef _ILP32
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_stp: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_xferlen = kstp->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_xferlen = kstp->sgl.sge32[1].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_ubuf = (void *)(ulong_t)kstp->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_ubuf = (void *)(ulong_t)kstp->sgl.sge32[1].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "issue_mfi_stp: DDI_MODEL_LP64"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_xferlen = kstp->sgl.sge64[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_xferlen = kstp->sgl.sge64[1].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_ubuf = (void *)(ulong_t)kstp->sgl.sge64[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_ubuf = (void *)(ulong_t)kstp->sgl.sge64[1].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (fis_xferlen) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "issue_mfi_stp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "fis_ubuf = %p fis_xferlen = %x", fis_ubuf, fis_xferlen));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* means IOCTL requires DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* fis_dma_obj.size = fis_xferlen; */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_GET_BOUNDARY_ALIGNED_LEN(fis_xferlen,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald new_xfer_length1, PAGESIZE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald fis_dma_obj.size = new_xfer_length1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate kernel buffer for DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &fis_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_stp : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "could not allocate data transfer buffer."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (void) memset(fis_dma_obj.buffer, 0, fis_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < fis_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyin((uint8_t *)fis_ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)fis_dma_obj.buffer + i, 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy from user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (data_xferlen) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_CONT, "issue_mfi_stp: data_ubuf = %p "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "data_xferlen = %x", data_ubuf, data_xferlen));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* means IOCTL requires DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* allocate the data transfer buffer */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* data_dma_obj.size = data_xferlen; */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_GET_BOUNDARY_ALIGNED_LEN(data_xferlen, new_xfer_length2,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald PAGESIZE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald data_dma_obj.size = new_xfer_length2;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_dma_obj.dma_attr = mrsas_generic_dma_attr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_dma_obj.dma_attr.dma_attr_sgllen = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_dma_obj.dma_attr.dma_attr_align = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* allocate kernel buffer for DMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_alloc_dma_obj(instance, &data_dma_obj,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "could not allocate data transfer buffer."));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China (void) memset(data_dma_obj.buffer, 0, data_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < data_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyin((uint8_t *)data_ubuf + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)data_dma_obj.buffer + i, 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "copy from user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &stp->cmd, kstp->cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &stp->cmd_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &stp->connection_status, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &stp->target_id, kstp->target_id);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(acc_handle, &stp->sge_count, kstp->sge_count);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &stp->timeout, kstp->timeout);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &stp->data_xfer_len, kstp->data_xfer_len);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_rep_put8(acc_handle, (uint8_t *)kstp->fis, (uint8_t *)stp->fis, 10,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_DEV_AUTOINCR);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(acc_handle, &stp->flags, kstp->flags & ~MFI_FRAME_SGL64);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &stp->stp_flags, kstp->stp_flags);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &stp->sgl.sge32[0].length, fis_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &stp->sgl.sge32[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fis_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &stp->sgl.sge32[1].length, data_xferlen);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(acc_handle, &stp->sgl.sge32[1].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele data_dma_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->sync_cmd = MRSAS_TRUE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: fw_ioctl failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (fis_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < fis_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyout(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)fis_dma_obj.buffer + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)fis_ubuf + i, 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_stp : copy to "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (data_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < data_xferlen; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_copyout(
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)data_dma_obj.buffer + i,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uint8_t *)data_ubuf + i, 1, mode)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "issue_mfi_stp : copy to"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " user space failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kstp->cmd_status = ddi_get8(acc_handle, &stp->cmd_status);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "issue_mfi_stp: stp->cmd_status = %d",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kstp->cmd_status));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(issue_stp, uint8_t, kstp->cmd, uint8_t, kstp->cmd_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (fis_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free kernel buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, fis_dma_obj) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (data_xferlen) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* free kernel buffer */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_free_dma_obj(instance, data_dma_obj) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * fill_up_drv_ver
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelefill_up_drv_ver(struct mrsas_drv_ver *dv)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(dv, 0, sizeof (struct mrsas_drv_ver));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memcpy(dv->signature, "$LSI LOGIC$", strlen("$LSI LOGIC$"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memcpy(dv->os_name, "Solaris", strlen("Solaris"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memcpy(dv->drv_name, "mr_sas", strlen("mr_sas"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memcpy(dv->drv_ver, MRSAS_VERSION, strlen(MRSAS_VERSION));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memcpy(dv->drv_rel_date, MRSAS_RELDATE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele strlen(MRSAS_RELDATE));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * handle_drv_ioctl
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelehandle_drv_ioctl(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int mode)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int *props = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele void *ubuf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint8_t *pci_conf_buf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t xferlen;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t num_props;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint_t model;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *kdcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_drv_ver dv;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_pci_information pi;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd = (struct mrsas_dcmd_frame *)&ioctl->frame[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele model = ddi_model_convert_from(mode & FMODELS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (model == DDI_MODEL_ILP32) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "handle_drv_ioctl: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kdcmd->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef _ILP32
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "handle_drv_ioctl: DDI_MODEL_ILP32"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kdcmd->sgl.sge32[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "handle_drv_ioctl: DDI_MODEL_LP64"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele xferlen = kdcmd->sgl.sge64[0].length;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ubuf = (void *)(ulong_t)kdcmd->sgl.sge64[0].phys_addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "handle_drv_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "dataBuf=%p size=%d bytes", ubuf, xferlen));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (kdcmd->opcode) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MRSAS_DRIVER_IOCTL_DRIVER_VERSION:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "handle_drv_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "MRSAS_DRIVER_IOCTL_DRIVER_VERSION"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele fill_up_drv_ver(&dv);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ddi_copyout(&dv, ubuf, xferlen, mode)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "MRSAS_DRIVER_IOCTL_DRIVER_VERSION : "
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "copy to user space failed"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China kdcmd->cmd_status = 1;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China rval = 1;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd->cmd_status = 0;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MRSAS_DRIVER_IOCTL_PCI_INFORMATION:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "handle_drv_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "MRSAS_DRIVER_IOCTL_PCI_INFORMAITON"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, instance->dip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, "reg", &props, &num_props)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "MRSAS_DRIVER_IOCTL_PCI_INFORMATION : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "ddi_prop_look_int_array failed"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pi.busNumber = (props[0] >> 16) & 0xFF;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pi.deviceNumber = (props[0] >> 11) & 0x1f;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pi.functionNumber = (props[0] >> 8) & 0x7;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_prop_free((void *)props);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_conf_buf = (uint8_t *)&pi.pciHeaderInfo;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < (sizeof (struct mrsas_pci_information) -
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele offsetof(struct mrsas_pci_information, pciHeaderInfo));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_conf_buf[i] =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_config_get8(instance->pci_handle, i);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ddi_copyout(&pi, ubuf, xferlen, mode)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "MRSAS_DRIVER_IOCTL_PCI_INFORMATION : "
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China "copy to user space failed"));
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China kdcmd->cmd_status = 1;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China rval = 1;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd->cmd_status = 0;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "invalid driver specific IOCTL opcode = 0x%x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd->opcode));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kdcmd->cmd_status = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * handle_mfi_ioctl
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelehandle_mfi_ioctl(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int mode)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_header *hdr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = get_raid_msg_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!cmd) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mr_sas: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "failed to get a cmd packet"));
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(mfi_ioctl_err, uint16_t,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele hdr = (struct mrsas_header *)&ioctl->frame[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China switch (ddi_get8(cmd->frame_dma_obj.acc_handle, &hdr->cmd)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_DCMD:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = issue_mfi_dcmd(instance, ioctl, cmd, mode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_SMP:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = issue_mfi_smp(instance, ioctl, cmd, mode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_STP:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = issue_mfi_stp(instance, ioctl, cmd, mode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_LD_SCSI:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MFI_CMD_OP_PD_SCSI:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = issue_mfi_pthru(instance, ioctl, cmd, mode);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "handle_mfi_ioctl: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "invalid mfi ioctl hdr->cmd = %d", hdr->cmd));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_common_check(instance, cmd) != DDI_SUCCESS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = DDI_FAILURE;
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return_raid_msg_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald mrsas_return_mfi_pkt(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * AEN
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelehandle_mfi_aen(struct mrsas_instance *instance, struct mrsas_aen *aen)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = register_mfi_aen(instance, instance->aen_seq_num,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele aen->class_locale_word);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele aen->cmd_status = (uint8_t)rval;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleregister_mfi_aen(struct mrsas_instance *instance, uint32_t seq_num,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t class_locale_word)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret_val;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd, *aen_cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_dcmd_frame *dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele union mrsas_evt_class_locale curr_aen;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele union mrsas_evt_class_locale prev_aen;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * If there an AEN pending already (aen_cmd), check if the
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * class_locale of that pending AEN is inclusive of the new
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * AEN request we currently have. If it is, then we don't have
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * to do anything. In other words, whichever events the current
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * AEN request is subscribing to, have already been subscribed
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * to.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * If the old_cmd is _not_ inclusive, then we have to abort
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * that command, form a class_locale that is superset of both
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * old and current and re-issue to the FW
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China curr_aen.word = LE_32(class_locale_word);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China curr_aen.members.locale = LE_16(curr_aen.members.locale);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele aen_cmd = instance->aen_cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (aen_cmd) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele prev_aen.word = ddi_get32(aen_cmd->frame_dma_obj.acc_handle,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &aen_cmd->frame->dcmd.mbox.w[1]);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China prev_aen.word = LE_32(prev_aen.word);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China prev_aen.members.locale = LE_16(prev_aen.members.locale);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * A class whose enum value is smaller is inclusive of all
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * higher values. If a PROGRESS (= -1) was previously
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * registered, then a new registration requests for higher
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * classes need not be sent to FW. They are automatically
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * included.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Locale numbers don't have such hierarchy. They are bitmap
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * values
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((prev_aen.members.class <= curr_aen.members.class) &&
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele !((prev_aen.members.locale & curr_aen.members.locale) ^
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele curr_aen.members.locale)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Previously issued event registration includes
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * current request. Nothing to do.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele curr_aen.members.locale |= prev_aen.members.locale;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (prev_aen.members.class < curr_aen.members.class)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele curr_aen.members.class = prev_aen.members.class;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret_val = abort_aen_cmd(instance, aen_cmd);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ret_val) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "register_mfi_aen: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "failed to abort prevous AEN command"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret_val);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China curr_aen.word = LE_32(class_locale_word);
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China curr_aen.members.locale = LE_16(curr_aen.members.locale);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald cmd = get_raid_msg_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald cmd = mrsas_get_mfi_pkt(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele if (!cmd) {
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE2(mfi_aen_err, uint16_t, instance->fw_outstanding,
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele uint16_t, instance->max_fw_cmds);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENOMEM);
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Clear the frame buffer and assign back the context id */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->index);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dcmd = &cmd->frame->dcmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* for(i = 0; i < DCMD_MBOX_SZ; i++) dcmd->mbox.b[i] = 0; */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) memset(instance->mfi_evt_detail_obj.buffer, 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_detail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Prepare DCMD for aen registration */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0x0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_FRAME_DIR_READ);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_detail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MR_DCMD_CTRL_EVENT_WAIT);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.w[0], seq_num);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China curr_aen.members.locale = LE_16(curr_aen.members.locale);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China curr_aen.word = LE_32(curr_aen.word);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.w[1],
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele curr_aen.word);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->mfi_evt_detail_obj.dma_cookie[0].dmac_address);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sizeof (struct mrsas_evt_detail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->aen_seq_num = seq_num;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Store reference to the cmd used to register for AEN. When an
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * application wants us to register for AEN, we have to abort this
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * cmd and re-register with a new EVENT LOCALE supplied by that app
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->aen_cmd = cmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->frame_count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Issue the aen registration frame */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* atomic_add_16 (&instance->fw_outstanding, 1); */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mr_sas_tbolt_build_mfi_cmd(instance, cmd);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->func_ptr->issue_cmd(cmd, instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldvoid
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeledisplay_scsi_inquiry(caddr_t scsi_inq)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#define MAX_SCSI_DEVICE_CODE 14
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char inquiry_buf[256] = {0};
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int len;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele const char *const scsi_device_types[] = {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Direct-Access ",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "Sequential-Access",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Printer ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Processor ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "WORM ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "CD-ROM ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Scanner ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Optical Device ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Medium Changer ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Communications ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Unknown ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Unknown ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Unknown ",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Enclosure ",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele };
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald len += snprintf(inquiry_buf + len, 265 - len, " Vendor: ");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 8; i < 16; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len, "%c",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_inq[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald len += snprintf(inquiry_buf + len, 265 - len, " Model: ");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 16; i < 32; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len, "%c",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_inq[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald len += snprintf(inquiry_buf + len, 265 - len, " Rev: ");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 32; i < 36; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len, "%c",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_inq[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len, "\n");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i = scsi_inq[0] & 0x1f;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald len += snprintf(inquiry_buf + len, 265 - len, " Type: %s ",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] :
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Unknown ");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald " ANSI SCSI revision: %02x", scsi_inq[2] & 0x07);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len, " CCS\n");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele len += snprintf(inquiry_buf + len, 265 - len, "\n");
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL2, (CE_CONT, inquiry_buf));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic void
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinaio_timeout_checker(void *arg)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_instance *instance = arg;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_cmd *cmd = NULL;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mrsas_header *hdr;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China int time = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China int counter = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct mlist_head *pos, *next;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_t process_list;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress == 1) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "io_timeout_checker:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China " reset in progress"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->timeout_id = timeout(io_timeout_checker,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *) instance, drv_usectohz(MRSAS_1_SECOND));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China /* See if this check needs to be in the beginning or last in ISR */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (mrsas_initiate_ocr_if_fw_is_faulty(instance) == 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "io_timeout_checker: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "FW Fault, calling reset adapter");
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_CONT, "io_timeout_checker: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "fw_outstanding 0x%X max_fw_cmds 0x%X",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->fw_outstanding, instance->max_fw_cmds);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->adapterresetinprogress = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_tbolt_reset_ppc(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_reset_ppc(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->adapterresetinprogress = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->timeout_id = timeout(io_timeout_checker,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *) instance, drv_usectohz(MRSAS_1_SECOND));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China INIT_LIST_HEAD(&process_list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mlist_for_each_safe(pos, next, &instance->cmd_pend_list) {
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd = mlist_entry(pos, struct mrsas_cmd, list);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (cmd == NULL) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China continue;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (cmd->sync_cmd == MRSAS_TRUE) {
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China hdr = (struct mrsas_header *)&cmd->frame->hdr;
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (hdr == NULL) {
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China continue;
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China }
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China time = --cmd->drv_pkt_time;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt == NULL) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China continue;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China time = --cmd->drv_pkt_time;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (time <= 0) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "%llx: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "io_timeout_checker: TIMING OUT: pkt: %p, "
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "cmd %p fw_outstanding 0x%X max_fw_cmds 0x%X",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald gethrtime(), (void *)pkt, (void *)cmd,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->fw_outstanding, instance->max_fw_cmds);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China counter++;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China break;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->cmd_pend_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (counter) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->disable_online_ctrl_reset == 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "%s(): OCR is NOT "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "supported by Firmware, KILL adapter!!!",
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman __func__);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_tbolt_kill_adapter(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_kill_adapter(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China return;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd->retry_count_for_ocr <= IO_RETRY_COUNT) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_tbolt_reset_ppc(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_reset_ppc(
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "io_timeout_checker: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "cmd %p cmd->index %d "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "timed out even after 3 resets: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "so KILL adapter", (void *)cmd, cmd->index);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_print_cmd_details(instance, cmd, 0xDD);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->tbolt)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_tbolt_kill_adapter(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald else
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_kill_adapter(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "mrsas: "
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China "schedule next timeout check: "
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China "do timeout \n"));
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China instance->timeout_id =
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China timeout(io_timeout_checker, (void *)instance,
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China drv_usectohz(MRSAS_1_SECOND));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldstatic uint32_t
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleread_fw_status_reg_ppc(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return ((uint32_t)RD_OB_SCRATCH_PAD_0(instance));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_cmd_ppc(struct mrsas_cmd *cmd, struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China struct scsi_pkt *pkt;
1a5e258f5471356ca102c7176637cdce45bac147Josef 'Jeff' Sipek atomic_inc_16(&instance->fw_outstanding);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China pkt = cmd->pkt;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (pkt) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "%llx : issue_cmd_ppc:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "ISSUED CMD TO FW : called : cmd:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ": %p instance : %p pkt : %p pkt_time : %x\n",
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China gethrtime(), (void *)cmd, (void *)instance,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void *)pkt, cmd->drv_pkt_time));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "Reset the scsi_pkt timer"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China push_pending_mfi_pkt(instance, cmd);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "%llx : issue_cmd_ppc:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "ISSUED CMD TO FW : called : cmd : %p, instance: %p"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "(NO PKT)\n", gethrtime(), (void *)cmd, (void *)instance));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->reg_write_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Issue the command to the FW */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_PICK_QPORT((cmd->frame_phys_addr) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (((cmd->frame_count - 1) << 1) | 1), instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->reg_write_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * issue_cmd_in_sync_mode
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_cmd_in_sync_mode_ppc(struct mrsas_instance *instance,
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald struct mrsas_cmd *cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China int i;
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald uint32_t msecs = MFI_POLL_TIMEOUT_SECS * MILLISEC;
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China struct mrsas_header *hdr = &cmd->frame->hdr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_sync_mode_ppc: called"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->adapterresetinprogress) {
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = ddi_get16(
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->frame_dma_obj.acc_handle, &hdr->timeout);
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China if (cmd->drv_pkt_time < debug_timeout_g)
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "sync_mode_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "issue and return in reset case\n"));
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_PICK_QPORT((cmd->frame_phys_addr) |
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (((cmd->frame_count - 1) << 1) | 1), instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "sync_mode_ppc: pushing the pkt\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China push_pending_mfi_pkt(instance, cmd);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->cmd_status = ENODATA;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->reg_write_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Issue the command to the FW */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_PICK_QPORT((cmd->frame_phys_addr) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (((cmd->frame_count - 1) << 1) | 1), instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->reg_write_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_enter(&instance->int_cmd_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < msecs && (cmd->cmd_status == ENODATA); i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mutex_exit(&instance->int_cmd_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_sync_mode_ppc: done"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (i < (msecs -1)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * issue_cmd_in_poll_mode
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleissue_cmd_in_poll_mode_ppc(struct mrsas_instance *instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_cmd *cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint16_t flags;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t msecs = MFI_POLL_TIMEOUT_SECS * MILLISEC;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_header *frame_hdr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_poll_mode_ppc: called"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele frame_hdr = (struct mrsas_header *)cmd->frame;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MFI_CMD_STATUS_POLL_MODE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele flags = ddi_get16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald flags |= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_put16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags, flags);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* issue the frame using inbound queue port */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_IB_PICK_QPORT((cmd->frame_phys_addr) |
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (((cmd->frame_count - 1) << 1) | 1), instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* wait for cmd_status to change from 0xFF */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < msecs && (
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele == MFI_CMD_STATUS_POLL_MODE); i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele drv_usecwait(MILLISEC); /* wait for 1000 usecs */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_get8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele == MFI_CMD_STATUS_POLL_MODE) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "issue_cmd_in_poll_mode: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "cmd polling timed out"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleenable_intr_ppc(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t mask;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "enable_intr_ppc: called"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->skinny) {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* For SKINNY, write ~0x1, from BSD's mfi driver. */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_OB_INTR_MASK(0xfffffffe, instance);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* WR_OB_DOORBELL_CLEAR(0xFFFFFFFF, instance); */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_OB_DOORBELL_CLEAR(OB_DOORBELL_CLEAR_MASK, instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* WR_OB_INTR_MASK(~0x80000000, instance); */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_OB_INTR_MASK(~(MFI_REPLY_2108_MESSAGE_INTR_MASK), instance);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* dummy read to force PCI flush */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mask = RD_OB_INTR_MASK(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "enable_intr_ppc: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "outbound_intr_mask = 0x%x", mask));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeledisable_intr_ppc(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t mask;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "disable_intr_ppc: called"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "disable_intr_ppc: before : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "outbound_intr_mask = 0x%x", RD_OB_INTR_MASK(instance)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /* For now, assume there are no extras needed for Skinny support. */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele WR_OB_INTR_MASK(OB_INTR_MASK, instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "disable_intr_ppc: after : "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "outbound_intr_mask = 0x%x", RD_OB_INTR_MASK(instance)));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* dummy read to force PCI flush */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mask = RD_OB_INTR_MASK(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#ifdef lint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mask = mask;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleintr_ack_ppc(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint32_t status;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China int ret = DDI_INTR_CLAIMED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "intr_ack_ppc: called"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* check if it is our interrupt */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele status = RD_OB_INTR_STATUS(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "intr_ack_ppc: status = 0x%x", status));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /*
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * NOTE: Some drivers call out SKINNY here, but the return is the same
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * for SKINNY and 2108.
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (!(status & MFI_REPLY_2108_MESSAGE_INTR)) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China ret = DDI_INTR_UNCLAIMED;
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China }
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
8a64454cbf6b324db5da2fd42da7dcefe66bcc8aYu Wu - Sun Microsystems - Beijing China ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China ret = DDI_INTR_UNCLAIMED;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China if (ret == DDI_INTR_UNCLAIMED) {
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (ret);
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China }
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald /*
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * Clear the interrupt by writing back the same value.
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald * Another case where SKINNY is slightly different.
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->skinny) {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_OB_INTR_STATUS(status, instance);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald } else {
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald WR_OB_DOORBELL_CLEAR(status, instance);
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* dummy READ */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele status = RD_OB_INTR_STATUS(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "intr_ack_ppc: interrupt cleared"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
34841cc2abc43146ada78560d5f179be666acbdaYu Wu - Sun Microsystems - Beijing China return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China/*
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * Marks HBA as bad. This will be called either when an
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * IO packet times out even after 3 FW resets
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China * or FW is found to be fault even after 3 continuous resets.
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic int
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_kill_adapter(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->deadadapter == 1)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_NOTE, "mrsas_kill_adapter: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Writing to doorbell with MFI_STOP_ADP "));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->ocr_flags_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->deadadapter = 1;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->ocr_flags_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->func_ptr->disable_intr(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald WR_IB_DOORBELL(MFI_STOP_ADP, instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_complete_pending_cmds(instance);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinastatic int
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinamrsas_reset_ppc(struct mrsas_instance *instance)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China{
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t status;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t retry = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t cur_abs_reg_val;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China uint32_t fw_state;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->deadadapter == 1) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "mrsas_reset_ppc: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "no more resets as HBA has been marked dead ");
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->ocr_flags_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->adapterresetinprogress = 1;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->ocr_flags_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: adpterresetinprogress "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "flag set, time %llx", gethrtime()));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->disable_intr(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing Chinaretry_reset:
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_WRITE_SEQ(0, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_WRITE_SEQ(4, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_WRITE_SEQ(0xb, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_WRITE_SEQ(2, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_WRITE_SEQ(7, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_WRITE_SEQ(0xd, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: magic number written "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "to write sequence register\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China delay(100 * drv_usectohz(MILLISEC));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China status = RD_OB_DRWE(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China while (!(status & DIAG_WRITE_ENABLE)) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China delay(100 * drv_usectohz(MILLISEC));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China status = RD_OB_DRWE(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (retry++ == 100) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "mrsas_reset_ppc: DRWE bit "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "check retry count %d", retry);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China WR_IB_DRWE(status | DIAG_RESET_ADAPTER, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China delay(100 * drv_usectohz(MILLISEC));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China status = RD_OB_DRWE(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China while (status & DIAG_RESET_ADAPTER) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China delay(100 * drv_usectohz(MILLISEC));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China status = RD_OB_DRWE(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (retry++ == 100) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN, "mrsas_reset_ppc: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "RESET FAILED. KILL adapter called.");
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) mrsas_kill_adapter(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN, (CE_NOTE, "mrsas_reset_ppc: Adapter reset complete"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "Calling mfi_state_transition_to_ready"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China /* Mark HBA as bad, if FW is fault after 3 continuous resets */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (mfi_state_transition_to_ready(instance) ||
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China debug_fw_faults_after_ocr_g == 1) {
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China cur_abs_reg_val =
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->read_fw_status_reg(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China fw_state = cur_abs_reg_val & MFI_STATE_MASK;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China#ifdef OCRDEBUG
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_reset_ppc :before fake: FW is not ready "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "FW state = 0x%x", fw_state));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (debug_fw_faults_after_ocr_g == 1)
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China fw_state = MFI_STATE_FAULT;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China#endif
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc : FW is not ready "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "FW state = 0x%x", fw_state));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (fw_state == MFI_STATE_FAULT) {
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China /* increment the count */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->fw_fault_count_after_ocr++;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China if (instance->fw_fault_count_after_ocr
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China < MAX_FW_RESET_COUNT) {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "mrsas_reset_ppc: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "FW is in fault after OCR count %d "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Retry Reset",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->fw_fault_count_after_ocr);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China goto retry_reset;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China } else {
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman dev_err(instance->dip, CE_WARN,
ff38cf9dace20854665175f403992f83312463cfAndy Fiddaman "mrsas_reset_ppc: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Max Reset Count exceeded >%d"
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "Mark HBA as bad, KILL adapter",
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MAX_FW_RESET_COUNT);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) mrsas_kill_adapter(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_FAILURE);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China }
b1385420941f689de1d9c1c64d8c6b19b63b5b3eYu Wu - Sun Microsystems - Beijing China /* reset the counter as FW is up after OCR */
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->fw_fault_count_after_ocr = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->producer, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->consumer, 0);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China " after resetting produconsumer chck indexs:"
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "producer %x consumer %x", *instance->producer,
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China *instance->consumer));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "Calling mrsas_issue_init_mfi"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) mrsas_issue_init_mfi(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_issue_init_mfi Done"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "Calling mrsas_print_pending_cmd\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) mrsas_print_pending_cmds(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "mrsas_print_pending_cmd done\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->enable_intr(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->fw_outstanding = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "Calling mrsas_issue_pending_cmds"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China (void) mrsas_issue_pending_cmds(instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "issue_pending_cmds done.\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "Calling aen registration"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->aen_cmd->retry_count_for_ocr = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->aen_cmd->drv_pkt_time = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->func_ptr->issue_cmd(instance->aen_cmd, instance);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "Unsetting adpresetinprogress flag.\n"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_enter(&instance->ocr_flags_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China instance->adapterresetinprogress = 0;
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China mutex_exit(&instance->ocr_flags_mtx);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China "adpterresetinprogress flag unset"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc done\n"));
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China return (DDI_SUCCESS);
e73d18e59abe66105dc3054aa06c28c83862c1ddYu Wu - Sun Microsystems - Beijing China}
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald/*
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald * FMA functions.
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_common_check(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ret = DDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd != NULL &&
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrsas_check_dma_handle(cmd->frame_dma_obj.dma_handle) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (cmd->pkt != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd != NULL && cmd->pkt != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_dma_handle(instance->mfi_evt_detail_obj.dma_handle) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd != NULL && cmd->pkt != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_acc_err_clear(instance->regmap_handle, DDI_FME_VER0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (cmd != NULL && cmd->pkt != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_reason = CMD_TRAN_ERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cmd->pkt->pkt_statistics = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = DDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ret);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * as the driver can always deal with an error in any dma or
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * access handle, we can just return the fme_status value.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_ereport_post(dip, err, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (err->fme_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_fm_init(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Need to change iblock to priority for new MSI intr */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_iblock_cookie_t fm_ibc;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Only register with IO Fault Services if we have some capability */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->fm_capabilities) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Adjust access and dma attributes for FMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele endian_attr.devacc_attr_access = DDI_FLAGERR_ACC;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_generic_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Register capabilities with IO Fault Services.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * fm_capabilities will be updated to indicate
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * capabilities actually supported (not requested.)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_init(instance->dip, &instance->fm_capabilities, &fm_ibc);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Initialize pci ereport capabilities if ereport
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * capable (should always be.)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (DDI_FM_EREPORT_CAP(instance->fm_capabilities) ||
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_ereport_setup(instance->dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Register error callback if error callback capable.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_handler_register(instance->dip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_fm_error_cb, (void*) instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele endian_attr.devacc_attr_access = DDI_DEFAULT_ACC;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_generic_dma_attr.dma_attr_flags = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_fm_fini(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Only unregister FMA capabilities if registered */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->fm_capabilities) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Un-register error callback if error callback capable.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_handler_unregister(instance->dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Release any resources allocated by pci_ereport_setup()
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (DDI_FM_EREPORT_CAP(instance->fm_capabilities) ||
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pci_ereport_teardown(instance->dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Unregister from IO Fault Services */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_fini(instance->dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Adjust access and dma attributes for FMA */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele endian_attr.devacc_attr_access = DDI_DEFAULT_ACC;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrsas_generic_dma_attr.dma_attr_flags = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_check_acc_handle(ddi_acc_handle_t handle)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_error_t de;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (handle == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (de.fme_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufeleint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_check_dma_handle(ddi_dma_handle_t handle)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_error_t de;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (handle == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (de.fme_status);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelevoid
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_fm_ereport(struct mrsas_instance *instance, char *detail)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint64_t ena;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char buf[FM_MAX_CLASS];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ena = fm_ena_generate(0, FM_ENA_FMT1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (DDI_FM_EREPORT_CAP(instance->fm_capabilities)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_fm_ereport_post(instance->dip, buf, ena, DDI_NOSLEEP,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERSION, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_add_intrs(struct mrsas_instance *instance, int intr_type)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dev_info_t *dip = instance->dip;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int avail, actual, count;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i, flag, ret;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_add_intrs: intr_type = %x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele intr_type));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Get number of interrupts */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = ddi_intr_get_nintrs(dip, intr_type, &count);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ret != DDI_SUCCESS) || (count == 0)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "ddi_intr_get_nintrs() failed:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "ret %d count %d", ret, count));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_add_intrs: count = %d ", count));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Get number of available interrupts */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = ddi_intr_get_navail(dip, intr_type, &avail);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ret != DDI_SUCCESS) || (avail == 0)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "ddi_intr_get_navail() failed:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "ret %d avail %d", ret, avail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_add_intrs: avail = %d ", avail));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Only one interrupt routine. So limit the count to 1 */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (count > 1) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele count = 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Allocate an array of interrupt handlers. Currently we support
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * only one interrupt. The framework can be extended later.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_htable_size = count * sizeof (ddi_intr_handle_t);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_htable = kmem_zalloc(instance->intr_htable_size,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald KM_SLEEP);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ASSERT(instance->intr_htable);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald flag = ((intr_type == DDI_INTR_TYPE_MSI) ||
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (intr_type == DDI_INTR_TYPE_MSIX)) ?
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald DDI_INTR_ALLOC_STRICT : DDI_INTR_ALLOC_NORMAL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Allocate interrupt */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = ddi_intr_alloc(dip, instance->intr_htable, intr_type, 0,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele count, &actual, flag);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ret != DDI_SUCCESS) || (actual == 0)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "avail = %d", avail));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_free_htable;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (actual < count) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "Requested = %d Received = %d", count, actual));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->intr_cnt = actual;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Get the priority of the interrupt allocated.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ret = ddi_intr_get_pri(instance->intr_htable[0],
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &instance->intr_pri)) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "get priority call failed"));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_free_handles;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /*
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele * Test for high level mutex. we don't support them.
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->intr_pri >= ddi_intr_get_hilevel_pri()) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "High level interrupts not supported."));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_free_handles;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_add_intrs: intr_pri = 0x%x ",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->intr_pri));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Call ddi_intr_add_handler() */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < actual; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret = ddi_intr_add_handler(instance->intr_htable[i],
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (ddi_intr_handler_t *)mrsas_isr, (caddr_t)instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (caddr_t)(uintptr_t)i);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ret != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "failed %d", ret));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_free_handles;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, " ddi_intr_add_handler done"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ret = ddi_intr_get_cap(instance->intr_htable[0],
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele &instance->intr_cap)) != DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "ddi_intr_get_cap() failed %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ret));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald goto mrsas_free_handlers;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->intr_cap & DDI_INTR_FLAG_BLOCK) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_WARN, "Calling ddi_intr_block _enable"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_intr_block_enable(instance->intr_htable,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->intr_cnt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_NOTE, " calling ddi_intr_enable"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < instance->intr_cnt; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_intr_enable(instance->intr_htable[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_NOTE, "ddi intr enable returns "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "%d", i));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_free_handlers:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < actual; i++)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) ddi_intr_remove_handler(instance->intr_htable[i]);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_free_handles:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (i = 0; i < actual; i++)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) ddi_intr_free(instance->intr_htable[i]);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldmrsas_free_htable:
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->intr_htable != NULL)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->intr_htable, instance->intr_htable_size);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_htable = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_htable_size = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (DDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_rem_intrs(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int i;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN, (CE_NOTE, "mrsas_rem_intrs called"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Disable all interrupts first */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (instance->intr_cap & DDI_INTR_FLAG_BLOCK) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_intr_block_disable(instance->intr_htable,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele instance->intr_cnt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < instance->intr_cnt; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_intr_disable(instance->intr_htable[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Remove all the handlers */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (i = 0; i < instance->intr_cnt; i++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_intr_remove_handler(instance->intr_htable[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_intr_free(instance->intr_htable[i]);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->intr_htable != NULL)
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald kmem_free(instance->intr_htable, instance->intr_htable_size);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_htable = NULL;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald instance->intr_htable_size = 0;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_tran_bus_config(dev_info_t *parent, uint_t flags,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_bus_config_op_t op, void *arg, dev_info_t **childp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int config;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald int rval = NDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *ptr = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int tgt, lun;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "Bus config called for op = %x", op));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((instance = ddi_get_soft_state(mrsas_state,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ddi_get_instance(parent))) == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Hold nexus during bus_config */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ndi_devi_enter(parent, &config);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (op) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case BUS_CONFIG_ONE: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* parse wwid/target name out of name given */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ptr = strchr((char *)arg, '@')) == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ptr++;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrsas_parse_devname(arg, &tgt, &lun) != 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (lun == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = mrsas_config_ld(instance, tgt, lun, childp);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald } else if ((instance->tbolt || instance->skinny) && lun != 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_tbolt_config_pd(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald tgt, lun, childp);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case BUS_CONFIG_DRIVER:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case BUS_CONFIG_ALL: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = mrsas_config_all_devices(instance);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (rval == NDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = ndi_busop_bus_config(parent, flags, op, arg, childp, 0);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ndi_devi_exit(parent, config);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "mrsas_tran_bus_config: rval = %x",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_config_all_devices(struct mrsas_instance *instance)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval, tgt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (tgt = 0; tgt < MRDRV_MAX_LD; tgt++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_config_ld(instance, tgt, 0, NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald /* Config PD devices connected to the card */
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald for (tgt = 0; tgt < instance->mr_tbolt_pd_max; tgt++) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_tbolt_config_pd(instance, tgt, 1, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_SUCCESS;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_parse_devname(char *devnm, int *tgt, int *lun)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char devbuf[SCSI_MAXNAMELEN];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *addr;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *p, *tp, *lp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele long num;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Parse dev name and address */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) strcpy(devbuf, devnm);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele addr = "";
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (p = devbuf; *p != '\0'; p++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (*p == '@') {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele addr = p + 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *p = '\0';
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else if (*p == ':') {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *p = '\0';
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Parse target and lun */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele for (p = tp = addr, lp = NULL; *p != '\0'; p++) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (*p == ',') {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele lp = p + 1;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *p = '\0';
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (tgt && tp) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_strtol(tp, NULL, 0x10, &num)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE); /* Can declare this as constant */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *tgt = (int)num;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (lun && lp) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ddi_strtol(lp, NULL, 0x10, &num)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *lun = (int)num;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS); /* Success case */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic int
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_config_ld(struct mrsas_instance *instance, uint16_t tgt,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint8_t lun, dev_info_t **ldip)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_device *sd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dev_info_t *child;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_config_ld: t = %d l = %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((child = mrsas_find_child(instance, tgt, lun)) != NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ldip) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *ldip = child;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald if (instance->mr_ld_list[tgt].flag != MRDRV_TGT_VALID) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald rval = mrsas_service_evt(instance, tgt, 0,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald MRSAS_EVT_UNCONFIG_TGT, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_WARN,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "mr_sas: DELETING STALE ENTRY rval = %d "
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald "tgt id = %d ", rval, tgt));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald return (NDI_FAILURE);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sd = kmem_zalloc(sizeof (struct scsi_device), KM_SLEEP);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sd->sd_address.a_hba_tran = instance->tran;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sd->sd_address.a_target = (uint16_t)tgt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sd->sd_address.a_lun = (uint8_t)lun;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (scsi_hba_probe(sd, NULL) == SCSIPROBE_EXISTS)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = mrsas_config_scsi_device(instance, sd, ldip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele else
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* sd_unprobe is blank now. Free buffer manually */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (sd->sd_inq) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_free(sd->sd_inq, SUN_INQSIZE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele sd->sd_inq = (struct scsi_inquiry *)NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_free(sd, sizeof (struct scsi_device));
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_config_ld: return rval = %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_config_scsi_device(struct mrsas_instance *instance,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsi_device *sd, dev_info_t **dipp)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *nodename = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char **compatible = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int ncompatible = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *childname;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dev_info_t *ldip = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int tgt = sd->sd_address.a_target;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int lun = sd->sd_address.a_lun;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int dtype = sd->sd_inq->inq_dtype & DTYPE_MASK;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int rval;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE, "mr_sas: scsi_device t%dL%d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_nodename_compatible_get(sd->sd_inq, NULL, dtype,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele NULL, &nodename, &compatible, &ncompatible);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (nodename == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: Found no compatible driver "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "for t%dL%d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto finish;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele childname = (dtype == DTYPE_DIRECT) ? "sd" : nodename;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: Childname = %2s nodename = %s", childname, nodename));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* Create a dev node */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = ndi_devi_alloc(instance->dip, childname, DEVI_SID_NODEID, &ldip);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas_config_scsi_device: ndi_devi_alloc rval = %x", rval));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (rval == NDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ndi_prop_update_int(DDI_DEV_T_NONE, ldip, "target", tgt) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_PROP_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to create "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "property for t%dl%d target", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto finish;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ndi_prop_update_int(DDI_DEV_T_NONE, ldip, "lun", lun) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_PROP_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to create "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "property for t%dl%d lun", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto finish;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (ndi_prop_update_string_array(DDI_DEV_T_NONE, ldip,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "compatible", compatible, ncompatible) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_PROP_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to create "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "property for t%dl%d compatible", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = NDI_FAILURE;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele goto finish;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval = ndi_devi_online(ldip, NDI_ONLINE_ATTACH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (rval != NDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to online "
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "t%dl%d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ndi_prop_remove_all(ldip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ndi_devi_free(ldip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_ANN1, (CE_CONT, "mr_sas: online Done :"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "0 t%dl%d", tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelefinish:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (dipp) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele *dipp = ldip;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald con_log(CL_DLEVEL1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: config_scsi_device rval = %d t%dL%d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele rval, tgt, lun));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele scsi_hba_nodename_compatible_free(nodename, compatible);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (rval);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele/*ARGSUSED*/
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_service_evt(struct mrsas_instance *instance, int tgt, int lun, int event,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele uint64_t wwn)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_eventinfo *mrevt = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mrsas_service_evt called for t%dl%d event = %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tgt, lun, event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((instance->taskq == NULL) || (mrevt =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_zalloc(sizeof (struct mrsas_eventinfo), KM_NOSLEEP)) == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (ENOMEM);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->instance = instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->tgt = tgt;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->lun = lun;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->event = event;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrevt->wwn = wwn;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((ddi_taskq_dispatch(instance->taskq,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void (*)(void *))mrsas_issue_evt_taskq, mrevt, DDI_NOSLEEP)) !=
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DDI_SUCCESS) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: Event task failed for t%dl%d event = %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele tgt, lun, event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_free(mrevt, sizeof (struct mrsas_eventinfo));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_FAILURE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
86e4912a3476b98b8ed9e884e1994b058aff908eSusan Scheufele DTRACE_PROBE3(service_evt, int, tgt, int, lun, int, event);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (DDI_SUCCESS);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelestatic void
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_issue_evt_taskq(struct mrsas_eventinfo *mrevt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mrsas_instance *instance = mrevt->instance;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dev_info_t *dip, *pdip;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele int circ1 = 0;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele char *devname;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE, "mrsas_issue_evt_taskq: called for"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " tgt %d lun %d event %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->tgt, mrevt->lun, mrevt->event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrevt->tgt < MRDRV_MAX_LD && mrevt->lun == 0) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele dip = instance->mr_ld_list[mrevt->tgt].dip;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_enter(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald dip = instance->mr_tbolt_pd_list[mrevt->tgt].dip;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mutex_exit(&instance->config_dev_mtx);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ndi_devi_enter(instance->dip, &circ1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (mrevt->event) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MRSAS_EVT_CONFIG_TGT:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (dip == NULL) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (mrevt->lun == 0) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) mrsas_config_ld(instance, mrevt->tgt,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele 0, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#ifdef PDSUPPORT
a1c36c8ba5112b6713dabac615bf8d56a45f0764Dan McDonald } else if (instance->tbolt || instance->skinny) {
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald (void) mrsas_tbolt_config_pd(instance,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald mrevt->tgt,
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald 1, NULL);
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald#endif
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: EVT_CONFIG_TGT called:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " for tgt %d lun %d event %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->tgt, mrevt->lun, mrevt->event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: EVT_CONFIG_TGT dip != NULL:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " for tgt %d lun %d event %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->tgt, mrevt->lun, mrevt->event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case MRSAS_EVT_UNCONFIG_TGT:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (dip) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if (i_ddi_devi_attached(dip)) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele pdip = ddi_get_parent(dip);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele devname = kmem_zalloc(MAXNAMELEN + 1, KM_SLEEP);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ddi_deviname(dip, devname);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) devfs_clean(pdip, devname + 1,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele DV_CLEAN_FORCE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_free(devname, MAXNAMELEN + 1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (void) ndi_devi_offline(dip, NDI_DEVI_REMOVE);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: EVT_UNCONFIG_TGT called:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " for tgt %d lun %d event %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->tgt, mrevt->lun, mrevt->event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele } else {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_NOTE,
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele "mr_sas: EVT_UNCONFIG_TGT dip == NULL:"
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele " for tgt %d lun %d event %d",
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele mrevt->tgt, mrevt->lun, mrevt->event));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele kmem_free(mrevt, sizeof (struct mrsas_eventinfo));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele ndi_devi_exit(instance->dip, circ1);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonaldint
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufelemrsas_mode_sense_build(struct scsi_pkt *pkt)
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele{
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele union scsi_cdb *cdbp;
2ffc8bca2d4d633ffdea78ed925cd1ca63584844Dan McDonald uint16_t page_code;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct scsa_cmd *acmd;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct buf *bp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mode_header *modehdrp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele cdbp = (void *)pkt->pkt_cdbp;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page_code = cdbp->cdb_un.sg.scsi[0];
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele acmd = PKT2CMD(pkt);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bp = acmd->cmd_buf;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele if ((!bp) && bp->b_un.b_addr && bp->b_bcount && acmd->cmd_dmacount) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele con_log(CL_ANN1, (CE_WARN, "Failing MODESENSE Command"));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele /* ADD pkt statistics as Command failed. */
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bp_mapin(bp);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele bzero(bp->b_un.b_addr, bp->b_bcount);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele switch (page_code) {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case 0x3: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mode_format *page3p = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele modehdrp = (struct mode_header *)(bp->b_un.b_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele modehdrp->bdesc_length = MODE_BLK_DESC_LENGTH;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page3p = (void *)((caddr_t)modehdrp +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page3p->mode_page.code = 0x3;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page3p->mode_page.length =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)(sizeof (struct mode_format));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page3p->data_bytes_sect = 512;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page3p->sect_track = 63;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele case 0x4: {
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele struct mode_geometry *page4p = NULL;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele modehdrp = (struct mode_header *)(bp->b_un.b_addr);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele modehdrp->bdesc_length = MODE_BLK_DESC_LENGTH;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page4p = (void *)((caddr_t)modehdrp +
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page4p->mode_page.code = 0x4;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page4p->mode_page.length =
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele (uchar_t)(sizeof (struct mode_geometry));
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page4p->heads = 255;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele page4p->rpm = 10000;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele default:
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele break;
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele }
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele return (NULL);
dcda19f50b2b80bfc622fff718ac04fb0e1cb670Susan Scheufele}