usr/src/uts/common/io/mr_sas/mr_sas.c
author Bayard Bell <buffer.g.overflow@gmail.com>
Thu, 15 Sep 2011 18:27:52 +0100
changeset 13452 6bec9720e054
parent 12757 e25e7e1b3c65
child 13880 267f693f357e
permissions -rw-r--r--
1073 migrate kernel modules from ancient _depends_on to true ELF dependencies Reviewed by: Adam Leventhal <[email protected]> Reviewed by: Garrett D'Amore <[email protected]> Approved by: Richard Lowe <[email protected]>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     1
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     2
 * mr_sas.c: source for mr_sas driver
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     3
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     4
 * MegaRAID device driver for SAS2.0 controllers
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
     5
 * Copyright (c) 2008-2010, LSI Logic Corporation.
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     6
 * All rights reserved.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     7
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     8
 * Version:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
     9
 * Author:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    10
 *		Arun Chandrashekhar
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    11
 *		Manju R
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    12
 *		Rajesh Prabhakaran
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    13
 * 		Seokmann Ju
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    14
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    15
 * Redistribution and use in source and binary forms, with or without
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    16
 * modification, are permitted provided that the following conditions are met:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    17
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    18
 * 1. Redistributions of source code must retain the above copyright notice,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    19
 *    this list of conditions and the following disclaimer.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    20
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    21
 * 2. Redistributions in binary form must reproduce the above copyright notice,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    22
 *    this list of conditions and the following disclaimer in the documentation
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    23
 *    and/or other materials provided with the distribution.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    24
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    25
 * 3. Neither the name of the author nor the names of its contributors may be
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    26
 *    used to endorse or promote products derived from this software without
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    27
 *    specific prior written permission.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    28
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    29
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    30
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    31
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    32
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    33
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    34
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    35
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    36
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    37
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    38
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    39
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    40
 * DAMAGE.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    41
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    42
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    43
/*
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    44
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
13452
6bec9720e054 1073 migrate kernel modules from ancient _depends_on to true ELF dependencies
Bayard Bell <buffer.g.overflow@gmail.com>
parents: 12757
diff changeset
    45
 * Copyright (c) 2011 Bayard G. Bell. All rights reserved.
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    46
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    47
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    48
#include <sys/types.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    49
#include <sys/param.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    50
#include <sys/file.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    51
#include <sys/errno.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    52
#include <sys/open.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    53
#include <sys/cred.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    54
#include <sys/modctl.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    55
#include <sys/conf.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    56
#include <sys/devops.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    57
#include <sys/cmn_err.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    58
#include <sys/kmem.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    59
#include <sys/stat.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    60
#include <sys/mkdev.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    61
#include <sys/pci.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    62
#include <sys/scsi/scsi.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    63
#include <sys/ddi.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    64
#include <sys/sunddi.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    65
#include <sys/atomic.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    66
#include <sys/signal.h>
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
    67
#include <sys/byteorder.h>
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
    68
#include <sys/sdt.h>
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    69
#include <sys/fs/dv_node.h>	/* devfs_clean */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    70
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    71
#include "mr_sas.h"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    72
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    73
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    74
 * FMA header files
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    75
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    76
#include <sys/ddifm.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    77
#include <sys/fm/protocol.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    78
#include <sys/fm/util.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    79
#include <sys/fm/io/ddi.h>
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    80
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    81
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    82
 * Local static data
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    83
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    84
static void	*mrsas_state = NULL;
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
    85
static volatile boolean_t	mrsas_relaxed_ordering = B_TRUE;
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
    86
static volatile int 	debug_level_g = CL_NONE;
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
    87
static volatile int 	msi_enable = 1;
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
    88
static volatile int 	ctio_enable = 1;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
    89
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    90
/* Default Timeout value to issue online controller reset */
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
    91
static volatile int  debug_timeout_g  = 0xB4;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    92
/* Simulate consecutive firmware fault */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    93
static volatile int  debug_fw_faults_after_ocr_g  = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    94
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    95
#ifdef OCRDEBUG
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    96
/* Simulate three consecutive timeout for an IO */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    97
static volatile int  debug_consecutive_timeout_after_ocr_g  = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    98
#endif
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
    99
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   100
#pragma weak scsi_hba_open
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   101
#pragma weak scsi_hba_close
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   102
#pragma weak scsi_hba_ioctl
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   103
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   104
static ddi_dma_attr_t mrsas_generic_dma_attr = {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   105
	DMA_ATTR_V0,		/* dma_attr_version */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   106
	0,			/* low DMA address range */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   107
	0xFFFFFFFFU,		/* high DMA address range */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   108
	0xFFFFFFFFU,		/* DMA counter register  */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   109
	8,			/* DMA address alignment */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   110
	0x07,			/* DMA burstsizes  */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   111
	1,			/* min DMA size */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   112
	0xFFFFFFFFU,		/* max DMA size */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   113
	0xFFFFFFFFU,		/* segment boundary */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   114
	MRSAS_MAX_SGE_CNT,	/* dma_attr_sglen */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   115
	512,			/* granularity of device */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   116
	0			/* bus specific DMA flags */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   117
};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   118
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   119
int32_t mrsas_max_cap_maxxfer = 0x1000000;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   120
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   121
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   122
 * cb_ops contains base level routines
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   123
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   124
static struct cb_ops mrsas_cb_ops = {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   125
	mrsas_open,		/* open */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   126
	mrsas_close,		/* close */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   127
	nodev,			/* strategy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   128
	nodev,			/* print */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   129
	nodev,			/* dump */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   130
	nodev,			/* read */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   131
	nodev,			/* write */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   132
	mrsas_ioctl,		/* ioctl */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   133
	nodev,			/* devmap */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   134
	nodev,			/* mmap */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   135
	nodev,			/* segmap */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   136
	nochpoll,		/* poll */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   137
	nodev,			/* cb_prop_op */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   138
	0,			/* streamtab  */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   139
	D_NEW | D_HOTPLUG,	/* cb_flag */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   140
	CB_REV,			/* cb_rev */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   141
	nodev,			/* cb_aread */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   142
	nodev			/* cb_awrite */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   143
};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   144
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   145
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   146
 * dev_ops contains configuration routines
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   147
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   148
static struct dev_ops mrsas_ops = {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   149
	DEVO_REV,		/* rev, */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   150
	0,			/* refcnt */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   151
	mrsas_getinfo,		/* getinfo */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   152
	nulldev,		/* identify */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   153
	nulldev,		/* probe */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   154
	mrsas_attach,		/* attach */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   155
	mrsas_detach,		/* detach */
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   156
#ifdef  __sparc
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   157
	mrsas_reset,		/* reset */
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   158
#else	/* __sparc */
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   159
	nodev,
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   160
#endif  /* __sparc */
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   161
	&mrsas_cb_ops,		/* char/block ops */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   162
	NULL,			/* bus ops */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   163
	NULL,			/* power */
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   164
#ifdef	__sparc
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   165
	ddi_quiesce_not_needed
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   166
#else	/* __sparc */
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   167
	mrsas_quiesce		/* quiesce */
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
   168
#endif	/* __sparc */
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   169
};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   170
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   171
static struct modldrv modldrv = {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   172
	&mod_driverops,		/* module type - driver */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   173
	MRSAS_VERSION,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   174
	&mrsas_ops,		/* driver ops */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   175
};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   176
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   177
static struct modlinkage modlinkage = {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   178
	MODREV_1,	/* ml_rev - must be MODREV_1 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   179
	&modldrv,	/* ml_linkage */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   180
	NULL		/* end of driver linkage */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   181
};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   182
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   183
static struct ddi_device_acc_attr endian_attr = {
11236
1127b4f9e96b 6783915 numerous drivers using devacc_attr_access without specifying DDI_DEVICE_ATTR_V1
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 10820
diff changeset
   184
	DDI_DEVICE_ATTR_V1,
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   185
	DDI_STRUCTURE_LE_ACC,
11236
1127b4f9e96b 6783915 numerous drivers using devacc_attr_access without specifying DDI_DEVICE_ATTR_V1
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 10820
diff changeset
   186
	DDI_STRICTORDER_ACC,
1127b4f9e96b 6783915 numerous drivers using devacc_attr_access without specifying DDI_DEVICE_ATTR_V1
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 10820
diff changeset
   187
	DDI_DEFAULT_ACC
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   188
};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   189
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   190
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   191
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   192
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   193
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   194
 *         common entry points - for loadable kernel modules                  *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   195
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   196
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   197
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   198
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   199
int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   200
_init(void)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   201
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   202
	int ret;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   203
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   204
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   205
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   206
	ret = ddi_soft_state_init(&mrsas_state,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   207
	    sizeof (struct mrsas_instance), 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   208
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   209
	if (ret != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   210
		con_log(CL_ANN, (CE_WARN, "mr_sas: could not init state"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   211
		return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   212
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   213
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   214
	if ((ret = scsi_hba_init(&modlinkage)) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   215
		con_log(CL_ANN, (CE_WARN, "mr_sas: could not init scsi hba"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   216
		ddi_soft_state_fini(&mrsas_state);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   217
		return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   218
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   219
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   220
	ret = mod_install(&modlinkage);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   221
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   222
	if (ret != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   223
		con_log(CL_ANN, (CE_WARN, "mr_sas: mod_install failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   224
		scsi_hba_fini(&modlinkage);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   225
		ddi_soft_state_fini(&mrsas_state);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   226
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   227
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   228
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   229
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   230
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   231
int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   232
_info(struct modinfo *modinfop)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   233
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   234
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   235
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   236
	return (mod_info(&modlinkage, modinfop));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   237
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   238
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   239
int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   240
_fini(void)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   241
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   242
	int ret;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   243
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   244
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   245
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   246
	if ((ret = mod_remove(&modlinkage)) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   247
		return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   248
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   249
	scsi_hba_fini(&modlinkage);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   250
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   251
	ddi_soft_state_fini(&mrsas_state);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   252
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   253
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   254
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   255
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   256
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   257
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   258
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   259
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   260
 *               common entry points - for autoconfiguration                  *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   261
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   262
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   263
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   264
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   265
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   266
mrsas_attach(dev_info_t *dip, ddi_attach_cmd_t cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   267
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   268
	int		instance_no;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   269
	int		nregs;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   270
	uint8_t		added_isr_f = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   271
	uint8_t		added_soft_isr_f = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   272
	uint8_t		create_devctl_node_f = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   273
	uint8_t		create_scsi_node_f = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   274
	uint8_t		create_ioc_node_f = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   275
	uint8_t		tran_alloc_f = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   276
	uint8_t 	irq;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   277
	uint16_t	vendor_id;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   278
	uint16_t	device_id;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   279
	uint16_t	subsysvid;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   280
	uint16_t	subsysid;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   281
	uint16_t	command;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   282
	off_t		reglength = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   283
	int		intr_types = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   284
	char		*data;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   285
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   286
	scsi_hba_tran_t		*tran;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   287
	ddi_dma_attr_t  tran_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   288
	struct mrsas_instance	*instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   289
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   290
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   291
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   292
	/* CONSTCOND */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   293
	ASSERT(NO_COMPETING_THREADS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   294
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   295
	instance_no = ddi_get_instance(dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   296
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   297
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   298
	 * check to see whether this device is in a DMA-capable slot.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   299
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   300
	if (ddi_slaveonly(dip) == DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   301
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   302
		    "mr_sas%d: Device in slave-only slot, unused",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   303
		    instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   304
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   305
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   306
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   307
	switch (cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   308
		case DDI_ATTACH:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   309
			con_log(CL_DLEVEL1, (CE_NOTE, "mr_sas: DDI_ATTACH"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   310
			/* allocate the soft state for the instance */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   311
			if (ddi_soft_state_zalloc(mrsas_state, instance_no)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   312
			    != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   313
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   314
				    "mr_sas%d: Failed to allocate soft state",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   315
				    instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   316
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   317
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   318
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   319
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   320
			instance = (struct mrsas_instance *)ddi_get_soft_state
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   321
			    (mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   322
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   323
			if (instance == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   324
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   325
				    "mr_sas%d: Bad soft state", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   326
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   327
				ddi_soft_state_free(mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   328
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   329
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   330
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   331
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   332
			bzero((caddr_t)instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   333
			    sizeof (struct mrsas_instance));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   334
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   335
			instance->func_ptr = kmem_zalloc(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   336
			    sizeof (struct mrsas_func_ptr), KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   337
			ASSERT(instance->func_ptr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   338
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   339
			/* Setup the PCI configuration space handles */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   340
			if (pci_config_setup(dip, &instance->pci_handle) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   341
			    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   342
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   343
				    "mr_sas%d: pci config setup failed ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   344
				    instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   345
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   346
				kmem_free(instance->func_ptr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   347
				    sizeof (struct mrsas_func_ptr));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   348
				ddi_soft_state_free(mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   349
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   350
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   351
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   352
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   353
			if (ddi_dev_nregs(dip, &nregs) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   354
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   355
				    "mr_sas: failed to get registers."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   356
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   357
				pci_config_teardown(&instance->pci_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   358
				kmem_free(instance->func_ptr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   359
				    sizeof (struct mrsas_func_ptr));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   360
				ddi_soft_state_free(mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   361
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   362
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   363
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   364
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   365
			vendor_id = pci_config_get16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   366
			    PCI_CONF_VENID);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   367
			device_id = pci_config_get16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   368
			    PCI_CONF_DEVID);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   369
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   370
			subsysvid = pci_config_get16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   371
			    PCI_CONF_SUBVENID);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   372
			subsysid = pci_config_get16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   373
			    PCI_CONF_SUBSYSID);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   374
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   375
			pci_config_put16(instance->pci_handle, PCI_CONF_COMM,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   376
			    (pci_config_get16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   377
			    PCI_CONF_COMM) | PCI_COMM_ME));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   378
			irq = pci_config_get8(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   379
			    PCI_CONF_ILINE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   380
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   381
			con_log(CL_DLEVEL1, (CE_CONT, "mr_sas%d: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   382
			    "0x%x:0x%x 0x%x:0x%x, irq:%d drv-ver:%s",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   383
			    instance_no, vendor_id, device_id, subsysvid,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   384
			    subsysid, irq, MRSAS_VERSION));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   385
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   386
			/* enable bus-mastering */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   387
			command = pci_config_get16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   388
			    PCI_CONF_COMM);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   389
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   390
			if (!(command & PCI_COMM_ME)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   391
				command |= PCI_COMM_ME;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   392
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   393
				pci_config_put16(instance->pci_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   394
				    PCI_CONF_COMM, command);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   395
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   396
				con_log(CL_ANN, (CE_CONT, "mr_sas%d: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   397
				    "enable bus-mastering", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   398
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   399
				con_log(CL_DLEVEL1, (CE_CONT, "mr_sas%d: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   400
				"bus-mastering already set", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   401
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   402
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   403
			/* initialize function pointers */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   404
			if ((device_id == PCI_DEVICE_ID_LSI_2108VDE) ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   405
			    (device_id == PCI_DEVICE_ID_LSI_2108V)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   406
				con_log(CL_DLEVEL1, (CE_CONT, "mr_sas%d: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   407
				    "2108V/DE detected", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   408
				instance->func_ptr->read_fw_status_reg =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   409
				    read_fw_status_reg_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   410
				instance->func_ptr->issue_cmd = issue_cmd_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   411
				instance->func_ptr->issue_cmd_in_sync_mode =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   412
				    issue_cmd_in_sync_mode_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   413
				instance->func_ptr->issue_cmd_in_poll_mode =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   414
				    issue_cmd_in_poll_mode_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   415
				instance->func_ptr->enable_intr =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   416
				    enable_intr_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   417
				instance->func_ptr->disable_intr =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   418
				    disable_intr_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   419
				instance->func_ptr->intr_ack = intr_ack_ppc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   420
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   421
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   422
				    "mr_sas: Invalid device detected"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   423
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   424
				pci_config_teardown(&instance->pci_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   425
				kmem_free(instance->func_ptr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   426
				    sizeof (struct mrsas_func_ptr));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   427
				ddi_soft_state_free(mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   428
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   429
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   430
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   431
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   432
			instance->baseaddress = pci_config_get32(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   433
			    instance->pci_handle, PCI_CONF_BASE0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   434
			instance->baseaddress &= 0x0fffc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   435
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   436
			instance->dip		= dip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   437
			instance->vendor_id	= vendor_id;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   438
			instance->device_id	= device_id;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   439
			instance->subsysvid	= subsysvid;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   440
			instance->subsysid	= subsysid;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   441
			instance->instance	= instance_no;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   442
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   443
			/* Initialize FMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   444
			instance->fm_capabilities = ddi_prop_get_int(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   445
			    DDI_DEV_T_ANY, instance->dip, DDI_PROP_DONTPASS,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   446
			    "fm-capable", DDI_FM_EREPORT_CAPABLE |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   447
			    DDI_FM_ACCCHK_CAPABLE | DDI_FM_DMACHK_CAPABLE
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   448
			    | DDI_FM_ERRCB_CAPABLE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   449
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   450
			mrsas_fm_init(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   451
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   452
			/* Initialize Interrupts */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   453
			if ((ddi_dev_regsize(instance->dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   454
			    REGISTER_SET_IO_2108, &reglength) != DDI_SUCCESS) ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   455
			    reglength < MINIMUM_MFI_MEM_SZ) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   456
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   457
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   458
			if (reglength > DEFAULT_MFI_MEM_SZ) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   459
				reglength = DEFAULT_MFI_MEM_SZ;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   460
				con_log(CL_DLEVEL1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   461
				    "mr_sas: register length to map is "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   462
				    "0x%lx bytes", reglength));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   463
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   464
			if (ddi_regs_map_setup(instance->dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   465
			    REGISTER_SET_IO_2108, &instance->regmap, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   466
			    reglength, &endian_attr, &instance->regmap_handle)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   467
			    != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   468
				con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   469
				    "mr_sas: couldn't map control registers"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   470
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   471
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   472
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   473
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   474
			 * Disable Interrupt Now.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   475
			 * Setup Software interrupt
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   476
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   477
			instance->func_ptr->disable_intr(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   478
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   479
			if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   480
			    "mrsas-enable-msi", &data) == DDI_SUCCESS) {
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
   481
				if (strncmp(data, "no", 3) == 0) {
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
   482
					msi_enable = 0;
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
   483
					con_log(CL_ANN1, (CE_WARN,
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
   484
					    "msi_enable = %d disabled",
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   485
					    msi_enable));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   486
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   487
				ddi_prop_free(data);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   488
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   489
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   490
			con_log(CL_DLEVEL1, (CE_WARN, "msi_enable = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   491
			    msi_enable));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   492
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   493
			/* Check for all supported interrupt types */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   494
			if (ddi_intr_get_supported_types(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   495
			    dip, &intr_types) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   496
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   497
				    "ddi_intr_get_supported_types() failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   498
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   499
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   500
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   501
			con_log(CL_DLEVEL1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   502
			    "ddi_intr_get_supported_types() ret: 0x%x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   503
			    intr_types));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   504
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   505
			/* Initialize and Setup Interrupt handler */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   506
			if (msi_enable && (intr_types & DDI_INTR_TYPE_MSIX)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   507
				if (mrsas_add_intrs(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   508
				    DDI_INTR_TYPE_MSIX) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   509
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   510
					    "MSIX interrupt query failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   511
					goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   512
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   513
				instance->intr_type = DDI_INTR_TYPE_MSIX;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   514
			} else if (msi_enable && (intr_types &
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   515
			    DDI_INTR_TYPE_MSI)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   516
				if (mrsas_add_intrs(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   517
				    DDI_INTR_TYPE_MSI) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   518
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   519
					    "MSI interrupt query failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   520
					goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   521
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   522
				instance->intr_type = DDI_INTR_TYPE_MSI;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   523
			} else if (intr_types & DDI_INTR_TYPE_FIXED) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   524
				msi_enable = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   525
				if (mrsas_add_intrs(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   526
				    DDI_INTR_TYPE_FIXED) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   527
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   528
					    "FIXED interrupt query failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   529
					goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   530
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   531
				instance->intr_type = DDI_INTR_TYPE_FIXED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   532
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   533
				con_log(CL_ANN, (CE_WARN, "Device cannot "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   534
				    "suppport either FIXED or MSI/X "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   535
				    "interrupts"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   536
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   537
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   538
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   539
			added_isr_f = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   540
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   541
			if (ddi_prop_lookup_string(DDI_DEV_T_ANY, dip, 0,
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   542
			    "mrsas-enable-ctio", &data) == DDI_SUCCESS) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   543
				if (strncmp(data, "no", 3) == 0) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   544
					ctio_enable = 0;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   545
					con_log(CL_ANN1, (CE_WARN,
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   546
					    "ctio_enable = %d disabled",
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   547
					    ctio_enable));
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   548
				}
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   549
				ddi_prop_free(data);
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   550
			}
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   551
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   552
			con_log(CL_DLEVEL1, (CE_WARN, "ctio_enable = %d",
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   553
			    ctio_enable));
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
   554
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   555
			/* setup the mfi based low level driver */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   556
			if (init_mfi(instance) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   557
				con_log(CL_ANN, (CE_WARN, "mr_sas: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   558
				"could not initialize the low level driver"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   559
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   560
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   561
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   562
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   563
			/* Initialize all Mutex */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   564
			INIT_LIST_HEAD(&instance->completed_pool_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   565
			mutex_init(&instance->completed_pool_mtx,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   566
			    "completed_pool_mtx", MUTEX_DRIVER,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   567
			    DDI_INTR_PRI(instance->intr_pri));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   568
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   569
			mutex_init(&instance->app_cmd_pool_mtx,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   570
			    "app_cmd_pool_mtx",	MUTEX_DRIVER,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   571
			    DDI_INTR_PRI(instance->intr_pri));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   572
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   573
			mutex_init(&instance->cmd_pend_mtx, "cmd_pend_mtx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   574
			    MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   575
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   576
			mutex_init(&instance->ocr_flags_mtx, "ocr_flags_mtx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   577
			    MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   578
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   579
			mutex_init(&instance->int_cmd_mtx, "int_cmd_mtx",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   580
			    MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   581
			cv_init(&instance->int_cmd_cv, NULL, CV_DRIVER, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   582
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   583
			mutex_init(&instance->cmd_pool_mtx, "cmd_pool_mtx",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   584
			    MUTEX_DRIVER, DDI_INTR_PRI(instance->intr_pri));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   585
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   586
			instance->timeout_id = (timeout_id_t)-1;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   587
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   588
			/* Register our soft-isr for highlevel interrupts. */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   589
			instance->isr_level = instance->intr_pri;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   590
			if (instance->isr_level == HIGH_LEVEL_INTR) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   591
				if (ddi_add_softintr(dip, DDI_SOFTINT_HIGH,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   592
				    &instance->soft_intr_id, NULL, NULL,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   593
				    mrsas_softintr, (caddr_t)instance) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   594
				    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   595
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   596
					    " Software ISR did not register"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   597
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   598
					goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   599
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   600
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   601
				added_soft_isr_f = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   602
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   603
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   604
			/* Allocate a transport structure */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   605
			tran = scsi_hba_tran_alloc(dip, SCSI_HBA_CANSLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   606
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   607
			if (tran == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   608
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   609
				    "scsi_hba_tran_alloc failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   610
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   611
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   612
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   613
			tran_alloc_f = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   614
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   615
			instance->tran = tran;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   616
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   617
			tran->tran_hba_private	= instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   618
			tran->tran_tgt_init	= mrsas_tran_tgt_init;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   619
			tran->tran_tgt_probe	= scsi_hba_probe;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   620
			tran->tran_tgt_free	= mrsas_tran_tgt_free;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   621
			tran->tran_init_pkt	= mrsas_tran_init_pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   622
			tran->tran_start	= mrsas_tran_start;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   623
			tran->tran_abort	= mrsas_tran_abort;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   624
			tran->tran_reset	= mrsas_tran_reset;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   625
			tran->tran_getcap	= mrsas_tran_getcap;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   626
			tran->tran_setcap	= mrsas_tran_setcap;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   627
			tran->tran_destroy_pkt	= mrsas_tran_destroy_pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   628
			tran->tran_dmafree	= mrsas_tran_dmafree;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   629
			tran->tran_sync_pkt	= mrsas_tran_sync_pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   630
			tran->tran_bus_config	= mrsas_tran_bus_config;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   631
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
   632
			if (mrsas_relaxed_ordering)
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
   633
				mrsas_generic_dma_attr.dma_attr_flags |=
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
   634
				    DDI_DMA_RELAXED_ORDERING;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
   635
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
   636
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   637
			tran_dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   638
			tran_dma_attr.dma_attr_sgllen = instance->max_num_sge;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   639
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   640
			/* Attach this instance of the hba */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   641
			if (scsi_hba_attach_setup(dip, &tran_dma_attr, tran, 0)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   642
			    != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   643
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   644
				    "scsi_hba_attach failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   645
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   646
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   647
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   648
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   649
			/* create devctl node for cfgadm command */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   650
			if (ddi_create_minor_node(dip, "devctl",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   651
			    S_IFCHR, INST2DEVCTL(instance_no),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   652
			    DDI_NT_SCSI_NEXUS, 0) == DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   653
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   654
				    "mr_sas: failed to create devctl node."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   655
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   656
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   657
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   658
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   659
			create_devctl_node_f = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   660
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   661
			/* create scsi node for cfgadm command */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   662
			if (ddi_create_minor_node(dip, "scsi", S_IFCHR,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   663
			    INST2SCSI(instance_no),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   664
			    DDI_NT_SCSI_ATTACHMENT_POINT, 0) ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   665
			    DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   666
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   667
				    "mr_sas: failed to create scsi node."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   668
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   669
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   670
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   671
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   672
			create_scsi_node_f = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   673
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   674
			(void) sprintf(instance->iocnode, "%d:lsirdctl",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   675
			    instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   676
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   677
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   678
			 * Create a node for applications
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   679
			 * for issuing ioctl to the driver.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   680
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   681
			if (ddi_create_minor_node(dip, instance->iocnode,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   682
			    S_IFCHR, INST2LSIRDCTL(instance_no),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   683
			    DDI_PSEUDO, 0) == DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   684
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   685
				    "mr_sas: failed to create ioctl node."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   686
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   687
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   688
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   689
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   690
			create_ioc_node_f = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   691
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   692
			/* Create a taskq to handle dr events */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   693
			if ((instance->taskq = ddi_taskq_create(dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   694
			    "mrsas_dr_taskq", 1,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   695
			    TASKQ_DEFAULTPRI, 0)) == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   696
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   697
				    "mr_sas: failed to create taskq "));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   698
				instance->taskq = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   699
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   700
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   701
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   702
			/* enable interrupt */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   703
			instance->func_ptr->enable_intr(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   704
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   705
			/* initiate AEN */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   706
			if (start_mfi_aen(instance)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   707
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   708
				    "mr_sas: failed to initiate AEN."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   709
				goto fail_initiate_aen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   710
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   711
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   712
			con_log(CL_DLEVEL1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   713
			    "AEN started for instance %d.", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   714
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   715
			/* Finally! We are on the air.  */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   716
			ddi_report_dev(dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   717
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   718
			if (mrsas_check_acc_handle(instance->regmap_handle) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   719
			    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   720
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   721
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   722
			if (mrsas_check_acc_handle(instance->pci_handle) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   723
			    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   724
				goto fail_attach;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   725
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   726
			instance->mr_ld_list =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   727
			    kmem_zalloc(MRDRV_MAX_LD * sizeof (struct mrsas_ld),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   728
			    KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   729
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   730
		case DDI_PM_RESUME:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   731
			con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   732
			    "mr_sas: DDI_PM_RESUME"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   733
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   734
		case DDI_RESUME:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   735
			con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   736
			    "mr_sas: DDI_RESUME"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   737
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   738
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   739
			con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   740
			    "mr_sas: invalid attach cmd=%x", cmd));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   741
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   742
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   743
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   744
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   745
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   746
fail_initiate_aen:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   747
fail_attach:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   748
	if (create_devctl_node_f) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   749
		ddi_remove_minor_node(dip, "devctl");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   750
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   751
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   752
	if (create_scsi_node_f) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   753
		ddi_remove_minor_node(dip, "scsi");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   754
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   755
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   756
	if (create_ioc_node_f) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   757
		ddi_remove_minor_node(dip, instance->iocnode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   758
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   759
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   760
	if (tran_alloc_f) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   761
		scsi_hba_tran_free(tran);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   762
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   763
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   764
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   765
	if (added_soft_isr_f) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   766
		ddi_remove_softintr(instance->soft_intr_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   767
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   768
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   769
	if (added_isr_f) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   770
		mrsas_rem_intrs(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   771
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   772
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   773
	if (instance && instance->taskq) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   774
		ddi_taskq_destroy(instance->taskq);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   775
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   776
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   777
	mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   778
	ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   779
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   780
	mrsas_fm_fini(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   781
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   782
	pci_config_teardown(&instance->pci_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   783
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   784
	ddi_soft_state_free(mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   785
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   786
	con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   787
	    "mr_sas: return failure from mrsas_attach"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   788
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   789
	return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   790
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   791
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   792
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   793
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   794
mrsas_getinfo(dev_info_t *dip, ddi_info_cmd_t cmd,  void *arg, void **resultp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   795
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   796
	int	rval;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   797
	int	mrsas_minor = getminor((dev_t)arg);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   798
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   799
	struct mrsas_instance	*instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   800
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   801
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   802
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   803
	switch (cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   804
		case DDI_INFO_DEVT2DEVINFO:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   805
			instance = (struct mrsas_instance *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   806
			    ddi_get_soft_state(mrsas_state,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   807
			    MINOR2INST(mrsas_minor));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   808
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   809
			if (instance == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   810
				*resultp = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   811
				rval = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   812
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   813
				*resultp = instance->dip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   814
				rval = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   815
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   816
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   817
		case DDI_INFO_DEVT2INSTANCE:
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
   818
			*resultp = (void *)(intptr_t)
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
   819
			    (MINOR2INST(getminor((dev_t)arg)));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   820
			rval = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   821
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   822
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   823
			*resultp = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   824
			rval = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   825
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   826
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   827
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   828
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   829
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   830
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   831
mrsas_detach(dev_info_t *dip, ddi_detach_cmd_t cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   832
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   833
	int	instance_no;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   834
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   835
	struct mrsas_instance	*instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   836
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   837
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   838
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   839
	/* CONSTCOND */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   840
	ASSERT(NO_COMPETING_THREADS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   841
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   842
	instance_no = ddi_get_instance(dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   843
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   844
	instance = (struct mrsas_instance *)ddi_get_soft_state(mrsas_state,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   845
	    instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   846
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   847
	if (!instance) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   848
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   849
		    "mr_sas:%d could not get instance in detach",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   850
		    instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   851
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   852
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   853
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   854
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   855
	con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   856
	    "mr_sas%d: detaching device 0x%4x:0x%4x:0x%4x:0x%4x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   857
	    instance_no, instance->vendor_id, instance->device_id,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   858
	    instance->subsysvid, instance->subsysid));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   859
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   860
	switch (cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   861
	case DDI_DETACH:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   862
		con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   863
		    "mrsas_detach: DDI_DETACH"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   864
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   865
		if (scsi_hba_detach(dip) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   866
			con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   867
			    "mr_sas:%d failed to detach",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   868
			    instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   869
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   870
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   871
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   872
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   873
		scsi_hba_tran_free(instance->tran);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   874
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   875
		flush_cache(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   876
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   877
		if (abort_aen_cmd(instance, instance->aen_cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   878
			con_log(CL_ANN, (CE_WARN, "mrsas_detach: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   879
			    "failed to abort prevous AEN command"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   880
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   881
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   882
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   883
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   884
		instance->func_ptr->disable_intr(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   885
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   886
		if (instance->isr_level == HIGH_LEVEL_INTR) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   887
			ddi_remove_softintr(instance->soft_intr_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   888
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   889
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   890
		mrsas_rem_intrs(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   891
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   892
		if (instance->taskq) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   893
			ddi_taskq_destroy(instance->taskq);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   894
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   895
		kmem_free(instance->mr_ld_list, MRDRV_MAX_LD
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   896
		    * sizeof (struct mrsas_ld));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   897
		free_space_for_mfi(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   898
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   899
		mrsas_fm_fini(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   900
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   901
		pci_config_teardown(&instance->pci_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   902
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   903
		kmem_free(instance->func_ptr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   904
		    sizeof (struct mrsas_func_ptr));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   905
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   906
		if (instance->timeout_id != (timeout_id_t)-1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   907
			(void) untimeout(instance->timeout_id);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   908
			instance->timeout_id = (timeout_id_t)-1;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
   909
		}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   910
		ddi_soft_state_free(mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   911
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   912
	case DDI_PM_SUSPEND:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   913
		con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   914
		    "mrsas_detach: DDI_PM_SUSPEND"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   915
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   916
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   917
	case DDI_SUSPEND:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   918
		con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   919
		    "mrsas_detach: DDI_SUSPEND"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   920
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   921
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   922
	default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   923
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   924
		    "invalid detach command:0x%x", cmd));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   925
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   926
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   927
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   928
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   929
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   930
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   931
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   932
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   933
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   934
 *             common entry points - for character driver types               *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   935
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   936
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   937
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   938
static  int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   939
mrsas_open(dev_t *dev, int openflags, int otyp, cred_t *credp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   940
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   941
	int	rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   942
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   943
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   944
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   945
	/* Check root permissions */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   946
	if (drv_priv(credp) != 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   947
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   948
		    "mr_sas: Non-root ioctl access denied!"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   949
		return (EPERM);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   950
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   951
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   952
	/* Verify we are being opened as a character device */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   953
	if (otyp != OTYP_CHR) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   954
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   955
		    "mr_sas: ioctl node must be a char node"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   956
		return (EINVAL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   957
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   958
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   959
	if (ddi_get_soft_state(mrsas_state, MINOR2INST(getminor(*dev)))
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   960
	    == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   961
		return (ENXIO);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   962
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   963
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   964
	if (scsi_hba_open) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   965
		rval = scsi_hba_open(dev, openflags, otyp, credp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   966
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   967
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   968
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   969
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   970
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   971
static  int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   972
mrsas_close(dev_t dev, int openflags, int otyp, cred_t *credp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   973
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   974
	int	rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   975
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   976
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   977
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   978
	/* no need for locks! */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   979
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   980
	if (scsi_hba_close) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   981
		rval = scsi_hba_close(dev, openflags, otyp, credp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   982
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   983
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   984
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   985
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   986
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   987
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   988
mrsas_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   989
    int *rvalp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   990
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   991
	int	rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   992
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   993
	struct mrsas_instance	*instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   994
	struct mrsas_ioctl	*ioctl;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   995
	struct mrsas_aen	aen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   996
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   997
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   998
	instance = ddi_get_soft_state(mrsas_state, MINOR2INST(getminor(dev)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
   999
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1000
	if (instance == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1001
		/* invalid minor number */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1002
		con_log(CL_ANN, (CE_WARN, "mr_sas: adapter not found."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1003
		return (ENXIO);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1004
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1005
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1006
	ioctl = (struct mrsas_ioctl *)kmem_zalloc(sizeof (struct mrsas_ioctl),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1007
	    KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1008
	ASSERT(ioctl);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1009
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1010
	switch ((uint_t)cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1011
		case MRSAS_IOCTL_FIRMWARE:
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1012
			if (ddi_copyin((void *)arg, ioctl,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1013
			    sizeof (struct mrsas_ioctl), mode)) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1014
				con_log(CL_ANN, (CE_WARN, "mrsas_ioctl: "
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1015
				    "ERROR IOCTL copyin"));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1016
				kmem_free(ioctl, sizeof (struct mrsas_ioctl));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1017
				return (EFAULT);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1018
			}
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1019
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1020
			if (ioctl->control_code == MRSAS_DRIVER_IOCTL_COMMON) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1021
				rval = handle_drv_ioctl(instance, ioctl, mode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1022
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1023
				rval = handle_mfi_ioctl(instance, ioctl, mode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1024
			}
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1025
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1026
			if (ddi_copyout((void *)ioctl, (void *)arg,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1027
			    (sizeof (struct mrsas_ioctl) - 1), mode)) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1028
				con_log(CL_ANN, (CE_WARN,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1029
				    "mrsas_ioctl: copy_to_user failed"));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1030
				rval = 1;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1031
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1032
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1033
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1034
		case MRSAS_IOCTL_AEN:
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1035
			if (ddi_copyin((void *) arg, &aen,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1036
			    sizeof (struct mrsas_aen), mode)) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1037
				con_log(CL_ANN, (CE_WARN,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1038
				    "mrsas_ioctl: ERROR AEN copyin"));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1039
				kmem_free(ioctl, sizeof (struct mrsas_ioctl));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1040
				return (EFAULT);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1041
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1042
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1043
			rval = handle_mfi_aen(instance, &aen);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1044
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1045
			if (ddi_copyout((void *) &aen, (void *)arg,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1046
			    sizeof (struct mrsas_aen), mode)) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1047
				con_log(CL_ANN, (CE_WARN,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1048
				    "mrsas_ioctl: copy_to_user failed"));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1049
				rval = 1;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1050
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1051
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1052
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1053
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1054
			rval = scsi_hba_ioctl(dev, cmd, arg,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1055
			    mode, credp, rvalp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1056
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1057
			con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1058
			    "scsi_hba_ioctl called, ret = %x.", rval));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1059
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1060
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1061
	kmem_free(ioctl, sizeof (struct mrsas_ioctl));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1062
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1063
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1064
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1065
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1066
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1067
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1068
 *               common entry points - for block driver types                 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1069
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1070
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1071
 */
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1072
#ifdef	__sparc
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1073
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1074
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1075
mrsas_reset(dev_info_t *dip, ddi_reset_cmd_t cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1076
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1077
	int	instance_no;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1078
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1079
	struct mrsas_instance	*instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1080
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1081
	instance_no = ddi_get_instance(dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1082
	instance = (struct mrsas_instance *)ddi_get_soft_state
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1083
	    (mrsas_state, instance_no);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1084
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1085
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1086
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1087
	if (!instance) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1088
		con_log(CL_ANN, (CE_WARN, "mr_sas:%d could not get adapter "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1089
		    "in reset", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1090
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1091
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1092
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1093
	instance->func_ptr->disable_intr(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1094
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1095
	con_log(CL_ANN1, (CE_NOTE, "flushing cache for instance %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1096
	    instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1097
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1098
	flush_cache(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1099
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1100
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1101
}
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1102
#else /* __sparc */
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1103
/*ARGSUSED*/
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1104
static int
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1105
mrsas_quiesce(dev_info_t *dip)
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1106
{
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1107
	int	instance_no;
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1108
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1109
	struct mrsas_instance	*instance;
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1110
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1111
	instance_no = ddi_get_instance(dip);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1112
	instance = (struct mrsas_instance *)ddi_get_soft_state
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1113
	    (mrsas_state, instance_no);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1114
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1115
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1116
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1117
	if (!instance) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1118
		con_log(CL_ANN1, (CE_WARN, "mr_sas:%d could not get adapter "
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1119
		    "in quiesce", instance_no));
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1120
		return (DDI_FAILURE);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1121
	}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1122
	if (instance->deadadapter || instance->adapterresetinprogress) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1123
		con_log(CL_ANN1, (CE_WARN, "mr_sas:%d adapter is not in "
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1124
		    "healthy state", instance_no));
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1125
		return (DDI_FAILURE);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1126
	}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1127
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1128
	if (abort_aen_cmd(instance, instance->aen_cmd)) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1129
		con_log(CL_ANN1, (CE_WARN, "mrsas_quiesce: "
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1130
		    "failed to abort prevous AEN command QUIESCE"));
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1131
	}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1132
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1133
	instance->func_ptr->disable_intr(instance);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1134
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1135
	con_log(CL_ANN1, (CE_NOTE, "flushing cache for instance %d",
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1136
	    instance_no));
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1137
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1138
	flush_cache(instance);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1139
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1140
	if (wait_for_outstanding(instance)) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1141
		return (DDI_FAILURE);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1142
	}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1143
	return (DDI_SUCCESS);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1144
}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  1145
#endif	/* __sparc */
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1146
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1147
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1148
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1149
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1150
 *                          entry points (SCSI HBA)                           *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1151
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1152
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1153
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1154
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1155
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1156
mrsas_tran_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1157
		scsi_hba_tran_t *tran, struct scsi_device *sd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1158
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1159
	struct mrsas_instance *instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1160
	uint16_t tgt = sd->sd_address.a_target;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1161
	uint8_t lun = sd->sd_address.a_lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1162
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1163
	con_log(CL_ANN1, (CE_NOTE, "mrsas_tgt_init target %d lun %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1164
	    tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1165
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1166
	instance = ADDR2MR(&sd->sd_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1167
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1168
	if (ndi_dev_is_persistent_node(tgt_dip) == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1169
		(void) ndi_merge_node(tgt_dip, mrsas_name_node);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1170
		ddi_set_name_addr(tgt_dip, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1171
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1172
		con_log(CL_ANN1, (CE_NOTE, "mrsas_tgt_init in "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1173
		    "ndi_dev_is_persistent_node DDI_FAILURE t = %d l = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1174
		    tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1175
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1176
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1177
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1178
	con_log(CL_ANN1, (CE_NOTE, "mrsas_tgt_init dev_dip %p tgt_dip %p",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1179
	    (void *)instance->mr_ld_list[tgt].dip, (void *)tgt_dip));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1180
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1181
	if (tgt < MRDRV_MAX_LD && lun == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1182
		if (instance->mr_ld_list[tgt].dip == NULL &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1183
		    strcmp(ddi_driver_name(sd->sd_dev), "sd") == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1184
			instance->mr_ld_list[tgt].dip = tgt_dip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1185
			instance->mr_ld_list[tgt].lun_type = MRSAS_LD_LUN;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1186
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1187
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1188
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1189
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1190
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1191
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1192
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1193
mrsas_tran_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1194
    scsi_hba_tran_t *hba_tran, struct scsi_device *sd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1195
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1196
	struct mrsas_instance *instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1197
	int tgt = sd->sd_address.a_target;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1198
	int lun = sd->sd_address.a_lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1199
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1200
	instance = ADDR2MR(&sd->sd_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1201
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1202
	con_log(CL_ANN1, (CE_NOTE, "tgt_free t = %d l = %d", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1203
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1204
	if (tgt < MRDRV_MAX_LD && lun == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1205
		if (instance->mr_ld_list[tgt].dip == tgt_dip) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1206
			instance->mr_ld_list[tgt].dip = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1207
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1208
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1209
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1210
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1211
static dev_info_t *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1212
mrsas_find_child(struct mrsas_instance *instance, uint16_t tgt, uint8_t lun)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1213
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1214
	dev_info_t *child = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1215
	char addr[SCSI_MAXNAMELEN];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1216
	char tmp[MAXNAMELEN];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1217
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1218
	(void) sprintf(addr, "%x,%x", tgt, lun);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1219
	for (child = ddi_get_child(instance->dip); child;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1220
	    child = ddi_get_next_sibling(child)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1221
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1222
		if (mrsas_name_node(child, tmp, MAXNAMELEN) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1223
		    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1224
			continue;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1225
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1226
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1227
		if (strcmp(addr, tmp) == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1228
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1229
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1230
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1231
	con_log(CL_ANN1, (CE_NOTE, "mrsas_find_child: return child = %p",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1232
	    (void *)child));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1233
	return (child);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1234
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1235
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1236
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1237
mrsas_name_node(dev_info_t *dip, char *name, int len)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1238
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1239
	int tgt, lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1240
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1241
	tgt = ddi_prop_get_int(DDI_DEV_T_ANY, dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1242
	    DDI_PROP_DONTPASS, "target", -1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1243
	con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1244
	    "mrsas_name_node: dip %p tgt %d", (void *)dip, tgt));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1245
	if (tgt == -1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1246
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1247
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1248
	lun = ddi_prop_get_int(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1249
	    "lun", -1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1250
	con_log(CL_ANN1,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1251
	    (CE_NOTE, "mrsas_name_node: tgt %d lun %d", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1252
	if (lun == -1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1253
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1254
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1255
	(void) snprintf(name, len, "%x,%x", tgt, lun);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1256
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1257
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1258
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1259
static struct scsi_pkt *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1260
mrsas_tran_init_pkt(struct scsi_address *ap, register struct scsi_pkt *pkt,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1261
	struct buf *bp, int cmdlen, int statuslen, int tgtlen,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1262
	int flags, int (*callback)(), caddr_t arg)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1263
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1264
	struct scsa_cmd	*acmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1265
	struct mrsas_instance	*instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1266
	struct scsi_pkt	*new_pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1267
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1268
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1269
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1270
	instance = ADDR2MR(ap);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1271
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1272
	/* step #1 : pkt allocation */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1273
	if (pkt == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1274
		pkt = scsi_hba_pkt_alloc(instance->dip, ap, cmdlen, statuslen,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1275
		    tgtlen, sizeof (struct scsa_cmd), callback, arg);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1276
		if (pkt == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1277
			return (NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1278
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1279
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1280
		acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1281
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1282
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1283
		 * Initialize the new pkt - we redundantly initialize
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1284
		 * all the fields for illustrative purposes.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1285
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1286
		acmd->cmd_pkt		= pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1287
		acmd->cmd_flags		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1288
		acmd->cmd_scblen	= statuslen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1289
		acmd->cmd_cdblen	= cmdlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1290
		acmd->cmd_dmahandle	= NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1291
		acmd->cmd_ncookies	= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1292
		acmd->cmd_cookie	= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1293
		acmd->cmd_cookiecnt	= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1294
		acmd->cmd_nwin		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1295
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1296
		pkt->pkt_address	= *ap;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1297
		pkt->pkt_comp		= (void (*)())NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1298
		pkt->pkt_flags		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1299
		pkt->pkt_time		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1300
		pkt->pkt_resid		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1301
		pkt->pkt_state		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1302
		pkt->pkt_statistics	= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1303
		pkt->pkt_reason		= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1304
		new_pkt			= pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1305
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1306
		acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1307
		new_pkt = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1308
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1309
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1310
	/* step #2 : dma allocation/move */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1311
	if (bp && bp->b_bcount != 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1312
		if (acmd->cmd_dmahandle == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1313
			if (mrsas_dma_alloc(instance, pkt, bp, flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1314
			    callback) == DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1315
				if (new_pkt) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1316
					scsi_hba_pkt_free(ap, new_pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1317
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1318
				return ((struct scsi_pkt *)NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1319
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1320
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1321
			if (mrsas_dma_move(instance, pkt, bp) == DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1322
				return ((struct scsi_pkt *)NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1323
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1324
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1325
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1326
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1327
	return (pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1328
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1329
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1330
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1331
mrsas_tran_start(struct scsi_address *ap, register struct scsi_pkt *pkt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1332
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1333
	uchar_t 	cmd_done = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1334
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1335
	struct mrsas_instance	*instance = ADDR2MR(ap);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1336
	struct mrsas_cmd	*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1337
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1338
	if (instance->deadadapter == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1339
		con_log(CL_ANN1, (CE_WARN,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1340
		    "mrsas_tran_start: return TRAN_FATAL_ERROR "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1341
		    "for IO, as the HBA doesnt take any more IOs"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1342
		if (pkt) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1343
			pkt->pkt_reason		= CMD_DEV_GONE;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1344
			pkt->pkt_statistics	= STAT_DISCON;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1345
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1346
		return (TRAN_FATAL_ERROR);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1347
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1348
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1349
	if (instance->adapterresetinprogress) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1350
		con_log(CL_ANN1, (CE_NOTE, "Reset flag set, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1351
		    "returning mfi_pkt and setting TRAN_BUSY\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1352
		return (TRAN_BUSY);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1353
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1354
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1355
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d:SCSI CDB[0]=0x%x time:%x",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1356
	    __func__, __LINE__, pkt->pkt_cdbp[0], pkt->pkt_time));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1357
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1358
	pkt->pkt_reason	= CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1359
	*pkt->pkt_scbp = STATUS_GOOD; /* clear arq scsi_status */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1360
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1361
	cmd = build_cmd(instance, ap, pkt, &cmd_done);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1362
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1363
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1364
	 * Check if the command is already completed by the mrsas_build_cmd()
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1365
	 * routine. In which case the busy_flag would be clear and scb will be
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1366
	 * NULL and appropriate reason provided in pkt_reason field
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1367
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1368
	if (cmd_done) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1369
		pkt->pkt_reason = CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1370
		pkt->pkt_scbp[0] = STATUS_GOOD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1371
		pkt->pkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1372
		    | STATE_SENT_CMD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1373
		if (((pkt->pkt_flags & FLAG_NOINTR) == 0) && pkt->pkt_comp) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1374
			(*pkt->pkt_comp)(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1375
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1376
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1377
		return (TRAN_ACCEPT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1378
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1379
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1380
	if (cmd == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1381
		return (TRAN_BUSY);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1382
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1383
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1384
	if ((pkt->pkt_flags & FLAG_NOINTR) == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1385
		if (instance->fw_outstanding > instance->max_fw_cmds) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1386
			con_log(CL_ANN, (CE_CONT, "mr_sas:Firmware busy"));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  1387
			DTRACE_PROBE2(start_tran_err,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  1388
			    uint16_t, instance->fw_outstanding,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  1389
			    uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1390
			return_mfi_pkt(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1391
			return (TRAN_BUSY);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1392
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1393
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1394
		/* Synchronize the Cmd frame for the controller */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1395
		(void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle, 0, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1396
		    DDI_DMA_SYNC_FORDEV);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1397
		con_log(CL_ANN1, (CE_NOTE, "Push SCSI CDB[0]=0x%x"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1398
		    "cmd->index:%x\n", pkt->pkt_cdbp[0], cmd->index));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1399
		instance->func_ptr->issue_cmd(cmd, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1400
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1401
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1402
		struct mrsas_header *hdr = &cmd->frame->hdr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1403
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1404
		cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1405
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1406
		instance->func_ptr-> issue_cmd_in_poll_mode(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1407
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1408
		pkt->pkt_reason		= CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1409
		pkt->pkt_statistics	= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1410
		pkt->pkt_state |= STATE_XFERRED_DATA | STATE_GOT_STATUS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1411
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1412
		switch (ddi_get8(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1413
		    &hdr->cmd_status)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1414
		case MFI_STAT_OK:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1415
			pkt->pkt_scbp[0] = STATUS_GOOD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1416
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1417
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1418
		case MFI_STAT_SCSI_DONE_WITH_ERROR:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1419
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1420
			pkt->pkt_reason	= CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1421
			pkt->pkt_statistics = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1422
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1423
			((struct scsi_status *)pkt->pkt_scbp)->sts_chk = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1424
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1425
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1426
		case MFI_STAT_DEVICE_NOT_FOUND:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1427
			pkt->pkt_reason		= CMD_DEV_GONE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1428
			pkt->pkt_statistics	= STAT_DISCON;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1429
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1430
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1431
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1432
			((struct scsi_status *)pkt->pkt_scbp)->sts_busy = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1433
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1434
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  1435
		(void) mrsas_common_check(instance, cmd);
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  1436
		DTRACE_PROBE2(start_nointr_done, uint8_t, hdr->cmd,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  1437
		    uint8_t, hdr->cmd_status);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1438
		return_mfi_pkt(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1439
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1440
		if (pkt->pkt_comp) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1441
			(*pkt->pkt_comp)(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1442
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1443
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1444
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1445
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1446
	return (TRAN_ACCEPT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1447
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1448
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1449
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1450
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1451
mrsas_tran_abort(struct scsi_address *ap, struct scsi_pkt *pkt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1452
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1453
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1454
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1455
	/* abort command not supported by H/W */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1456
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1457
	return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1458
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1459
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1460
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1461
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1462
mrsas_tran_reset(struct scsi_address *ap, int level)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1463
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1464
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1465
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1466
	/* reset command not supported by H/W */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1467
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1468
	return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1469
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1470
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1471
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1472
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1473
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1474
mrsas_tran_getcap(struct scsi_address *ap, char *cap, int whom)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1475
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1476
	int	rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1477
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1478
	struct mrsas_instance	*instance = ADDR2MR(ap);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1479
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1480
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1481
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1482
	/* we do allow inquiring about capabilities for other targets */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1483
	if (cap == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1484
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1485
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1486
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1487
	switch (scsi_hba_lookup_capstr(cap)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1488
	case SCSI_CAP_DMA_MAX:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1489
		/* Limit to 16MB max transfer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1490
		rval = mrsas_max_cap_maxxfer;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1491
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1492
	case SCSI_CAP_MSG_OUT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1493
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1494
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1495
	case SCSI_CAP_DISCONNECT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1496
		rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1497
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1498
	case SCSI_CAP_SYNCHRONOUS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1499
		rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1500
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1501
	case SCSI_CAP_WIDE_XFER:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1502
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1503
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1504
	case SCSI_CAP_TAGGED_QING:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1505
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1506
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1507
	case SCSI_CAP_UNTAGGED_QING:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1508
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1509
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1510
	case SCSI_CAP_PARITY:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1511
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1512
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1513
	case SCSI_CAP_INITIATOR_ID:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1514
		rval = instance->init_id;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1515
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1516
	case SCSI_CAP_ARQ:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1517
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1518
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1519
	case SCSI_CAP_LINKED_CMDS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1520
		rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1521
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1522
	case SCSI_CAP_RESET_NOTIFICATION:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1523
		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1524
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1525
	case SCSI_CAP_GEOMETRY:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1526
		rval = -1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1527
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1528
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1529
	default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1530
		con_log(CL_DLEVEL2, (CE_NOTE, "Default cap coming 0x%x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1531
		    scsi_hba_lookup_capstr(cap)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1532
		rval = -1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1533
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1534
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1535
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1536
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1537
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1538
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1539
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1540
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1541
mrsas_tran_setcap(struct scsi_address *ap, char *cap, int value, int whom)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1542
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1543
	int		rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1544
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1545
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1546
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1547
	/* We don't allow setting capabilities for other targets */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1548
	if (cap == NULL || whom == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1549
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1550
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1551
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1552
	switch (scsi_hba_lookup_capstr(cap)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1553
		case SCSI_CAP_DMA_MAX:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1554
		case SCSI_CAP_MSG_OUT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1555
		case SCSI_CAP_PARITY:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1556
		case SCSI_CAP_LINKED_CMDS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1557
		case SCSI_CAP_RESET_NOTIFICATION:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1558
		case SCSI_CAP_DISCONNECT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1559
		case SCSI_CAP_SYNCHRONOUS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1560
		case SCSI_CAP_UNTAGGED_QING:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1561
		case SCSI_CAP_WIDE_XFER:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1562
		case SCSI_CAP_INITIATOR_ID:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1563
		case SCSI_CAP_ARQ:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1564
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1565
			 * None of these are settable via
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1566
			 * the capability interface.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1567
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1568
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1569
		case SCSI_CAP_TAGGED_QING:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1570
			rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1571
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1572
		case SCSI_CAP_SECTOR_SIZE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1573
			rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1574
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1575
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1576
		case SCSI_CAP_TOTAL_SECTORS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1577
			rval = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1578
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1579
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1580
			rval = -1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1581
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1582
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1583
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1584
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1585
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1586
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1587
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1588
mrsas_tran_destroy_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1589
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1590
	struct scsa_cmd *acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1591
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1592
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1593
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1594
	if (acmd->cmd_flags & CFLAG_DMAVALID) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1595
		acmd->cmd_flags &= ~CFLAG_DMAVALID;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1596
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1597
		(void) ddi_dma_unbind_handle(acmd->cmd_dmahandle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1598
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1599
		ddi_dma_free_handle(&acmd->cmd_dmahandle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1600
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1601
		acmd->cmd_dmahandle = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1602
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1603
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1604
	/* free the pkt */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1605
	scsi_hba_pkt_free(ap, pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1606
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1607
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1608
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1609
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1610
mrsas_tran_dmafree(struct scsi_address *ap, struct scsi_pkt *pkt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1611
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1612
	register struct scsa_cmd *acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1613
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1614
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1615
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1616
	if (acmd->cmd_flags & CFLAG_DMAVALID) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1617
		acmd->cmd_flags &= ~CFLAG_DMAVALID;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1618
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1619
		(void) ddi_dma_unbind_handle(acmd->cmd_dmahandle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1620
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1621
		ddi_dma_free_handle(&acmd->cmd_dmahandle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1622
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1623
		acmd->cmd_dmahandle = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1624
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1625
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1626
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1627
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1628
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1629
mrsas_tran_sync_pkt(struct scsi_address *ap, struct scsi_pkt *pkt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1630
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1631
	register struct scsa_cmd	*acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1632
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1633
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1634
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1635
	if (acmd->cmd_flags & CFLAG_DMAVALID) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1636
		(void) ddi_dma_sync(acmd->cmd_dmahandle, acmd->cmd_dma_offset,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1637
		    acmd->cmd_dma_len, (acmd->cmd_flags & CFLAG_DMASEND) ?
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1638
		    DDI_DMA_SYNC_FORDEV : DDI_DMA_SYNC_FORCPU);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1639
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1640
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1641
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1642
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1643
 * mrsas_isr(caddr_t)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1644
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1645
 * The Interrupt Service Routine
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1646
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1647
 * Collect status for all completed commands and do callback
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1648
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1649
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1650
static uint_t
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1651
mrsas_isr(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1652
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1653
	int		need_softintr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1654
	uint32_t	producer;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1655
	uint32_t	consumer;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1656
	uint32_t	context;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1657
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1658
	struct mrsas_cmd	*cmd;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1659
	struct mrsas_header	*hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1660
	struct scsi_pkt		*pkt;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1661
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1662
	ASSERT(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1663
	if ((instance->intr_type == DDI_INTR_TYPE_FIXED) &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1664
	    !instance->func_ptr->intr_ack(instance)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1665
		return (DDI_INTR_UNCLAIMED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1666
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1667
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1668
	(void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1669
	    0, 0, DDI_DMA_SYNC_FORCPU);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1670
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1671
	if (mrsas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1672
	    != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1673
		mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1674
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1675
		con_log(CL_ANN1, (CE_WARN,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1676
		    "mr_sas_isr(): FMA check, returning DDI_INTR_UNCLAIMED"));
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  1677
		return (DDI_INTR_CLAIMED);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1678
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1679
	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1680
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1681
#ifdef OCRDEBUG
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1682
	if (debug_consecutive_timeout_after_ocr_g == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1683
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1684
		"simulating consecutive timeout after ocr"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1685
		return (DDI_INTR_CLAIMED);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1686
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1687
#endif
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1688
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1689
	mutex_enter(&instance->completed_pool_mtx);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1690
	mutex_enter(&instance->cmd_pend_mtx);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1691
12638
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1692
	producer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1693
	    instance->producer);
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1694
	consumer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1695
	    instance->consumer);
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1696
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1697
	con_log(CL_ANN1, (CE_NOTE, " producer %x consumer %x ",
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1698
	    producer, consumer));
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1699
	if (producer == consumer) {
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1700
		con_log(CL_ANN1, (CE_WARN, "producer =  consumer case"));
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1701
		DTRACE_PROBE2(isr_pc_err, uint32_t, producer,
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1702
		    uint32_t, consumer);
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1703
		mutex_exit(&instance->cmd_pend_mtx);
12638
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1704
		mutex_exit(&instance->completed_pool_mtx);
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1705
		return (DDI_INTR_CLAIMED);
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1706
	}
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1707
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1708
	while (consumer != producer) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1709
		context = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1710
		    &instance->reply_queue[consumer]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1711
		cmd = instance->cmd_list[context];
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1712
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1713
		if (cmd->sync_cmd == MRSAS_TRUE) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1714
		hdr = (struct mrsas_header *)&cmd->frame->hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1715
		if (hdr) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1716
			mlist_del_init(&cmd->list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1717
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1718
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1719
			pkt = cmd->pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1720
			if (pkt) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1721
				mlist_del_init(&cmd->list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1722
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1723
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1724
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1725
		mlist_add_tail(&cmd->list, &instance->completed_pool_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1726
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1727
		consumer++;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1728
		if (consumer == (instance->max_fw_cmds + 1)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1729
			consumer = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1730
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1731
	}
12638
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1732
	ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
4cce88587bfc 6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 12356
diff changeset
  1733
	    instance->consumer, consumer);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1734
	mutex_exit(&instance->cmd_pend_mtx);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1735
	mutex_exit(&instance->completed_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1736
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1737
	(void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1738
	    0, 0, DDI_DMA_SYNC_FORDEV);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1739
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1740
	if (instance->softint_running) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1741
		need_softintr = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1742
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1743
		need_softintr = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1744
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1745
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1746
	if (instance->isr_level == HIGH_LEVEL_INTR) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1747
		if (need_softintr) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1748
			ddi_trigger_softintr(instance->soft_intr_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1749
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1750
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1751
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1752
		 * Not a high-level interrupt, therefore call the soft level
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1753
		 * interrupt explicitly
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1754
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1755
		(void) mrsas_softintr(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1756
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1757
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1758
	return (DDI_INTR_CLAIMED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1759
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1760
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1761
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1762
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1763
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1764
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1765
 *                                  libraries                                 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1766
 *                                                                            *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1767
 * ************************************************************************** *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1768
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1769
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1770
 * get_mfi_pkt : Get a command from the free pool
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1771
 * After successful allocation, the caller of this routine
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1772
 * must clear the frame buffer (memset to zero) before
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1773
 * using the packet further.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1774
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1775
 * ***** Note *****
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1776
 * After clearing the frame buffer the context id of the
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1777
 * frame buffer SHOULD be restored back.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1778
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1779
static struct mrsas_cmd *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1780
get_mfi_pkt(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1781
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1782
	mlist_t 		*head = &instance->cmd_pool_list;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1783
	struct mrsas_cmd	*cmd = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1784
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1785
	mutex_enter(&instance->cmd_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1786
	ASSERT(mutex_owned(&instance->cmd_pool_mtx));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1787
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1788
	if (!mlist_empty(head)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1789
		cmd = mlist_entry(head->next, struct mrsas_cmd, list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1790
		mlist_del_init(head->next);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1791
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1792
	if (cmd != NULL) {
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1793
		cmd->pkt = NULL;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1794
		cmd->retry_count_for_ocr = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1795
		cmd->drv_pkt_time = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1796
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1797
	mutex_exit(&instance->cmd_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1798
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1799
	return (cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1800
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1801
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1802
static struct mrsas_cmd *
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1803
get_mfi_app_pkt(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1804
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1805
	mlist_t				*head = &instance->app_cmd_pool_list;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1806
	struct mrsas_cmd	*cmd = NULL;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1807
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1808
	mutex_enter(&instance->app_cmd_pool_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1809
	ASSERT(mutex_owned(&instance->app_cmd_pool_mtx));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1810
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1811
	if (!mlist_empty(head)) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1812
		cmd = mlist_entry(head->next, struct mrsas_cmd, list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1813
		mlist_del_init(head->next);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1814
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1815
	if (cmd != NULL)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1816
		cmd->pkt = NULL;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1817
	mutex_exit(&instance->app_cmd_pool_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1818
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1819
	return (cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1820
}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1821
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1822
 * return_mfi_pkt : Return a cmd to free command pool
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1823
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1824
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1825
return_mfi_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1826
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1827
	mutex_enter(&instance->cmd_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1828
	ASSERT(mutex_owned(&instance->cmd_pool_mtx));
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1829
	/* use mlist_add_tail for debug assistance */
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1830
	mlist_add_tail(&cmd->list, &instance->cmd_pool_list);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1831
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1832
	mutex_exit(&instance->cmd_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1833
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  1834
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1835
static void
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1836
return_mfi_app_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1837
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1838
	mutex_enter(&instance->app_cmd_pool_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1839
	ASSERT(mutex_owned(&instance->app_cmd_pool_mtx));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1840
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1841
	mlist_add(&cmd->list, &instance->app_cmd_pool_list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1842
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1843
	mutex_exit(&instance->app_cmd_pool_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1844
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1845
static void
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1846
push_pending_mfi_pkt(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1847
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1848
	struct scsi_pkt *pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1849
	struct mrsas_header	*hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1850
	con_log(CL_ANN1, (CE_NOTE, "push_pending_pkt(): Called\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1851
	mutex_enter(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1852
	ASSERT(mutex_owned(&instance->cmd_pend_mtx));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1853
	mlist_del_init(&cmd->list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1854
	mlist_add_tail(&cmd->list, &instance->cmd_pend_list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1855
	if (cmd->sync_cmd == MRSAS_TRUE) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1856
		hdr = (struct mrsas_header *)&cmd->frame->hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1857
		if (hdr) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1858
			con_log(CL_ANN1, (CE_CONT,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1859
			    "push_pending_mfi_pkt: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1860
			    "cmd %p index %x "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1861
			    "time %llx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1862
			    (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1863
			    gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1864
			/* Wait for specified interval  */
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1865
			cmd->drv_pkt_time = ddi_get16(
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1866
			    cmd->frame_dma_obj.acc_handle, &hdr->timeout);
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1867
			if (cmd->drv_pkt_time < debug_timeout_g)
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1868
				cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1869
			con_log(CL_ANN1, (CE_CONT,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1870
			    "push_pending_pkt(): "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1871
			    "Called IO Timeout Value %x\n",
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1872
			    cmd->drv_pkt_time));
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1873
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1874
		if (hdr && instance->timeout_id == (timeout_id_t)-1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1875
			instance->timeout_id = timeout(io_timeout_checker,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1876
			    (void *) instance, drv_usectohz(MRSAS_1_SECOND));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1877
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1878
	} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1879
		pkt = cmd->pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1880
		if (pkt) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1881
			con_log(CL_ANN1, (CE_CONT,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1882
			    "push_pending_mfi_pkt: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1883
			    "cmd %p index %x pkt %p, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1884
			    "time %llx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1885
			    (void *)cmd, cmd->index, (void *)pkt,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1886
			    gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1887
			cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1888
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1889
		if (pkt && instance->timeout_id == (timeout_id_t)-1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1890
			instance->timeout_id = timeout(io_timeout_checker,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1891
			    (void *) instance, drv_usectohz(MRSAS_1_SECOND));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1892
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1893
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1894
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1895
	mutex_exit(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1896
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1897
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1898
static int
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1899
mrsas_print_pending_cmds(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1900
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1901
	mlist_t *head = &instance->cmd_pend_list;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1902
	mlist_t *tmp = head;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1903
	struct mrsas_cmd *cmd = NULL;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1904
	struct mrsas_header	*hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1905
	unsigned int		flag = 1;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1906
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1907
	struct scsi_pkt *pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1908
	con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1909
	    "mrsas_print_pending_cmds(): Called"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1910
	while (flag) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1911
		mutex_enter(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1912
		tmp	=	tmp->next;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1913
		if (tmp == head) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1914
			mutex_exit(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1915
			flag = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1916
			break;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1917
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1918
			cmd = mlist_entry(tmp, struct mrsas_cmd, list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1919
			mutex_exit(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1920
			if (cmd) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1921
				if (cmd->sync_cmd == MRSAS_TRUE) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1922
				hdr = (struct mrsas_header *)&cmd->frame->hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1923
					if (hdr) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1924
					con_log(CL_ANN1, (CE_CONT,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1925
					    "print: cmd %p index %x hdr %p",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1926
					    (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1927
					    (void *)hdr));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1928
					}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1929
				} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1930
					pkt = cmd->pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1931
					if (pkt) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1932
					con_log(CL_ANN1, (CE_CONT,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1933
					    "print: cmd %p index %x "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1934
					    "pkt %p", (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1935
					    (void *)pkt));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1936
					}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1937
				}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1938
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1939
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1940
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1941
	con_log(CL_ANN1, (CE_NOTE, "mrsas_print_pending_cmds(): Done\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1942
	return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1943
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1944
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1945
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1946
static int
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1947
mrsas_complete_pending_cmds(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1948
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1949
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1950
	struct mrsas_cmd *cmd = NULL;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1951
	struct scsi_pkt *pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1952
	struct mrsas_header *hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1953
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1954
	struct mlist_head		*pos, *next;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1955
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1956
	con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1957
	    "mrsas_complete_pending_cmds(): Called"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1958
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1959
	mutex_enter(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1960
	mlist_for_each_safe(pos, next, &instance->cmd_pend_list) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1961
		cmd = mlist_entry(pos, struct mrsas_cmd, list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1962
		if (cmd) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1963
			pkt = cmd->pkt;
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  1964
			if (pkt) { /* for IO */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1965
				if (((pkt->pkt_flags & FLAG_NOINTR)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1966
				    == 0) && pkt->pkt_comp) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1967
					pkt->pkt_reason
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1968
					    = CMD_DEV_GONE;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1969
					pkt->pkt_statistics
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1970
					    = STAT_DISCON;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1971
					con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1972
					    "fail and posting to scsa "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1973
					    "cmd %p index %x"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1974
					    " pkt %p "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1975
					    "time : %llx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1976
					    (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1977
					    (void *)pkt, gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1978
					(*pkt->pkt_comp)(pkt);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1979
				}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1980
			} else { /* for DCMDS */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1981
				if (cmd->sync_cmd == MRSAS_TRUE) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1982
				hdr = (struct mrsas_header *)&cmd->frame->hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1983
				con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1984
				    "posting invalid status to application "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1985
				    "cmd %p index %x"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1986
				    " hdr %p "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1987
				    "time : %llx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1988
				    (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1989
				    (void *)hdr, gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1990
				hdr->cmd_status = MFI_STAT_INVALID_STATUS;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1991
				complete_cmd_in_sync_mode(instance, cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1992
				}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1993
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1994
			mlist_del_init(&cmd->list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1995
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1996
			con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1997
			    "mrsas_complete_pending_cmds:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1998
			    "NULL command\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  1999
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2000
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2001
		    "mrsas_complete_pending_cmds:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2002
		    "looping for more commands\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2003
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2004
	mutex_exit(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2005
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2006
	con_log(CL_ANN1, (CE_NOTE, "mrsas_complete_pending_cmds(): DONE\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2007
	return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2008
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2009
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2010
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2011
static int
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2012
mrsas_issue_pending_cmds(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2013
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2014
	mlist_t *head	=	&instance->cmd_pend_list;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2015
	mlist_t *tmp	=	head->next;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2016
	struct mrsas_cmd *cmd = NULL;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2017
	struct scsi_pkt *pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2018
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2019
	con_log(CL_ANN1, (CE_NOTE, "mrsas_issue_pending_cmds(): Called"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2020
	while (tmp != head) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2021
		mutex_enter(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2022
		cmd = mlist_entry(tmp, struct mrsas_cmd, list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2023
		tmp = tmp->next;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2024
		mutex_exit(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2025
		if (cmd) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2026
			con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2027
			    "mrsas_issue_pending_cmds(): "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2028
			    "Got a cmd: cmd:%p\n", (void *)cmd));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2029
			cmd->retry_count_for_ocr++;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2030
			con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2031
			    "mrsas_issue_pending_cmds(): "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2032
			    "cmd retry count = %d\n",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2033
			    cmd->retry_count_for_ocr));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2034
			if (cmd->retry_count_for_ocr > IO_RETRY_COUNT) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2035
				con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2036
				    "mrsas_issue_pending_cmds():"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2037
				    "Calling Kill Adapter\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2038
				(void) mrsas_kill_adapter(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2039
				return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2040
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2041
			pkt = cmd->pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2042
			if (pkt) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2043
				con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2044
				    "PENDING ISSUE: cmd %p index %x "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2045
				    "pkt %p time %llx",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2046
				    (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2047
				    (void *)pkt,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2048
				    gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2049
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2050
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2051
			if (cmd->sync_cmd == MRSAS_TRUE) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2052
				instance->func_ptr->issue_cmd_in_sync_mode(
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2053
				    instance, cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2054
			} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2055
				instance->func_ptr->issue_cmd(cmd, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2056
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2057
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2058
			con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2059
			    "mrsas_issue_pending_cmds: NULL command\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2060
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2061
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2062
		    "mrsas_issue_pending_cmds:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2063
		    "looping for more commands"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2064
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2065
	con_log(CL_ANN1, (CE_NOTE, "mrsas_issue_pending_cmds(): DONE\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2066
	return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2067
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2068
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2069
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2070
 * destroy_mfi_frame_pool
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2071
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2072
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2073
destroy_mfi_frame_pool(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2074
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2075
	int		i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2076
	uint32_t	max_cmd = instance->max_fw_cmds;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2077
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2078
	struct mrsas_cmd	*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2079
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2080
	/* return all frames to pool */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2081
	for (i = 0; i < max_cmd+1; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2082
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2083
		cmd = instance->cmd_list[i];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2084
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2085
		if (cmd->frame_dma_obj_status == DMA_OBJ_ALLOCATED)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2086
			(void) mrsas_free_dma_obj(instance, cmd->frame_dma_obj);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2087
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2088
		cmd->frame_dma_obj_status  = DMA_OBJ_FREED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2089
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2090
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2091
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2092
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2093
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2094
 * create_mfi_frame_pool
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2095
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2096
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2097
create_mfi_frame_pool(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2098
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2099
	int		i = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2100
	int		cookie_cnt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2101
	uint16_t	max_cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2102
	uint16_t	sge_sz;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2103
	uint32_t	sgl_sz;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2104
	uint32_t	tot_frame_size;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2105
	struct mrsas_cmd	*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2106
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2107
	max_cmd = instance->max_fw_cmds;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2108
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2109
	sge_sz	= sizeof (struct mrsas_sge_ieee);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2110
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2111
	/* calculated the number of 64byte frames required for SGL */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2112
	sgl_sz		= sge_sz * instance->max_num_sge;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2113
	tot_frame_size	= sgl_sz + MRMFI_FRAME_SIZE + SENSE_LENGTH;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2114
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2115
	con_log(CL_DLEVEL3, (CE_NOTE, "create_mfi_frame_pool: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2116
	    "sgl_sz %x tot_frame_size %x", sgl_sz, tot_frame_size));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2117
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2118
	while (i < max_cmd+1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2119
		cmd = instance->cmd_list[i];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2120
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2121
		cmd->frame_dma_obj.size	= tot_frame_size;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2122
		cmd->frame_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2123
		cmd->frame_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2124
		cmd->frame_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2125
		cmd->frame_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2126
		cmd->frame_dma_obj.dma_attr.dma_attr_align = 64;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2127
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2128
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2129
		cookie_cnt = mrsas_alloc_dma_obj(instance, &cmd->frame_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2130
		    (uchar_t)DDI_STRUCTURE_LE_ACC);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2131
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2132
		if (cookie_cnt == -1 || cookie_cnt > 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2133
			con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2134
			    "create_mfi_frame_pool: could not alloc."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2135
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2136
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2137
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2138
		bzero(cmd->frame_dma_obj.buffer, tot_frame_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2139
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2140
		cmd->frame_dma_obj_status = DMA_OBJ_ALLOCATED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2141
		cmd->frame = (union mrsas_frame *)cmd->frame_dma_obj.buffer;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2142
		cmd->frame_phys_addr =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2143
		    cmd->frame_dma_obj.dma_cookie[0].dmac_address;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2144
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2145
		cmd->sense = (uint8_t *)(((unsigned long)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2146
		    cmd->frame_dma_obj.buffer) +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2147
		    tot_frame_size - SENSE_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2148
		cmd->sense_phys_addr =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2149
		    cmd->frame_dma_obj.dma_cookie[0].dmac_address +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2150
		    tot_frame_size - SENSE_LENGTH;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2151
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2152
		if (!cmd->frame || !cmd->sense) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2153
			con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2154
			    "mr_sas: pci_pool_alloc failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2155
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2156
			return (ENOMEM);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2157
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2158
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2159
		ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2160
		    &cmd->frame->io.context, cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2161
		i++;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2162
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2163
		con_log(CL_DLEVEL3, (CE_NOTE, "[%x]-%x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2164
		    cmd->index, cmd->frame_phys_addr));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2165
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2166
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2167
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2168
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2169
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2170
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2171
 * free_additional_dma_buffer
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2172
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2173
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2174
free_additional_dma_buffer(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2175
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2176
	if (instance->mfi_internal_dma_obj.status == DMA_OBJ_ALLOCATED) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2177
		(void) mrsas_free_dma_obj(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2178
		    instance->mfi_internal_dma_obj);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2179
		instance->mfi_internal_dma_obj.status = DMA_OBJ_FREED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2180
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2181
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2182
	if (instance->mfi_evt_detail_obj.status == DMA_OBJ_ALLOCATED) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2183
		(void) mrsas_free_dma_obj(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2184
		    instance->mfi_evt_detail_obj);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2185
		instance->mfi_evt_detail_obj.status = DMA_OBJ_FREED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2186
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2187
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2188
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2189
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2190
 * alloc_additional_dma_buffer
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2191
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2192
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2193
alloc_additional_dma_buffer(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2194
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2195
	uint32_t	reply_q_sz;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2196
	uint32_t	internal_buf_size = PAGESIZE*2;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2197
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2198
	/* max cmds plus 1 + producer & consumer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2199
	reply_q_sz = sizeof (uint32_t) * (instance->max_fw_cmds + 1 + 2);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2200
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2201
	instance->mfi_internal_dma_obj.size = internal_buf_size;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2202
	instance->mfi_internal_dma_obj.dma_attr	= mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2203
	instance->mfi_internal_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2204
	instance->mfi_internal_dma_obj.dma_attr.dma_attr_count_max =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2205
	    0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2206
	instance->mfi_internal_dma_obj.dma_attr.dma_attr_sgllen	= 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2207
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2208
	if (mrsas_alloc_dma_obj(instance, &instance->mfi_internal_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2209
	    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2210
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2211
		    "mr_sas: could not alloc reply queue"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2212
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2213
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2214
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2215
	bzero(instance->mfi_internal_dma_obj.buffer, internal_buf_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2216
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2217
	instance->mfi_internal_dma_obj.status |= DMA_OBJ_ALLOCATED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2218
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2219
	instance->producer = (uint32_t *)((unsigned long)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2220
	    instance->mfi_internal_dma_obj.buffer);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2221
	instance->consumer = (uint32_t *)((unsigned long)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2222
	    instance->mfi_internal_dma_obj.buffer + 4);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2223
	instance->reply_queue = (uint32_t *)((unsigned long)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2224
	    instance->mfi_internal_dma_obj.buffer + 8);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2225
	instance->internal_buf = (caddr_t)(((unsigned long)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2226
	    instance->mfi_internal_dma_obj.buffer) + reply_q_sz + 8);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2227
	instance->internal_buf_dmac_add =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2228
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2229
	    (reply_q_sz + 8);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2230
	instance->internal_buf_size = internal_buf_size -
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2231
	    (reply_q_sz + 8);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2232
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2233
	/* allocate evt_detail */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2234
	instance->mfi_evt_detail_obj.size = sizeof (struct mrsas_evt_detail);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2235
	instance->mfi_evt_detail_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2236
	instance->mfi_evt_detail_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2237
	instance->mfi_evt_detail_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2238
	instance->mfi_evt_detail_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2239
	instance->mfi_evt_detail_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2240
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2241
	if (mrsas_alloc_dma_obj(instance, &instance->mfi_evt_detail_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2242
	    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2243
		con_log(CL_ANN, (CE_WARN, "alloc_additional_dma_buffer: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2244
		    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2245
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2246
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2247
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2248
	bzero(instance->mfi_evt_detail_obj.buffer,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2249
	    sizeof (struct mrsas_evt_detail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2250
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2251
	instance->mfi_evt_detail_obj.status |= DMA_OBJ_ALLOCATED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2252
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2253
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2254
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2255
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2256
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2257
 * free_space_for_mfi
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2258
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2259
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2260
free_space_for_mfi(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2261
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2262
	int		i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2263
	uint32_t	max_cmd = instance->max_fw_cmds;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2264
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2265
	/* already freed */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2266
	if (instance->cmd_list == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2267
		return;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2268
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2269
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2270
	free_additional_dma_buffer(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2271
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2272
	/* first free the MFI frame pool */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2273
	destroy_mfi_frame_pool(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2274
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2275
	/* free all the commands in the cmd_list */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2276
	for (i = 0; i < instance->max_fw_cmds+1; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2277
		kmem_free(instance->cmd_list[i],
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2278
		    sizeof (struct mrsas_cmd));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2279
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2280
		instance->cmd_list[i] = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2281
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2282
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2283
	/* free the cmd_list buffer itself */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2284
	kmem_free(instance->cmd_list,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2285
	    sizeof (struct mrsas_cmd *) * (max_cmd+1));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2286
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2287
	instance->cmd_list = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2288
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2289
	INIT_LIST_HEAD(&instance->cmd_pool_list);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2290
	INIT_LIST_HEAD(&instance->app_cmd_pool_list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2291
	INIT_LIST_HEAD(&instance->cmd_pend_list);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2292
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2293
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2294
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2295
 * alloc_space_for_mfi
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2296
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2297
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2298
alloc_space_for_mfi(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2299
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2300
	int		i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2301
	uint32_t	max_cmd;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2302
	uint32_t	reserve_cmd;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2303
	size_t		sz;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2304
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2305
	struct mrsas_cmd	*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2306
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2307
	max_cmd = instance->max_fw_cmds;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2308
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2309
	/* reserve 1 more slot for flush_cache */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2310
	sz = sizeof (struct mrsas_cmd *) * (max_cmd+1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2311
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2312
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2313
	 * instance->cmd_list is an array of struct mrsas_cmd pointers.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2314
	 * Allocate the dynamic array first and then allocate individual
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2315
	 * commands.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2316
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2317
	instance->cmd_list = kmem_zalloc(sz, KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2318
	ASSERT(instance->cmd_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2319
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2320
	for (i = 0; i < max_cmd+1; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2321
		instance->cmd_list[i] = kmem_zalloc(sizeof (struct mrsas_cmd),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2322
		    KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2323
		ASSERT(instance->cmd_list[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2324
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2325
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2326
	INIT_LIST_HEAD(&instance->cmd_pool_list);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2327
	INIT_LIST_HEAD(&instance->cmd_pend_list);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2328
	/* add all the commands to command pool (instance->cmd_pool) */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2329
	reserve_cmd	=	APP_RESERVE_CMDS;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2330
	INIT_LIST_HEAD(&instance->app_cmd_pool_list);
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2331
	for (i = 0; i < reserve_cmd-1; i++) {
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2332
		cmd	= instance->cmd_list[i];
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2333
		cmd->index	= i;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2334
		mlist_add_tail(&cmd->list, &instance->app_cmd_pool_list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2335
	}
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2336
	/*
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2337
	 * reserve slot instance->cmd_list[APP_RESERVE_CMDS-1]
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2338
	 * for abort_aen_cmd
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2339
	 */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2340
	for (i = reserve_cmd; i < max_cmd; i++) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2341
		cmd			= instance->cmd_list[i];
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2342
		cmd->index	= i;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2343
		mlist_add_tail(&cmd->list, &instance->cmd_pool_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2344
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2345
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2346
	/* single slot for flush_cache won't be added in command pool */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2347
	cmd		= instance->cmd_list[max_cmd];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2348
	cmd->index	= i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2349
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2350
	/* create a frame pool and assign one frame to each cmd */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2351
	if (create_mfi_frame_pool(instance)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2352
		con_log(CL_ANN, (CE_NOTE, "error creating frame DMA pool"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2353
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2354
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2355
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2356
	/* create a frame pool and assign one frame to each cmd */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2357
	if (alloc_additional_dma_buffer(instance)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2358
		con_log(CL_ANN, (CE_NOTE, "error creating frame DMA pool"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2359
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2360
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2361
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2362
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2363
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2364
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2365
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2366
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2367
 * get_ctrl_info
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2368
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2369
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2370
get_ctrl_info(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2371
    struct mrsas_ctrl_info *ctrl_info)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2372
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2373
	int	ret = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2374
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2375
	struct mrsas_cmd		*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2376
	struct mrsas_dcmd_frame	*dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2377
	struct mrsas_ctrl_info	*ci;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2378
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2379
	cmd = get_mfi_pkt(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2380
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2381
	if (!cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2382
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2383
		    "Failed to get a cmd for ctrl info"));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2384
		DTRACE_PROBE2(info_mfi_err, uint16_t, instance->fw_outstanding,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2385
		    uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2386
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2387
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2388
	cmd->retry_count_for_ocr = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2389
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2390
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2391
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2392
	    cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2393
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2394
	dcmd = &cmd->frame->dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2395
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2396
	ci = (struct mrsas_ctrl_info *)instance->internal_buf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2397
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2398
	if (!ci) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2399
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2400
		    "Failed to alloc mem for ctrl info"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2401
		return_mfi_pkt(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2402
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2403
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2404
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2405
	(void) memset(ci, 0, sizeof (struct mrsas_ctrl_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2406
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2407
	/* for( i = 0; i < DCMD_MBOX_SZ; i++ ) dcmd->mbox.b[i] = 0; */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2408
	(void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2409
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2410
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2411
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2412
	    MFI_CMD_STATUS_POLL_MODE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2413
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2414
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2415
	    MFI_FRAME_DIR_READ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2416
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2417
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2418
	    sizeof (struct mrsas_ctrl_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2419
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2420
	    MR_DCMD_CTRL_GET_INFO);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2421
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2422
	    instance->internal_buf_dmac_add);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2423
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2424
	    sizeof (struct mrsas_ctrl_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2425
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2426
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2427
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2428
	if (!instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2429
	ret = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2430
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2431
	ctrl_info->max_request_size = ddi_get32(
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2432
	    cmd->frame_dma_obj.acc_handle, &ci->max_request_size);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2433
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2434
	ctrl_info->ld_present_count = ddi_get16(
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2435
	    cmd->frame_dma_obj.acc_handle, &ci->ld_present_count);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2436
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2437
	ctrl_info->properties.on_off_properties =
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2438
	    ddi_get32(cmd->frame_dma_obj.acc_handle,
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2439
	    &ci->properties.on_off_properties);
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2440
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2441
	ddi_rep_get8(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2442
	    (uint8_t *)(ctrl_info->product_name),
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2443
	    (uint8_t *)(ci->product_name), 80 * sizeof (char),
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2444
	    DDI_DEV_AUTOINCR);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2445
	/* should get more members of ci with ddi_get when needed */
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2446
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2447
		con_log(CL_ANN, (CE_WARN, "get_ctrl_info: Ctrl info failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2448
		ret = -1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2449
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2450
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2451
	if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2452
		ret = -1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2453
	}
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2454
	return_mfi_pkt(instance, cmd);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2455
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2456
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2457
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2458
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2459
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2460
 * abort_aen_cmd
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2461
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2462
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2463
abort_aen_cmd(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2464
    struct mrsas_cmd *cmd_to_abort)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2465
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2466
	int	ret = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2467
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2468
	struct mrsas_cmd		*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2469
	struct mrsas_abort_frame	*abort_fr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2470
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2471
	cmd = instance->cmd_list[APP_RESERVE_CMDS-1];
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2472
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2473
	if (!cmd) {
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2474
		con_log(CL_ANN1, (CE_WARN,
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2475
		    "abort_aen_cmd():Failed to get a cmd for abort_aen_cmd"));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2476
		DTRACE_PROBE2(abort_mfi_err, uint16_t, instance->fw_outstanding,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2477
		    uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2478
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2479
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2480
	cmd->retry_count_for_ocr = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2481
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2482
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2483
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2484
	    cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2485
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2486
	abort_fr = &cmd->frame->abort;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2487
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2488
	/* prepare and issue the abort frame */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2489
	ddi_put8(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2490
	    &abort_fr->cmd, MFI_CMD_OP_ABORT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2491
	ddi_put8(cmd->frame_dma_obj.acc_handle, &abort_fr->cmd_status,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2492
	    MFI_CMD_STATUS_SYNC_MODE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2493
	ddi_put16(cmd->frame_dma_obj.acc_handle, &abort_fr->flags, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2494
	ddi_put32(cmd->frame_dma_obj.acc_handle, &abort_fr->abort_context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2495
	    cmd_to_abort->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2496
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2497
	    &abort_fr->abort_mfi_phys_addr_lo, cmd_to_abort->frame_phys_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2498
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2499
	    &abort_fr->abort_mfi_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2500
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2501
	instance->aen_cmd->abort_aen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2502
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2503
	cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2504
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2505
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2506
	if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2507
		con_log(CL_ANN1, (CE_WARN,
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2508
		    "abort_aen_cmd: issue_cmd_in_poll_mode failed"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2509
		ret = -1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2510
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2511
		ret = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2512
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2513
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2514
	instance->aen_cmd->abort_aen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2515
	instance->aen_cmd = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2516
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  2517
	atomic_add_16(&instance->fw_outstanding, (-1));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2518
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2519
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2520
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2521
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2522
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2523
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2524
 * init_mfi
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2525
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2526
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2527
init_mfi(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2528
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2529
	struct mrsas_cmd		*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2530
	struct mrsas_ctrl_info		ctrl_info;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2531
	struct mrsas_init_frame		*init_frame;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2532
	struct mrsas_init_queue_info	*initq_info;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2533
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2534
	/* we expect the FW state to be READY */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2535
	if (mfi_state_transition_to_ready(instance)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2536
		con_log(CL_ANN, (CE_WARN, "mr_sas: F/W is not ready"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2537
		goto fail_ready_state;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2538
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2539
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2540
	/* get various operational parameters from status register */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2541
	instance->max_num_sge =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2542
	    (instance->func_ptr->read_fw_status_reg(instance) &
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2543
	    0xFF0000) >> 0x10;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2544
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2545
	 * Reduce the max supported cmds by 1. This is to ensure that the
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2546
	 * reply_q_sz (1 more than the max cmd that driver may send)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2547
	 * does not exceed max cmds that the FW can support
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2548
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2549
	instance->max_fw_cmds =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2550
	    instance->func_ptr->read_fw_status_reg(instance) & 0xFFFF;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2551
	instance->max_fw_cmds = instance->max_fw_cmds - 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2552
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2553
	instance->max_num_sge =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2554
	    (instance->max_num_sge > MRSAS_MAX_SGE_CNT) ?
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2555
	    MRSAS_MAX_SGE_CNT : instance->max_num_sge;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2556
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2557
	/* create a pool of commands */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2558
	if (alloc_space_for_mfi(instance) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2559
		goto fail_alloc_fw_space;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2560
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2561
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2562
	 * Prepare a init frame. Note the init frame points to queue info
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2563
	 * structure. Each frame has SGL allocated after first 64 bytes. For
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2564
	 * this frame - since we don't need any SGL - we use SGL's space as
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2565
	 * queue info structure
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2566
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2567
	cmd = get_mfi_pkt(instance);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2568
	cmd->retry_count_for_ocr = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2569
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2570
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2571
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2572
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2573
	    cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2574
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2575
	init_frame = (struct mrsas_init_frame *)cmd->frame;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2576
	initq_info = (struct mrsas_init_queue_info *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2577
	    ((unsigned long)init_frame + 64);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2578
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2579
	(void) memset(init_frame, 0, MRMFI_FRAME_SIZE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2580
	(void) memset(initq_info, 0, sizeof (struct mrsas_init_queue_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2581
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2582
	ddi_put32(cmd->frame_dma_obj.acc_handle, &initq_info->init_flags, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2583
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2584
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2585
	    &initq_info->reply_queue_entries, instance->max_fw_cmds + 1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2586
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2587
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2588
	    &initq_info->producer_index_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2589
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2590
	    &initq_info->producer_index_phys_addr_lo,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2591
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2592
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2593
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2594
	    &initq_info->consumer_index_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2595
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2596
	    &initq_info->consumer_index_phys_addr_lo,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2597
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 4);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2598
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2599
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2600
	    &initq_info->reply_queue_start_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2601
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2602
	    &initq_info->reply_queue_start_phys_addr_lo,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2603
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 8);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2604
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2605
	ddi_put8(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2606
	    &init_frame->cmd, MFI_CMD_OP_INIT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2607
	ddi_put8(cmd->frame_dma_obj.acc_handle, &init_frame->cmd_status,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2608
	    MFI_CMD_STATUS_POLL_MODE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2609
	ddi_put16(cmd->frame_dma_obj.acc_handle, &init_frame->flags, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2610
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2611
	    &init_frame->queue_info_new_phys_addr_lo,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2612
	    cmd->frame_phys_addr + 64);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2613
	ddi_put32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2614
	    &init_frame->queue_info_new_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2615
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2616
	ddi_put32(cmd->frame_dma_obj.acc_handle, &init_frame->data_xfer_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2617
	    sizeof (struct mrsas_init_queue_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2618
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2619
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2620
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2621
	/* issue the init frame in polled mode */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2622
	if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2623
		con_log(CL_ANN, (CE_WARN, "failed to init firmware"));
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2624
		return_mfi_pkt(instance, cmd);
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2625
		goto fail_fw_init;
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2626
	}
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2627
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2628
	if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) {
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2629
		return_mfi_pkt(instance, cmd);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2630
		goto fail_fw_init;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2631
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2632
	return_mfi_pkt(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2633
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2634
	if (ctio_enable &&
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2635
	    (instance->func_ptr->read_fw_status_reg(instance) & 0x04000000)) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2636
		con_log(CL_ANN, (CE_NOTE, "mr_sas: IEEE SGL's supported"));
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2637
		instance->flag_ieee = 1;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2638
	} else {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2639
		instance->flag_ieee = 0;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2640
	}
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  2641
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2642
	instance->disable_online_ctrl_reset = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2643
	/* gather misc FW related information */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2644
	if (!get_ctrl_info(instance, &ctrl_info)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2645
		instance->max_sectors_per_req = ctrl_info.max_request_size;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2646
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2647
		    "product name %s ld present %d",
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2648
		    ctrl_info.product_name, ctrl_info.ld_present_count));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2649
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2650
		instance->max_sectors_per_req = instance->max_num_sge *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2651
		    PAGESIZE / 512;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2652
	}
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2653
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2654
	if (ctrl_info.properties.on_off_properties & DISABLE_OCR_PROP_FLAG)
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2655
		instance->disable_online_ctrl_reset = 1;
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  2656
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2657
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2658
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2659
fail_fw_init:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2660
fail_alloc_fw_space:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2661
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2662
	free_space_for_mfi(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2663
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2664
fail_ready_state:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2665
	ddi_regs_map_free(&instance->regmap_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2666
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2667
fail_mfi_reg_setup:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2668
	return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2669
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2670
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2671
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2672
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2673
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2674
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2675
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2676
static int
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2677
mrsas_issue_init_mfi(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2678
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2679
	struct mrsas_cmd		*cmd;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2680
	struct mrsas_init_frame		*init_frame;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2681
	struct mrsas_init_queue_info	*initq_info;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2682
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2683
/*
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2684
 * Prepare a init frame. Note the init frame points to queue info
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2685
 * structure. Each frame has SGL allocated after first 64 bytes. For
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2686
 * this frame - since we don't need any SGL - we use SGL's space as
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2687
 * queue info structure
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2688
 */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2689
	con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2690
	    "mrsas_issue_init_mfi: entry\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2691
	cmd = get_mfi_app_pkt(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2692
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2693
	if (!cmd) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2694
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2695
		    "mrsas_issue_init_mfi: get_pkt failed\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2696
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2697
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2698
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2699
	/* Clear the frame buffer and assign back the context id */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2700
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2701
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2702
	    cmd->index);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2703
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2704
	init_frame = (struct mrsas_init_frame *)cmd->frame;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2705
	initq_info = (struct mrsas_init_queue_info *)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2706
	    ((unsigned long)init_frame + 64);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2707
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2708
	(void) memset(init_frame, 0, MRMFI_FRAME_SIZE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2709
	(void) memset(initq_info, 0, sizeof (struct mrsas_init_queue_info));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2710
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2711
	ddi_put32(cmd->frame_dma_obj.acc_handle, &initq_info->init_flags, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2712
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2713
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2714
	    &initq_info->reply_queue_entries, instance->max_fw_cmds + 1);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2715
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2716
	    &initq_info->producer_index_phys_addr_hi, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2717
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2718
	    &initq_info->producer_index_phys_addr_lo,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2719
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2720
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2721
	    &initq_info->consumer_index_phys_addr_hi, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2722
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2723
	    &initq_info->consumer_index_phys_addr_lo,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2724
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 4);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2725
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2726
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2727
	    &initq_info->reply_queue_start_phys_addr_hi, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2728
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2729
	    &initq_info->reply_queue_start_phys_addr_lo,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2730
	    instance->mfi_internal_dma_obj.dma_cookie[0].dmac_address + 8);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2731
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2732
	ddi_put8(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2733
	    &init_frame->cmd, MFI_CMD_OP_INIT);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2734
	ddi_put8(cmd->frame_dma_obj.acc_handle, &init_frame->cmd_status,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2735
	    MFI_CMD_STATUS_POLL_MODE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2736
	ddi_put16(cmd->frame_dma_obj.acc_handle, &init_frame->flags, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2737
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2738
	    &init_frame->queue_info_new_phys_addr_lo,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2739
	    cmd->frame_phys_addr + 64);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2740
	ddi_put32(cmd->frame_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2741
	    &init_frame->queue_info_new_phys_addr_hi, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2742
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2743
	ddi_put32(cmd->frame_dma_obj.acc_handle, &init_frame->data_xfer_len,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2744
	    sizeof (struct mrsas_init_queue_info));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2745
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2746
	cmd->frame_count = 1;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2747
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2748
	/* issue the init frame in polled mode */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2749
	if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2750
		con_log(CL_ANN1, (CE_WARN,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2751
		    "mrsas_issue_init_mfi():failed to "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2752
		    "init firmware"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2753
		return_mfi_app_pkt(instance, cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2754
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2755
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2756
	return_mfi_app_pkt(instance, cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2757
	con_log(CL_ANN1, (CE_NOTE, "mrsas_issue_init_mfi: Done"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2758
	return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2759
}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2760
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2761
 * mfi_state_transition_to_ready	: Move the FW to READY state
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2762
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2763
 * @reg_set			: MFI register set
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2764
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2765
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2766
mfi_state_transition_to_ready(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2767
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2768
	int		i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2769
	uint8_t		max_wait;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2770
	uint32_t	fw_ctrl;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2771
	uint32_t	fw_state;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2772
	uint32_t	cur_state;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2773
	uint32_t	cur_abs_reg_val;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2774
	uint32_t	prev_abs_reg_val;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2775
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2776
	cur_abs_reg_val =
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2777
	    instance->func_ptr->read_fw_status_reg(instance);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2778
	fw_state =
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2779
	    cur_abs_reg_val & MFI_STATE_MASK;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2780
	con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2781
	    "mfi_state_transition_to_ready:FW state = 0x%x", fw_state));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2782
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2783
	while (fw_state != MFI_STATE_READY) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2784
		con_log(CL_ANN, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2785
		    "mfi_state_transition_to_ready:FW state%x", fw_state));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2786
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2787
		switch (fw_state) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2788
		case MFI_STATE_FAULT:
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2789
			con_log(CL_ANN1, (CE_NOTE,
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2790
			    "mr_sas: FW in FAULT state!!"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2791
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2792
			return (ENODEV);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2793
		case MFI_STATE_WAIT_HANDSHAKE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2794
			/* set the CLR bit in IMR0 */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2795
			con_log(CL_ANN1, (CE_NOTE,
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2796
			    "mr_sas: FW waiting for HANDSHAKE"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2797
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2798
			 * PCI_Hot Plug: MFI F/W requires
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2799
			 * (MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2800
			 * to be set
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2801
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2802
			/* WR_IB_MSG_0(MFI_INIT_CLEAR_HANDSHAKE, instance); */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2803
			WR_IB_DOORBELL(MFI_INIT_CLEAR_HANDSHAKE |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2804
			    MFI_INIT_HOTPLUG, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2805
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2806
			max_wait	= 2;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2807
			cur_state	= MFI_STATE_WAIT_HANDSHAKE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2808
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2809
		case MFI_STATE_BOOT_MESSAGE_PENDING:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2810
			/* set the CLR bit in IMR0 */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2811
			con_log(CL_ANN1, (CE_NOTE,
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2812
			    "mr_sas: FW state boot message pending"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2813
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2814
			 * PCI_Hot Plug: MFI F/W requires
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2815
			 * (MFI_INIT_CLEAR_HANDSHAKE|MFI_INIT_HOTPLUG)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2816
			 * to be set
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2817
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2818
			WR_IB_DOORBELL(MFI_INIT_HOTPLUG, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2819
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2820
			max_wait	= 10;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2821
			cur_state	= MFI_STATE_BOOT_MESSAGE_PENDING;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2822
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2823
		case MFI_STATE_OPERATIONAL:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2824
			/* bring it to READY state; assuming max wait 2 secs */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2825
			instance->func_ptr->disable_intr(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2826
			con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2827
			    "mr_sas: FW in OPERATIONAL state"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2828
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2829
			 * PCI_Hot Plug: MFI F/W requires
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2830
			 * (MFI_INIT_READY | MFI_INIT_MFIMODE | MFI_INIT_ABORT)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2831
			 * to be set
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2832
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2833
			/* WR_IB_DOORBELL(MFI_INIT_READY, instance); */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2834
			WR_IB_DOORBELL(MFI_RESET_FLAGS, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2835
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2836
			max_wait	= 10;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2837
			cur_state	= MFI_STATE_OPERATIONAL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2838
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2839
		case MFI_STATE_UNDEFINED:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2840
			/* this state should not last for more than 2 seconds */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2841
			con_log(CL_ANN1, (CE_NOTE, "FW state undefined"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2842
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2843
			max_wait	= 2;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2844
			cur_state	= MFI_STATE_UNDEFINED;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2845
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2846
		case MFI_STATE_BB_INIT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2847
			max_wait	= 2;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2848
			cur_state	= MFI_STATE_BB_INIT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2849
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2850
		case MFI_STATE_FW_INIT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2851
			max_wait	= 2;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2852
			cur_state	= MFI_STATE_FW_INIT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2853
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2854
		case MFI_STATE_DEVICE_SCAN:
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2855
			max_wait	= 180;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2856
			cur_state	= MFI_STATE_DEVICE_SCAN;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2857
			prev_abs_reg_val = cur_abs_reg_val;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2858
			con_log(CL_NONE, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2859
			    "Device scan in progress ...\n"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2860
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2861
		default:
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2862
			con_log(CL_ANN1, (CE_NOTE,
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2863
			    "mr_sas: Unknown state 0x%x", fw_state));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2864
			return (ENODEV);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2865
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2866
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2867
		/* the cur_state should not last for more than max_wait secs */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2868
		for (i = 0; i < (max_wait * MILLISEC); i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2869
			/* fw_state = RD_OB_MSG_0(instance) & MFI_STATE_MASK; */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2870
			cur_abs_reg_val =
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2871
			    instance->func_ptr->read_fw_status_reg(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2872
			fw_state = cur_abs_reg_val & MFI_STATE_MASK;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2873
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2874
			if (fw_state == cur_state) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2875
				delay(1 * drv_usectohz(MILLISEC));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2876
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2877
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2878
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2879
		}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2880
		if (fw_state == MFI_STATE_DEVICE_SCAN) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2881
			if (prev_abs_reg_val != cur_abs_reg_val) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2882
				continue;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2883
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2884
		}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2885
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2886
		/* return error if fw_state hasn't changed after max_wait */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2887
		if (fw_state == cur_state) {
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2888
			con_log(CL_ANN1, (CE_NOTE,
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2889
			    "FW state hasn't changed in %d secs", max_wait));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2890
			return (ENODEV);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2891
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2892
	};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2893
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2894
	fw_ctrl = RD_IB_DOORBELL(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2895
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2896
	con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2897
	    "mfi_state_transition_to_ready:FW ctrl = 0x%x", fw_ctrl));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2898
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2899
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2900
	 * Write 0xF to the doorbell register to do the following.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2901
	 * - Abort all outstanding commands (bit 0).
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2902
	 * - Transition from OPERATIONAL to READY state (bit 1).
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2903
	 * - Discard (possible) low MFA posted in 64-bit mode (bit-2).
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2904
	 * - Set to release FW to continue running (i.e. BIOS handshake
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2905
	 *   (bit 3).
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2906
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2907
	WR_IB_DOORBELL(0xF, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2908
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2909
	if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2910
		return (ENODEV);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2911
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2912
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2913
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2914
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2915
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2916
 * get_seq_num
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2917
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2918
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2919
get_seq_num(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2920
    struct mrsas_evt_log_info *eli)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2921
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2922
	int	ret = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2923
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2924
	dma_obj_t			dcmd_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2925
	struct mrsas_cmd		*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2926
	struct mrsas_dcmd_frame		*dcmd;
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  2927
	struct mrsas_evt_log_info *eli_tmp;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2928
	cmd = get_mfi_pkt(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2929
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2930
	if (!cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2931
		cmn_err(CE_WARN, "mr_sas: failed to get a cmd");
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2932
		DTRACE_PROBE2(seq_num_mfi_err, uint16_t,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  2933
		    instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2934
		return (ENOMEM);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2935
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  2936
	cmd->retry_count_for_ocr = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2937
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2938
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2939
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2940
	    cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2941
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2942
	dcmd	= &cmd->frame->dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2943
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2944
	/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2945
	dcmd_dma_obj.size = sizeof (struct mrsas_evt_log_info);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2946
	dcmd_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2947
	dcmd_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2948
	dcmd_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2949
	dcmd_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2950
	dcmd_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2951
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2952
	if (mrsas_alloc_dma_obj(instance, &dcmd_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2953
	    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2954
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2955
		    "get_seq_num: could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2956
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2957
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2958
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2959
	(void) memset(dcmd_dma_obj.buffer, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2960
	    sizeof (struct mrsas_evt_log_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2961
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2962
	(void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2963
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2964
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2965
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2966
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2967
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2968
	    MFI_FRAME_DIR_READ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2969
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2970
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2971
	    sizeof (struct mrsas_evt_log_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2972
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2973
	    MR_DCMD_CTRL_EVENT_GET_INFO);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2974
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2975
	    sizeof (struct mrsas_evt_log_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2976
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2977
	    dcmd_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2978
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2979
	cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2980
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2981
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2982
	if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2983
		cmn_err(CE_WARN, "get_seq_num: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2984
		    "failed to issue MRSAS_DCMD_CTRL_EVENT_GET_INFO");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2985
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2986
	} else {
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  2987
		eli_tmp = (struct mrsas_evt_log_info *)dcmd_dma_obj.buffer;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  2988
		eli->newest_seq_num = ddi_get32(cmd->frame_dma_obj.acc_handle,
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  2989
		    &eli_tmp->newest_seq_num);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2990
		ret = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2991
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2992
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2993
	if (mrsas_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2994
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2995
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2996
	if (mrsas_common_check(instance, cmd) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2997
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  2998
	}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  2999
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  3000
	return_mfi_pkt(instance, cmd);
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  3001
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3002
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3003
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3004
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3005
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3006
 * start_mfi_aen
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3007
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3008
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3009
start_mfi_aen(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3010
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3011
	int	ret = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3012
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3013
	struct mrsas_evt_log_info	eli;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3014
	union mrsas_evt_class_locale	class_locale;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3015
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3016
	/* get the latest sequence number from FW */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3017
	(void) memset(&eli, 0, sizeof (struct mrsas_evt_log_info));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3018
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3019
	if (get_seq_num(instance, &eli)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3020
		cmn_err(CE_WARN, "start_mfi_aen: failed to get seq num");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3021
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3022
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3023
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3024
	/* register AEN with FW for latest sequence number plus 1 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3025
	class_locale.members.reserved	= 0;
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  3026
	class_locale.members.locale	= LE_16(MR_EVT_LOCALE_ALL);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3027
	class_locale.members.class	= MR_EVT_CLASS_INFO;
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  3028
	class_locale.word	= LE_32(class_locale.word);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3029
	ret = register_mfi_aen(instance, eli.newest_seq_num + 1,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3030
	    class_locale.word);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3031
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3032
	if (ret) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3033
		cmn_err(CE_WARN, "start_mfi_aen: aen registration failed");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3034
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3035
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3036
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3037
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3038
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3039
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3040
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3041
 * flush_cache
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3042
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3043
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3044
flush_cache(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3045
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3046
	struct mrsas_cmd		*cmd = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3047
	struct mrsas_dcmd_frame		*dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3048
	uint32_t	max_cmd = instance->max_fw_cmds;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3049
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3050
	cmd = instance->cmd_list[max_cmd];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3051
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  3052
	if (!cmd) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  3053
		con_log(CL_ANN1, (CE_WARN,
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  3054
		    "flush_cache():Failed to get a cmd for flush_cache"));
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  3055
		DTRACE_PROBE2(flush_cache_err, uint16_t,
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  3056
		    instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3057
		return;
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  3058
	}
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  3059
	cmd->retry_count_for_ocr = 0;
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  3060
	/* Clear the frame buffer and assign back the context id */
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  3061
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  3062
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  3063
	    cmd->index);
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  3064
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3065
	dcmd = &cmd->frame->dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3066
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3067
	(void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3068
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3069
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3070
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3071
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3072
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3073
	    MFI_FRAME_DIR_NONE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3074
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3075
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3076
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3077
	    MR_DCMD_CTRL_CACHE_FLUSH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3078
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.b[0],
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3079
	    MR_FLUSH_CTRL_CACHE | MR_FLUSH_DISK_CACHE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3080
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3081
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3082
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3083
	if (instance->func_ptr->issue_cmd_in_poll_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3084
		con_log(CL_ANN1, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3085
	    "flush_cache: failed to issue MFI_DCMD_CTRL_CACHE_FLUSH"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3086
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3087
	con_log(CL_ANN1, (CE_NOTE, "flush_cache done"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3088
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3089
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3090
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3091
 * service_mfi_aen-	Completes an AEN command
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3092
 * @instance:			Adapter soft state
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3093
 * @cmd:			Command to be completed
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3094
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3095
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3096
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3097
service_mfi_aen(struct mrsas_instance *instance, struct mrsas_cmd *cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3098
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3099
	uint32_t	seq_num;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3100
	struct mrsas_evt_detail *evt_detail =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3101
	    (struct mrsas_evt_detail *)instance->mfi_evt_detail_obj.buffer;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3102
	int		rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3103
	int		tgt = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3104
	ddi_acc_handle_t		acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3105
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3106
	acc_handle = cmd->frame_dma_obj.acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3107
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3108
	cmd->cmd_status = ddi_get8(acc_handle, &cmd->frame->io.cmd_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3109
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3110
	if (cmd->cmd_status == ENODATA) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3111
		cmd->cmd_status = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3112
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3113
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3114
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3115
	 * log the MFI AEN event to the sysevent queue so that
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3116
	 * application will get noticed
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3117
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3118
	if (ddi_log_sysevent(instance->dip, DDI_VENDOR_LSI, "LSIMEGA", "SAS",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3119
	    NULL, NULL, DDI_NOSLEEP) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3120
		int	instance_no = ddi_get_instance(instance->dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3121
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3122
		    "mr_sas%d: Failed to log AEN event", instance_no));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3123
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3124
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3125
	 * Check for any ld devices that has changed state. i.e. online
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3126
	 * or offline.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3127
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3128
	con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3129
	    "AEN: code = %x class = %x locale = %x args = %x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3130
	    ddi_get32(acc_handle, &evt_detail->code),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3131
	    evt_detail->cl.members.class,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3132
	    ddi_get16(acc_handle, &evt_detail->cl.members.locale),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3133
	    ddi_get8(acc_handle, &evt_detail->arg_type)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3134
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3135
	switch (ddi_get32(acc_handle, &evt_detail->code)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3136
	case MR_EVT_CFG_CLEARED: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3137
		for (tgt = 0; tgt < MRDRV_MAX_LD; tgt++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3138
			if (instance->mr_ld_list[tgt].dip != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3139
				rval = mrsas_service_evt(instance, tgt, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3140
				    MRSAS_EVT_UNCONFIG_TGT, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3141
				con_log(CL_ANN1, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3142
				    "mr_sas: CFG CLEARED AEN rval = %d "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3143
				    "tgt id = %d", rval, tgt));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3144
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3145
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3146
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3147
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3148
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3149
	case MR_EVT_LD_DELETED: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3150
		rval = mrsas_service_evt(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3151
		    ddi_get16(acc_handle, &evt_detail->args.ld.target_id), 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3152
		    MRSAS_EVT_UNCONFIG_TGT, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3153
		con_log(CL_ANN1, (CE_WARN, "mr_sas: LD DELETED AEN rval = %d "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3154
		    "tgt id = %d index = %d", rval,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3155
		    ddi_get16(acc_handle, &evt_detail->args.ld.target_id),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3156
		    ddi_get8(acc_handle, &evt_detail->args.ld.ld_index)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3157
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3158
	} /* End of MR_EVT_LD_DELETED */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3159
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3160
	case MR_EVT_LD_CREATED: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3161
		rval = mrsas_service_evt(instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3162
		    ddi_get16(acc_handle, &evt_detail->args.ld.target_id), 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3163
		    MRSAS_EVT_CONFIG_TGT, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3164
		con_log(CL_ANN1, (CE_WARN, "mr_sas: LD CREATED AEN rval = %d "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3165
		    "tgt id = %d index = %d", rval,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3166
		    ddi_get16(acc_handle, &evt_detail->args.ld.target_id),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3167
		    ddi_get8(acc_handle, &evt_detail->args.ld.ld_index)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3168
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3169
	} /* End of MR_EVT_LD_CREATED */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3170
	} /* End of Main Switch */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3171
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3172
	/* get copy of seq_num and class/locale for re-registration */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3173
	seq_num = ddi_get32(acc_handle, &evt_detail->seq_num);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3174
	seq_num++;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3175
	(void) memset(instance->mfi_evt_detail_obj.buffer, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3176
	    sizeof (struct mrsas_evt_detail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3177
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3178
	ddi_put8(acc_handle, &cmd->frame->dcmd.cmd_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3179
	ddi_put32(acc_handle, &cmd->frame->dcmd.mbox.w[0], seq_num);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3180
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3181
	instance->aen_seq_num = seq_num;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3182
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3183
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3184
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3185
	/* Issue the aen registration frame */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3186
	instance->func_ptr->issue_cmd(cmd, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3187
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3188
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3189
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3190
 * complete_cmd_in_sync_mode -	Completes an internal command
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3191
 * @instance:			Adapter soft state
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3192
 * @cmd:			Command to be completed
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3193
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3194
 * The issue_cmd_in_sync_mode() function waits for a command to complete
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3195
 * after it issues a command. This function wakes up that waiting routine by
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3196
 * calling wake_up() on the wait queue.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3197
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3198
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3199
complete_cmd_in_sync_mode(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3200
    struct mrsas_cmd *cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3201
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3202
	cmd->cmd_status = ddi_get8(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3203
	    &cmd->frame->io.cmd_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3204
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3205
	cmd->sync_cmd = MRSAS_FALSE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3206
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3207
	if (cmd->cmd_status == ENODATA) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3208
		cmd->cmd_status = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3209
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3210
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3211
	con_log(CL_ANN1, (CE_NOTE, "complete_cmd_in_sync_mode called %p \n",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3212
	    (void *)cmd));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3213
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3214
	cv_broadcast(&instance->int_cmd_cv);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3215
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3216
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3217
/*
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3218
 * Call this function inside mrsas_softintr.
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3219
 * mrsas_initiate_ocr_if_fw_is_faulty  - Initiates OCR if FW status is faulty
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3220
 * @instance:			Adapter soft state
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3221
 */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3222
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3223
static uint32_t
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3224
mrsas_initiate_ocr_if_fw_is_faulty(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3225
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3226
	uint32_t	cur_abs_reg_val;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3227
	uint32_t	fw_state;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3228
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3229
	cur_abs_reg_val =  instance->func_ptr->read_fw_status_reg(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3230
	fw_state = cur_abs_reg_val & MFI_STATE_MASK;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3231
	if (fw_state == MFI_STATE_FAULT) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3232
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3233
		if (instance->disable_online_ctrl_reset == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3234
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3235
		    "mrsas_initiate_ocr_if_fw_is_faulty: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3236
		    "FW in Fault state, detected in ISR: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3237
		    "FW doesn't support ocr "));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3238
		return (ADAPTER_RESET_NOT_REQUIRED);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3239
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3240
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3241
		    "mrsas_initiate_ocr_if_fw_is_faulty: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3242
		    "FW in Fault state, detected in ISR: FW supports ocr "));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3243
			return (ADAPTER_RESET_REQUIRED);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3244
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3245
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3246
	return (ADAPTER_RESET_NOT_REQUIRED);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3247
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3248
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3249
/*
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3250
 * mrsas_softintr - The Software ISR
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3251
 * @param arg	: HBA soft state
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3252
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3253
 * called from high-level interrupt if hi-level interrupt are not there,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3254
 * otherwise triggered as a soft interrupt
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3255
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3256
static uint_t
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3257
mrsas_softintr(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3258
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3259
	struct scsi_pkt		*pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3260
	struct scsa_cmd		*acmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3261
	struct mrsas_cmd	*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3262
	struct mlist_head	*pos, *next;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3263
	mlist_t			process_list;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3264
	struct mrsas_header	*hdr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3265
	struct scsi_arq_status	*arqstat;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3266
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3267
	con_log(CL_ANN1, (CE_CONT, "mrsas_softintr called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3268
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3269
	ASSERT(instance);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3270
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3271
	mutex_enter(&instance->completed_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3272
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3273
	if (mlist_empty(&instance->completed_pool_list)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3274
		mutex_exit(&instance->completed_pool_mtx);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  3275
		return (DDI_INTR_CLAIMED);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3276
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3277
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3278
	instance->softint_running = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3279
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3280
	INIT_LIST_HEAD(&process_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3281
	mlist_splice(&instance->completed_pool_list, &process_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3282
	INIT_LIST_HEAD(&instance->completed_pool_list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3283
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3284
	mutex_exit(&instance->completed_pool_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3285
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3286
	/* perform all callbacks first, before releasing the SCBs */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3287
	mlist_for_each_safe(pos, next, &process_list) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3288
		cmd = mlist_entry(pos, struct mrsas_cmd, list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3289
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3290
		/* syncronize the Cmd frame for the controller */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3291
		(void) ddi_dma_sync(cmd->frame_dma_obj.dma_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3292
		    0, 0, DDI_DMA_SYNC_FORCPU);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3293
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3294
		if (mrsas_check_dma_handle(cmd->frame_dma_obj.dma_handle) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3295
		    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3296
			mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3297
			ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3298
			con_log(CL_ANN1, (CE_WARN,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3299
			    "mrsas_softintr: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3300
			    "FMA check reports DMA handle failure"));
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  3301
			return (DDI_INTR_CLAIMED);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3302
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3303
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3304
		hdr = &cmd->frame->hdr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3305
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3306
		/* remove the internal command from the process list */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3307
		mlist_del_init(&cmd->list);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3308
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3309
		switch (ddi_get8(cmd->frame_dma_obj.acc_handle, &hdr->cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3310
		case MFI_CMD_OP_PD_SCSI:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3311
		case MFI_CMD_OP_LD_SCSI:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3312
		case MFI_CMD_OP_LD_READ:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3313
		case MFI_CMD_OP_LD_WRITE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3314
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3315
			 * MFI_CMD_OP_PD_SCSI and MFI_CMD_OP_LD_SCSI
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3316
			 * could have been issued either through an
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3317
			 * IO path or an IOCTL path. If it was via IOCTL,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3318
			 * we will send it to internal completion.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3319
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3320
			if (cmd->sync_cmd == MRSAS_TRUE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3321
				complete_cmd_in_sync_mode(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3322
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3323
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3324
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3325
			/* regular commands */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3326
			acmd =	cmd->cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3327
			pkt =	CMD2PKT(acmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3328
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3329
			if (acmd->cmd_flags & CFLAG_DMAVALID) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3330
				if (acmd->cmd_flags & CFLAG_CONSISTENT) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3331
					(void) ddi_dma_sync(acmd->cmd_dmahandle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3332
					    acmd->cmd_dma_offset,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3333
					    acmd->cmd_dma_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3334
					    DDI_DMA_SYNC_FORCPU);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3335
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3336
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3337
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3338
			pkt->pkt_reason		= CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3339
			pkt->pkt_statistics	= 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3340
			pkt->pkt_state = STATE_GOT_BUS
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3341
			    | STATE_GOT_TARGET | STATE_SENT_CMD
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3342
			    | STATE_XFERRED_DATA | STATE_GOT_STATUS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3343
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3344
			con_log(CL_ANN1, (CE_CONT,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3345
			    "CDB[0] = %x completed for %s: size %lx context %x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3346
			    pkt->pkt_cdbp[0], ((acmd->islogical) ? "LD" : "PD"),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3347
			    acmd->cmd_dmacount, hdr->context));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3348
			DTRACE_PROBE3(softintr_cdb, uint8_t, pkt->pkt_cdbp[0],
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3349
			    uint_t, acmd->cmd_cdblen, ulong_t,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3350
			    acmd->cmd_dmacount);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3351
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3352
			if (pkt->pkt_cdbp[0] == SCMD_INQUIRY) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3353
				struct scsi_inquiry	*inq;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3354
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3355
				if (acmd->cmd_dmacount != 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3356
					bp_mapin(acmd->cmd_buf);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3357
					inq = (struct scsi_inquiry *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3358
					    acmd->cmd_buf->b_un.b_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3359
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3360
					/* don't expose physical drives to OS */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3361
					if (acmd->islogical &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3362
					    (hdr->cmd_status == MFI_STAT_OK)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3363
						display_scsi_inquiry(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3364
						    (caddr_t)inq);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3365
					} else if ((hdr->cmd_status ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3366
					    MFI_STAT_OK) && inq->inq_dtype ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3367
					    DTYPE_DIRECT) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3368
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3369
						display_scsi_inquiry(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3370
						    (caddr_t)inq);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3371
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3372
						/* for physical disk */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3373
						hdr->cmd_status =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3374
						    MFI_STAT_DEVICE_NOT_FOUND;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3375
					}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3376
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3377
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3378
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3379
			DTRACE_PROBE2(softintr_done, uint8_t, hdr->cmd,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3380
			    uint8_t, hdr->cmd_status);
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3381
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3382
			switch (hdr->cmd_status) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3383
			case MFI_STAT_OK:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3384
				pkt->pkt_scbp[0] = STATUS_GOOD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3385
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3386
			case MFI_STAT_LD_CC_IN_PROGRESS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3387
			case MFI_STAT_LD_RECON_IN_PROGRESS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3388
				pkt->pkt_scbp[0] = STATUS_GOOD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3389
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3390
			case MFI_STAT_LD_INIT_IN_PROGRESS:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3391
				con_log(CL_ANN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3392
				    (CE_WARN, "Initialization in Progress"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3393
				pkt->pkt_reason	= CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3394
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3395
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3396
			case MFI_STAT_SCSI_DONE_WITH_ERROR:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3397
				con_log(CL_ANN1, (CE_CONT, "scsi_done error"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3398
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3399
				pkt->pkt_reason	= CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3400
				((struct scsi_status *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3401
				    pkt->pkt_scbp)->sts_chk = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3402
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3403
				if (pkt->pkt_cdbp[0] == SCMD_TEST_UNIT_READY) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3404
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3405
					con_log(CL_ANN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3406
					    (CE_WARN, "TEST_UNIT_READY fail"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3407
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3408
				} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3409
					pkt->pkt_state |= STATE_ARQ_DONE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3410
					arqstat = (void *)(pkt->pkt_scbp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3411
					arqstat->sts_rqpkt_reason = CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3412
					arqstat->sts_rqpkt_resid = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3413
					arqstat->sts_rqpkt_state |=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3414
					    STATE_GOT_BUS | STATE_GOT_TARGET
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3415
					    | STATE_SENT_CMD
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3416
					    | STATE_XFERRED_DATA;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3417
					*(uint8_t *)&arqstat->sts_rqpkt_status =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3418
					    STATUS_GOOD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3419
					ddi_rep_get8(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3420
					    cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3421
					    (uint8_t *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3422
					    &(arqstat->sts_sensedata),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3423
					    cmd->sense,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3424
					    acmd->cmd_scblen -
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3425
					    offsetof(struct scsi_arq_status,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3426
					    sts_sensedata), DDI_DEV_AUTOINCR);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  3427
			}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3428
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3429
			case MFI_STAT_LD_OFFLINE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3430
			case MFI_STAT_DEVICE_NOT_FOUND:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3431
				con_log(CL_ANN1, (CE_CONT,
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3432
				"mrsas_softintr:device not found error"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3433
				pkt->pkt_reason	= CMD_DEV_GONE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3434
				pkt->pkt_statistics  = STAT_DISCON;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3435
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3436
			case MFI_STAT_LD_LBA_OUT_OF_RANGE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3437
				pkt->pkt_state |= STATE_ARQ_DONE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3438
				pkt->pkt_reason	= CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3439
				((struct scsi_status *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3440
				    pkt->pkt_scbp)->sts_chk = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3441
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3442
				arqstat = (void *)(pkt->pkt_scbp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3443
				arqstat->sts_rqpkt_reason = CMD_CMPLT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3444
				arqstat->sts_rqpkt_resid = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3445
				arqstat->sts_rqpkt_state |= STATE_GOT_BUS
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3446
				    | STATE_GOT_TARGET | STATE_SENT_CMD
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3447
				    | STATE_XFERRED_DATA;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3448
				*(uint8_t *)&arqstat->sts_rqpkt_status =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3449
				    STATUS_GOOD;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3450
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3451
				arqstat->sts_sensedata.es_valid = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3452
				arqstat->sts_sensedata.es_key =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3453
				    KEY_ILLEGAL_REQUEST;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3454
				arqstat->sts_sensedata.es_class =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3455
				    CLASS_EXTENDED_SENSE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3456
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3457
				/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3458
				 * LOGICAL BLOCK ADDRESS OUT OF RANGE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3459
				 * ASC: 0x21h; ASCQ: 0x00h;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3460
				 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3461
				arqstat->sts_sensedata.es_add_code = 0x21;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3462
				arqstat->sts_sensedata.es_qual_code = 0x00;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3463
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3464
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3465
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3466
			default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3467
				con_log(CL_ANN, (CE_CONT, "Unknown status!"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3468
				pkt->pkt_reason	= CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3469
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3470
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3471
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3472
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3473
			atomic_add_16(&instance->fw_outstanding, (-1));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3474
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  3475
			(void) mrsas_common_check(instance, cmd);
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  3476
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3477
			if (acmd->cmd_dmahandle) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3478
				if (mrsas_check_dma_handle(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3479
				    acmd->cmd_dmahandle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3480
					ddi_fm_service_impact(instance->dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3481
					    DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3482
					pkt->pkt_reason = CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3483
					pkt->pkt_statistics = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3484
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3485
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3486
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3487
			/* Call the callback routine */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3488
			if (((pkt->pkt_flags & FLAG_NOINTR) == 0) &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3489
			    pkt->pkt_comp) {
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3490
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3491
				con_log(CL_ANN1, (CE_NOTE, "mrsas_softintr: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3492
				    "posting to scsa cmd %p index %x pkt %p "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3493
				    "time %llx", (void *)cmd, cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3494
				    (void *)pkt, gethrtime()));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3495
				(*pkt->pkt_comp)(pkt);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3496
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3497
			}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3498
			return_mfi_pkt(instance, cmd);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3499
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3500
		case MFI_CMD_OP_SMP:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3501
		case MFI_CMD_OP_STP:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3502
			complete_cmd_in_sync_mode(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3503
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3504
		case MFI_CMD_OP_DCMD:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3505
			/* see if got an event notification */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3506
			if (ddi_get32(cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3507
			    &cmd->frame->dcmd.opcode) ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3508
			    MR_DCMD_CTRL_EVENT_WAIT) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3509
				if ((instance->aen_cmd == cmd) &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3510
				    (instance->aen_cmd->abort_aen)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3511
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3512
					    "mrsas_softintr: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3513
					    "aborted_aen returned"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3514
				} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3515
					atomic_add_16(&instance->fw_outstanding,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3516
					    (-1));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3517
					service_mfi_aen(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3518
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3519
			} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3520
				complete_cmd_in_sync_mode(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3521
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3522
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3523
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3524
		case MFI_CMD_OP_ABORT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3525
			con_log(CL_ANN, (CE_WARN, "MFI_CMD_OP_ABORT complete"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3526
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3527
			 * MFI_CMD_OP_ABORT successfully completed
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3528
			 * in the synchronous mode
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3529
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3530
			complete_cmd_in_sync_mode(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3531
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3532
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3533
			mrsas_fm_ereport(instance, DDI_FM_DEVICE_NO_RESPONSE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3534
			ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3535
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3536
			if (cmd->pkt != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3537
				pkt = cmd->pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3538
				if (((pkt->pkt_flags & FLAG_NOINTR) == 0) &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3539
				    pkt->pkt_comp) {
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3540
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3541
					con_log(CL_ANN1, (CE_CONT, "posting to "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3542
					    "scsa cmd %p index %x pkt %p"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3543
					    "time %llx, default ", (void *)cmd,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3544
					    cmd->index, (void *)pkt,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3545
					    gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3546
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3547
					(*pkt->pkt_comp)(pkt);
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3548
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3549
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3550
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3551
			con_log(CL_ANN, (CE_WARN, "Cmd type unknown !"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3552
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3553
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3554
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3555
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3556
	instance->softint_running = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3557
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3558
	return (DDI_INTR_CLAIMED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3559
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3560
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3561
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3562
 * mrsas_alloc_dma_obj
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3563
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3564
 * Allocate the memory and other resources for an dma object.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3565
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3566
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3567
mrsas_alloc_dma_obj(struct mrsas_instance *instance, dma_obj_t *obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3568
    uchar_t endian_flags)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3569
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3570
	int	i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3571
	size_t	alen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3572
	uint_t	cookie_cnt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3573
	struct ddi_device_acc_attr tmp_endian_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3574
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3575
	tmp_endian_attr = endian_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3576
	tmp_endian_attr.devacc_attr_endian_flags = endian_flags;
11236
1127b4f9e96b 6783915 numerous drivers using devacc_attr_access without specifying DDI_DEVICE_ATTR_V1
Stephen Hanson <Stephen.Hanson@Sun.COM>
parents: 10820
diff changeset
  3577
	tmp_endian_attr.devacc_attr_access = DDI_DEFAULT_ACC;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3578
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3579
	i = ddi_dma_alloc_handle(instance->dip, &obj->dma_attr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3580
	    DDI_DMA_SLEEP, NULL, &obj->dma_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3581
	if (i != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3582
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3583
		switch (i) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3584
			case DDI_DMA_BADATTR :
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3585
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3586
				"Failed ddi_dma_alloc_handle- Bad attribute"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3587
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3588
			case DDI_DMA_NORESOURCES :
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3589
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3590
				"Failed ddi_dma_alloc_handle- No Resources"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3591
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3592
			default :
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3593
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3594
				"Failed ddi_dma_alloc_handle: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3595
				"unknown status %d", i));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3596
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3597
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3598
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3599
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3600
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3601
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3602
	if ((ddi_dma_mem_alloc(obj->dma_handle, obj->size, &tmp_endian_attr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3603
	    DDI_DMA_RDWR | DDI_DMA_STREAMING, DDI_DMA_SLEEP, NULL,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3604
	    &obj->buffer, &alen, &obj->acc_handle) != DDI_SUCCESS) ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3605
	    alen < obj->size) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3606
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3607
		ddi_dma_free_handle(&obj->dma_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3608
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3609
		con_log(CL_ANN, (CE_WARN, "Failed : ddi_dma_mem_alloc"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3610
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3611
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3612
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3613
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3614
	if (ddi_dma_addr_bind_handle(obj->dma_handle, NULL, obj->buffer,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3615
	    obj->size, DDI_DMA_RDWR | DDI_DMA_STREAMING, DDI_DMA_SLEEP,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3616
	    NULL, &obj->dma_cookie[0], &cookie_cnt) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3617
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3618
		ddi_dma_mem_free(&obj->acc_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3619
		ddi_dma_free_handle(&obj->dma_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3620
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3621
		con_log(CL_ANN, (CE_WARN, "Failed : ddi_dma_addr_bind_handle"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3622
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3623
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3624
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3625
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3626
	if (mrsas_check_dma_handle(obj->dma_handle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3627
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3628
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3629
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3630
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3631
	if (mrsas_check_acc_handle(obj->acc_handle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3632
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3633
		return (-1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3634
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3635
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3636
	return (cookie_cnt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3637
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3638
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3639
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3640
 * mrsas_free_dma_obj(struct mrsas_instance *, dma_obj_t)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3641
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3642
 * De-allocate the memory and other resources for an dma object, which must
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3643
 * have been alloated by a previous call to mrsas_alloc_dma_obj()
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3644
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3645
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3646
mrsas_free_dma_obj(struct mrsas_instance *instance, dma_obj_t obj)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3647
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3648
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3649
	if (mrsas_check_dma_handle(obj.dma_handle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3650
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3651
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3652
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3653
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3654
	if (mrsas_check_acc_handle(obj.acc_handle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3655
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3656
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3657
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3658
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3659
	(void) ddi_dma_unbind_handle(obj.dma_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3660
	ddi_dma_mem_free(&obj.acc_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3661
	ddi_dma_free_handle(&obj.dma_handle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3662
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3663
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3664
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3665
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3666
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3667
 * mrsas_dma_alloc(instance_t *, struct scsi_pkt *, struct buf *,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3668
 * int, int (*)())
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3669
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3670
 * Allocate dma resources for a new scsi command
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3671
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3672
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3673
mrsas_dma_alloc(struct mrsas_instance *instance, struct scsi_pkt *pkt,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3674
    struct buf *bp, int flags, int (*callback)())
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3675
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3676
	int	dma_flags;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3677
	int	(*cb)(caddr_t);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3678
	int	i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3679
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3680
	ddi_dma_attr_t	tmp_dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3681
	struct scsa_cmd	*acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3682
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3683
	acmd->cmd_buf = bp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3684
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3685
	if (bp->b_flags & B_READ) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3686
		acmd->cmd_flags &= ~CFLAG_DMASEND;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3687
		dma_flags = DDI_DMA_READ;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3688
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3689
		acmd->cmd_flags |= CFLAG_DMASEND;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3690
		dma_flags = DDI_DMA_WRITE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3691
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3692
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3693
	if (flags & PKT_CONSISTENT) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3694
		acmd->cmd_flags |= CFLAG_CONSISTENT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3695
		dma_flags |= DDI_DMA_CONSISTENT;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3696
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3697
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3698
	if (flags & PKT_DMA_PARTIAL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3699
		dma_flags |= DDI_DMA_PARTIAL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3700
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3701
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3702
	dma_flags |= DDI_DMA_REDZONE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3703
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3704
	cb = (callback == NULL_FUNC) ? DDI_DMA_DONTWAIT : DDI_DMA_SLEEP;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3705
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3706
	tmp_dma_attr.dma_attr_sgllen = instance->max_num_sge;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3707
	tmp_dma_attr.dma_attr_addr_hi = 0xffffffffffffffffull;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3708
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3709
	if ((i = ddi_dma_alloc_handle(instance->dip, &tmp_dma_attr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3710
	    cb, 0, &acmd->cmd_dmahandle)) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3711
		switch (i) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3712
		case DDI_DMA_BADATTR:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3713
			bioerror(bp, EFAULT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3714
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3715
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3716
		case DDI_DMA_NORESOURCES:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3717
			bioerror(bp, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3718
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3719
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3720
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3721
			con_log(CL_ANN, (CE_PANIC, "ddi_dma_alloc_handle: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3722
			    "impossible result (0x%x)", i));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3723
			bioerror(bp, EFAULT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3724
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3725
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3726
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3727
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3728
	i = ddi_dma_buf_bind_handle(acmd->cmd_dmahandle, bp, dma_flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3729
	    cb, 0, &acmd->cmd_dmacookies[0], &acmd->cmd_ncookies);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3730
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3731
	switch (i) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3732
	case DDI_DMA_PARTIAL_MAP:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3733
		if ((dma_flags & DDI_DMA_PARTIAL) == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3734
			con_log(CL_ANN, (CE_PANIC, "ddi_dma_buf_bind_handle: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3735
			    "DDI_DMA_PARTIAL_MAP impossible"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3736
			goto no_dma_cookies;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3737
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3738
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3739
		if (ddi_dma_numwin(acmd->cmd_dmahandle, &acmd->cmd_nwin) ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3740
		    DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3741
			con_log(CL_ANN, (CE_PANIC, "ddi_dma_numwin failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3742
			goto no_dma_cookies;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3743
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3744
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3745
		if (ddi_dma_getwin(acmd->cmd_dmahandle, acmd->cmd_curwin,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3746
		    &acmd->cmd_dma_offset, &acmd->cmd_dma_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3747
		    &acmd->cmd_dmacookies[0], &acmd->cmd_ncookies) ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3748
		    DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3749
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3750
			con_log(CL_ANN, (CE_PANIC, "ddi_dma_getwin failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3751
			goto no_dma_cookies;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3752
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3753
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3754
		goto get_dma_cookies;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3755
	case DDI_DMA_MAPPED:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3756
		acmd->cmd_nwin = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3757
		acmd->cmd_dma_len = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3758
		acmd->cmd_dma_offset = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3759
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3760
get_dma_cookies:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3761
		i = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3762
		acmd->cmd_dmacount = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3763
		for (;;) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3764
			acmd->cmd_dmacount +=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3765
			    acmd->cmd_dmacookies[i++].dmac_size;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3766
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3767
			if (i == instance->max_num_sge ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3768
			    i == acmd->cmd_ncookies)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3769
				break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3770
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3771
			ddi_dma_nextcookie(acmd->cmd_dmahandle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3772
			    &acmd->cmd_dmacookies[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3773
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3774
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3775
		acmd->cmd_cookie = i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3776
		acmd->cmd_cookiecnt = i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3777
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3778
		acmd->cmd_flags |= CFLAG_DMAVALID;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3779
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3780
		if (bp->b_bcount >= acmd->cmd_dmacount) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3781
			pkt->pkt_resid = bp->b_bcount - acmd->cmd_dmacount;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3782
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3783
			pkt->pkt_resid = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3784
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3785
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3786
		return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3787
	case DDI_DMA_NORESOURCES:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3788
		bioerror(bp, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3789
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3790
	case DDI_DMA_NOMAPPING:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3791
		bioerror(bp, EFAULT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3792
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3793
	case DDI_DMA_TOOBIG:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3794
		bioerror(bp, EINVAL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3795
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3796
	case DDI_DMA_INUSE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3797
		con_log(CL_ANN, (CE_PANIC, "ddi_dma_buf_bind_handle:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3798
		    " DDI_DMA_INUSE impossible"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3799
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3800
	default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3801
		con_log(CL_ANN, (CE_PANIC, "ddi_dma_buf_bind_handle: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3802
		    "impossible result (0x%x)", i));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3803
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3804
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3805
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3806
no_dma_cookies:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3807
	ddi_dma_free_handle(&acmd->cmd_dmahandle);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3808
	acmd->cmd_dmahandle = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3809
	acmd->cmd_flags &= ~CFLAG_DMAVALID;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3810
	return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3811
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3812
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3813
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3814
 * mrsas_dma_move(struct mrsas_instance *, struct scsi_pkt *, struct buf *)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3815
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3816
 * move dma resources to next dma window
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3817
 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3818
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3819
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3820
mrsas_dma_move(struct mrsas_instance *instance, struct scsi_pkt *pkt,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3821
    struct buf *bp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3822
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3823
	int	i = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3824
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3825
	struct scsa_cmd	*acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3826
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3827
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3828
	 * If there are no more cookies remaining in this window,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3829
	 * must move to the next window first.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3830
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3831
	if (acmd->cmd_cookie == acmd->cmd_ncookies) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3832
		if (acmd->cmd_curwin == acmd->cmd_nwin && acmd->cmd_nwin == 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3833
			return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3834
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3835
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3836
		/* at last window, cannot move */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3837
		if (++acmd->cmd_curwin >= acmd->cmd_nwin) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3838
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3839
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3840
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3841
		if (ddi_dma_getwin(acmd->cmd_dmahandle, acmd->cmd_curwin,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3842
		    &acmd->cmd_dma_offset, &acmd->cmd_dma_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3843
		    &acmd->cmd_dmacookies[0], &acmd->cmd_ncookies) ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3844
		    DDI_FAILURE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3845
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3846
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3847
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3848
		acmd->cmd_cookie = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3849
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3850
		/* still more cookies in this window - get the next one */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3851
		ddi_dma_nextcookie(acmd->cmd_dmahandle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3852
		    &acmd->cmd_dmacookies[0]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3853
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3854
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3855
	/* get remaining cookies in this window, up to our maximum */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3856
	for (;;) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3857
		acmd->cmd_dmacount += acmd->cmd_dmacookies[i++].dmac_size;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3858
		acmd->cmd_cookie++;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3859
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3860
		if (i == instance->max_num_sge ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3861
		    acmd->cmd_cookie == acmd->cmd_ncookies) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3862
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3863
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3864
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3865
		ddi_dma_nextcookie(acmd->cmd_dmahandle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3866
		    &acmd->cmd_dmacookies[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3867
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3868
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3869
	acmd->cmd_cookiecnt = i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3870
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3871
	if (bp->b_bcount >= acmd->cmd_dmacount) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3872
		pkt->pkt_resid = bp->b_bcount - acmd->cmd_dmacount;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3873
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3874
		pkt->pkt_resid = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3875
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3876
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3877
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3878
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3879
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3880
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3881
 * build_cmd
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3882
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3883
static struct mrsas_cmd *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3884
build_cmd(struct mrsas_instance *instance, struct scsi_address *ap,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3885
    struct scsi_pkt *pkt, uchar_t *cmd_done)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3886
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3887
	uint16_t	flags = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3888
	uint32_t	i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3889
	uint32_t 	context;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3890
	uint32_t	sge_bytes;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3891
	ddi_acc_handle_t acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3892
	struct mrsas_cmd		*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3893
	struct mrsas_sge64		*mfi_sgl;
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3894
	struct mrsas_sge_ieee		*mfi_sgl_ieee;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3895
	struct scsa_cmd			*acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3896
	struct mrsas_pthru_frame 	*pthru;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3897
	struct mrsas_io_frame		*ldio;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3898
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3899
	/* find out if this is logical or physical drive command.  */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3900
	acmd->islogical = MRDRV_IS_LOGICAL(ap);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3901
	acmd->device_id = MAP_DEVICE_ID(instance, ap);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3902
	*cmd_done = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3903
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3904
	/* get the command packet */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3905
	if (!(cmd = get_mfi_pkt(instance))) {
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3906
		DTRACE_PROBE2(build_cmd_mfi_err, uint16_t,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3907
		    instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3908
		return (NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3909
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3910
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3911
	cmd->retry_count_for_ocr = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  3912
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3913
	acc_handle = cmd->frame_dma_obj.acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3914
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3915
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3916
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3917
	ddi_put32(acc_handle, &cmd->frame->hdr.context, cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3918
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3919
	cmd->pkt = pkt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3920
	cmd->cmd = acmd;
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3921
	DTRACE_PROBE3(build_cmds, uint8_t, pkt->pkt_cdbp[0],
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  3922
	    ulong_t, acmd->cmd_dmacount, ulong_t, acmd->cmd_dma_len);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3923
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3924
	/* lets get the command directions */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3925
	if (acmd->cmd_flags & CFLAG_DMASEND) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3926
		flags = MFI_FRAME_DIR_WRITE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3927
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3928
		if (acmd->cmd_flags & CFLAG_CONSISTENT) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3929
			(void) ddi_dma_sync(acmd->cmd_dmahandle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3930
			    acmd->cmd_dma_offset, acmd->cmd_dma_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3931
			    DDI_DMA_SYNC_FORDEV);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3932
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3933
	} else if (acmd->cmd_flags & ~CFLAG_DMASEND) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3934
		flags = MFI_FRAME_DIR_READ;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3935
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3936
		if (acmd->cmd_flags & CFLAG_CONSISTENT) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3937
			(void) ddi_dma_sync(acmd->cmd_dmahandle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3938
			    acmd->cmd_dma_offset, acmd->cmd_dma_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3939
			    DDI_DMA_SYNC_FORCPU);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3940
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3941
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3942
		flags = MFI_FRAME_DIR_NONE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3943
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3944
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3945
	if (instance->flag_ieee) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3946
		flags |= MFI_FRAME_IEEE;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3947
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3948
	flags |= MFI_FRAME_SGL64;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3949
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3950
	switch (pkt->pkt_cdbp[0]) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3951
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3952
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3953
	 * case SCMD_SYNCHRONIZE_CACHE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3954
	 * 	flush_cache(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3955
	 *	return_mfi_pkt(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3956
	 *	*cmd_done = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3957
	 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3958
	 *	return (NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3959
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3960
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3961
	case SCMD_READ:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3962
	case SCMD_WRITE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3963
	case SCMD_READ_G1:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3964
	case SCMD_WRITE_G1:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3965
		if (acmd->islogical) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3966
			ldio = (struct mrsas_io_frame *)cmd->frame;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3967
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3968
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3969
			 * preare the Logical IO frame:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3970
			 * 2nd bit is zero for all read cmds
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3971
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3972
			ddi_put8(acc_handle, &ldio->cmd,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3973
			    (pkt->pkt_cdbp[0] & 0x02) ? MFI_CMD_OP_LD_WRITE
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3974
			    : MFI_CMD_OP_LD_READ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3975
			ddi_put8(acc_handle, &ldio->cmd_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3976
			ddi_put8(acc_handle, &ldio->scsi_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3977
			ddi_put8(acc_handle, &ldio->target_id, acmd->device_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3978
			ddi_put16(acc_handle, &ldio->timeout, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3979
			ddi_put8(acc_handle, &ldio->reserved_0, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3980
			ddi_put16(acc_handle, &ldio->pad_0, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3981
			ddi_put16(acc_handle, &ldio->flags, flags);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3982
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3983
			/* Initialize sense Information */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3984
			bzero(cmd->sense, SENSE_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3985
			ddi_put8(acc_handle, &ldio->sense_len, SENSE_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3986
			ddi_put32(acc_handle, &ldio->sense_buf_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3987
			ddi_put32(acc_handle, &ldio->sense_buf_phys_addr_lo,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3988
			    cmd->sense_phys_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3989
			ddi_put32(acc_handle, &ldio->start_lba_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3990
			ddi_put8(acc_handle, &ldio->access_byte,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3991
			    (acmd->cmd_cdblen != 6) ? pkt->pkt_cdbp[1] : 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3992
			ddi_put8(acc_handle, &ldio->sge_count,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  3993
			    acmd->cmd_cookiecnt);
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3994
			if (instance->flag_ieee) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3995
				mfi_sgl_ieee =
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3996
				    (struct mrsas_sge_ieee *)&ldio->sgl;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3997
			} else {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3998
				mfi_sgl = (struct mrsas_sge64	*)&ldio->sgl;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  3999
			}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4000
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4001
			context = ddi_get32(acc_handle, &ldio->context);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4002
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4003
			if (acmd->cmd_cdblen == CDB_GROUP0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4004
				ddi_put32(acc_handle, &ldio->lba_count, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4005
				    (uint16_t)(pkt->pkt_cdbp[4])));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4006
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4007
				ddi_put32(acc_handle, &ldio->start_lba_lo, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4008
				    ((uint32_t)(pkt->pkt_cdbp[3])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4009
				    ((uint32_t)(pkt->pkt_cdbp[2]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4010
				    ((uint32_t)((pkt->pkt_cdbp[1]) & 0x1F)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4011
				    << 16)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4012
			} else if (acmd->cmd_cdblen == CDB_GROUP1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4013
				ddi_put32(acc_handle, &ldio->lba_count, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4014
				    ((uint16_t)(pkt->pkt_cdbp[8])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4015
				    ((uint16_t)(pkt->pkt_cdbp[7]) << 8)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4016
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4017
				ddi_put32(acc_handle, &ldio->start_lba_lo, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4018
				    ((uint32_t)(pkt->pkt_cdbp[5])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4019
				    ((uint32_t)(pkt->pkt_cdbp[4]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4020
				    ((uint32_t)(pkt->pkt_cdbp[3]) << 16) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4021
				    ((uint32_t)(pkt->pkt_cdbp[2]) << 24)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4022
			} else if (acmd->cmd_cdblen == CDB_GROUP2) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4023
				ddi_put32(acc_handle, &ldio->lba_count, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4024
				    ((uint16_t)(pkt->pkt_cdbp[9])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4025
				    ((uint16_t)(pkt->pkt_cdbp[8]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4026
				    ((uint16_t)(pkt->pkt_cdbp[7]) << 16) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4027
				    ((uint16_t)(pkt->pkt_cdbp[6]) << 24)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4028
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4029
				ddi_put32(acc_handle, &ldio->start_lba_lo, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4030
				    ((uint32_t)(pkt->pkt_cdbp[5])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4031
				    ((uint32_t)(pkt->pkt_cdbp[4]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4032
				    ((uint32_t)(pkt->pkt_cdbp[3]) << 16) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4033
				    ((uint32_t)(pkt->pkt_cdbp[2]) << 24)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4034
			} else if (acmd->cmd_cdblen == CDB_GROUP3) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4035
				ddi_put32(acc_handle, &ldio->lba_count, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4036
				    ((uint16_t)(pkt->pkt_cdbp[13])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4037
				    ((uint16_t)(pkt->pkt_cdbp[12]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4038
				    ((uint16_t)(pkt->pkt_cdbp[11]) << 16) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4039
				    ((uint16_t)(pkt->pkt_cdbp[10]) << 24)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4040
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4041
				ddi_put32(acc_handle, &ldio->start_lba_lo, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4042
				    ((uint32_t)(pkt->pkt_cdbp[9])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4043
				    ((uint32_t)(pkt->pkt_cdbp[8]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4044
				    ((uint32_t)(pkt->pkt_cdbp[7]) << 16) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4045
				    ((uint32_t)(pkt->pkt_cdbp[6]) << 24)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4046
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4047
				ddi_put32(acc_handle, &ldio->start_lba_lo, (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4048
				    ((uint32_t)(pkt->pkt_cdbp[5])) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4049
				    ((uint32_t)(pkt->pkt_cdbp[4]) << 8) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4050
				    ((uint32_t)(pkt->pkt_cdbp[3]) << 16) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4051
				    ((uint32_t)(pkt->pkt_cdbp[2]) << 24)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4052
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4053
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4054
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4055
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4056
		/* fall through For all non-rd/wr cmds */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4057
	default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4058
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4059
		switch (pkt->pkt_cdbp[0]) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4060
		case SCMD_MODE_SENSE:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4061
		case SCMD_MODE_SENSE_G1: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4062
			union scsi_cdb	*cdbp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4063
			uint16_t	page_code;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4064
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4065
			cdbp = (void *)pkt->pkt_cdbp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4066
			page_code = (uint16_t)cdbp->cdb_un.sg.scsi[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4067
			switch (page_code) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4068
			case 0x3:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4069
			case 0x4:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4070
				(void) mrsas_mode_sense_build(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4071
				return_mfi_pkt(instance, cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4072
				*cmd_done = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4073
				return (NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4074
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4075
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4076
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4077
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4078
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4079
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4080
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4081
		pthru	= (struct mrsas_pthru_frame *)cmd->frame;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4082
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4083
		/* prepare the DCDB frame */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4084
		ddi_put8(acc_handle, &pthru->cmd, (acmd->islogical) ?
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4085
		    MFI_CMD_OP_LD_SCSI : MFI_CMD_OP_PD_SCSI);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4086
		ddi_put8(acc_handle, &pthru->cmd_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4087
		ddi_put8(acc_handle, &pthru->scsi_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4088
		ddi_put8(acc_handle, &pthru->target_id, acmd->device_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4089
		ddi_put8(acc_handle, &pthru->lun, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4090
		ddi_put8(acc_handle, &pthru->cdb_len, acmd->cmd_cdblen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4091
		ddi_put16(acc_handle, &pthru->timeout, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4092
		ddi_put16(acc_handle, &pthru->flags, flags);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4093
		ddi_put32(acc_handle, &pthru->data_xfer_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4094
		    acmd->cmd_dmacount);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4095
		ddi_put8(acc_handle, &pthru->sge_count, acmd->cmd_cookiecnt);
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4096
		if (instance->flag_ieee) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4097
			mfi_sgl_ieee = (struct mrsas_sge_ieee *)&pthru->sgl;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4098
		} else {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4099
			mfi_sgl	= (struct mrsas_sge64 *)&pthru->sgl;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4100
		}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4101
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4102
		bzero(cmd->sense, SENSE_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4103
		ddi_put8(acc_handle, &pthru->sense_len, SENSE_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4104
		ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4105
		ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_lo,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4106
		    cmd->sense_phys_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4107
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4108
		context = ddi_get32(acc_handle, &pthru->context);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4109
		ddi_rep_put8(acc_handle, (uint8_t *)pkt->pkt_cdbp,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4110
		    (uint8_t *)pthru->cdb, acmd->cmd_cdblen, DDI_DEV_AUTOINCR);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4111
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4112
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4113
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4114
#ifdef lint
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4115
	context = context;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4116
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4117
	/* prepare the scatter-gather list for the firmware */
11856
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4118
	if (instance->flag_ieee) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4119
		for (i = 0; i < acmd->cmd_cookiecnt; i++, mfi_sgl_ieee++) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4120
			ddi_put64(acc_handle, &mfi_sgl_ieee->phys_addr,
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4121
			    acmd->cmd_dmacookies[i].dmac_laddress);
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4122
			ddi_put32(acc_handle, &mfi_sgl_ieee->length,
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4123
			    acmd->cmd_dmacookies[i].dmac_size);
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4124
		}
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4125
		sge_bytes = sizeof (struct mrsas_sge_ieee)*acmd->cmd_cookiecnt;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4126
	} else {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4127
		for (i = 0; i < acmd->cmd_cookiecnt; i++, mfi_sgl++) {
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4128
			ddi_put64(acc_handle, &mfi_sgl->phys_addr,
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4129
			    acmd->cmd_dmacookies[i].dmac_laddress);
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4130
			ddi_put32(acc_handle, &mfi_sgl->length,
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4131
			    acmd->cmd_dmacookies[i].dmac_size);
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4132
		}
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4133
		sge_bytes = sizeof (struct mrsas_sge64)*acmd->cmd_cookiecnt;
201ed79bd5ba 6911965 mr_sas driver missing key performance CTIO feature present in Linux/Windows version
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11236
diff changeset
  4134
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4135
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4136
	cmd->frame_count = (sge_bytes / MRMFI_FRAME_SIZE) +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4137
	    ((sge_bytes % MRMFI_FRAME_SIZE) ? 1 : 0) + 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4138
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4139
	if (cmd->frame_count >= 8) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4140
		cmd->frame_count = 8;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4141
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4142
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4143
	return (cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4144
}
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4145
#ifndef __sparc
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4146
static int
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4147
wait_for_outstanding(struct mrsas_instance *instance)
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4148
{
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4149
	int		i;
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4150
	uint32_t	wait_time = 90;
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4151
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4152
	for (i = 0; i < wait_time; i++) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4153
		if (!instance->fw_outstanding) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4154
			break;
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4155
		}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4156
		drv_usecwait(MILLISEC); /* wait for 1000 usecs */;
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4157
	}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4158
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4159
	if (instance->fw_outstanding) {
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4160
		return (1);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4161
	}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4162
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4163
	return (0);
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4164
}
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  4165
#endif  /* __sparc */
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4166
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4167
 * issue_mfi_pthru
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4168
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4169
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4170
issue_mfi_pthru(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4171
    struct mrsas_cmd *cmd, int mode)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4172
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4173
	void		*ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4174
	uint32_t	kphys_addr = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4175
	uint32_t	xferlen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4176
	uint_t		model;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4177
	ddi_acc_handle_t	acc_handle = cmd->frame_dma_obj.acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4178
	dma_obj_t			pthru_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4179
	struct mrsas_pthru_frame	*kpthru;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4180
	struct mrsas_pthru_frame	*pthru;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4181
	int i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4182
	pthru = &cmd->frame->pthru;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4183
	kpthru = (struct mrsas_pthru_frame *)&ioctl->frame[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4184
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4185
	if (instance->adapterresetinprogress) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4186
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_pthru: Reset flag set, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4187
		"returning mfi_pkt and setting TRAN_BUSY\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4188
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4189
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4190
	model = ddi_model_convert_from(mode & FMODELS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4191
	if (model == DDI_MODEL_ILP32) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4192
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_pthru: DDI_MODEL_LP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4193
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4194
		xferlen	= kpthru->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4195
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4196
		ubuf	= (void *)(ulong_t)kpthru->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4197
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4198
#ifdef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4199
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_pthru: DDI_MODEL_LP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4200
		xferlen	= kpthru->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4201
		ubuf	= (void *)(ulong_t)kpthru->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4202
#else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4203
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_pthru: DDI_MODEL_LP64"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4204
		xferlen	= kpthru->sgl.sge64[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4205
		ubuf	= (void *)(ulong_t)kpthru->sgl.sge64[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4206
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4207
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4208
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4209
	if (xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4210
		/* means IOCTL requires DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4211
		/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4212
		pthru_dma_obj.size = xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4213
		pthru_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4214
		pthru_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4215
		pthru_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4216
		pthru_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4217
		pthru_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4218
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4219
		/* allocate kernel buffer for DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4220
		if (mrsas_alloc_dma_obj(instance, &pthru_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4221
		    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4222
			con_log(CL_ANN, (CE_WARN, "issue_mfi_pthru: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4223
			    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4224
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4225
		}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4226
		(void) memset(pthru_dma_obj.buffer, 0, xferlen);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4227
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4228
		/* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4229
		if (kpthru->flags & MFI_FRAME_DIR_WRITE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4230
			for (i = 0; i < xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4231
				if (ddi_copyin((uint8_t *)ubuf+i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4232
				    (uint8_t *)pthru_dma_obj.buffer+i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4233
				    1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4234
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4235
					    "issue_mfi_pthru : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4236
					    "copy from user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4237
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4238
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4239
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4240
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4241
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4242
		kphys_addr = pthru_dma_obj.dma_cookie[0].dmac_address;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4243
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4244
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4245
	ddi_put8(acc_handle, &pthru->cmd, kpthru->cmd);
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4246
	ddi_put8(acc_handle, &pthru->sense_len, 0);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4247
	ddi_put8(acc_handle, &pthru->cmd_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4248
	ddi_put8(acc_handle, &pthru->scsi_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4249
	ddi_put8(acc_handle, &pthru->target_id, kpthru->target_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4250
	ddi_put8(acc_handle, &pthru->lun, kpthru->lun);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4251
	ddi_put8(acc_handle, &pthru->cdb_len, kpthru->cdb_len);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4252
	ddi_put8(acc_handle, &pthru->sge_count, kpthru->sge_count);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4253
	ddi_put16(acc_handle, &pthru->timeout, kpthru->timeout);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4254
	ddi_put32(acc_handle, &pthru->data_xfer_len, kpthru->data_xfer_len);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4255
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4256
	ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_hi, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4257
	/* pthru->sense_buf_phys_addr_lo = cmd->sense_phys_addr; */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4258
	ddi_put32(acc_handle, &pthru->sense_buf_phys_addr_lo, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4259
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4260
	ddi_rep_put8(acc_handle, (uint8_t *)kpthru->cdb, (uint8_t *)pthru->cdb,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4261
	    pthru->cdb_len, DDI_DEV_AUTOINCR);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4262
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4263
	ddi_put16(acc_handle, &pthru->flags, kpthru->flags & ~MFI_FRAME_SGL64);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4264
	ddi_put32(acc_handle, &pthru->sgl.sge32[0].length, xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4265
	ddi_put32(acc_handle, &pthru->sgl.sge32[0].phys_addr, kphys_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4266
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4267
	cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4268
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4269
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4270
	if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4271
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4272
		    "issue_mfi_pthru: fw_ioctl failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4273
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4274
		if (xferlen && kpthru->flags & MFI_FRAME_DIR_READ) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4275
			for (i = 0; i < xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4276
				if (ddi_copyout(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4277
				    (uint8_t *)pthru_dma_obj.buffer+i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4278
				    (uint8_t *)ubuf+i, 1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4279
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4280
					    "issue_mfi_pthru : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4281
					    "copy to user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4282
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4283
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4284
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4285
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4286
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4287
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4288
	kpthru->cmd_status = ddi_get8(acc_handle, &pthru->cmd_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4289
	kpthru->scsi_status = ddi_get8(acc_handle, &pthru->scsi_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4290
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4291
	con_log(CL_ANN, (CE_NOTE, "issue_mfi_pthru: cmd_status %x, "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4292
	    "scsi_status %x", kpthru->cmd_status, kpthru->scsi_status));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  4293
	DTRACE_PROBE3(issue_pthru, uint8_t, kpthru->cmd, uint8_t,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  4294
	    kpthru->cmd_status, uint8_t, kpthru->scsi_status);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4295
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4296
	if (xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4297
		/* free kernel buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4298
		if (mrsas_free_dma_obj(instance, pthru_dma_obj) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4299
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4300
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4301
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4302
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4303
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4304
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4305
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4306
 * issue_mfi_dcmd
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4307
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4308
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4309
issue_mfi_dcmd(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4310
    struct mrsas_cmd *cmd, int mode)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4311
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4312
	void		*ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4313
	uint32_t	kphys_addr = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4314
	uint32_t	xferlen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4315
	uint32_t	model;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4316
	dma_obj_t	dcmd_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4317
	struct mrsas_dcmd_frame	*kdcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4318
	struct mrsas_dcmd_frame	*dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4319
	ddi_acc_handle_t	acc_handle = cmd->frame_dma_obj.acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4320
	int i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4321
	dcmd = &cmd->frame->dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4322
	kdcmd = (struct mrsas_dcmd_frame *)&ioctl->frame[0];
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4323
	if (instance->adapterresetinprogress) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4324
		con_log(CL_ANN1, (CE_NOTE, "Reset flag set, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4325
		"returning mfi_pkt and setting TRAN_BUSY\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4326
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4327
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4328
	model = ddi_model_convert_from(mode & FMODELS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4329
	if (model == DDI_MODEL_ILP32) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4330
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_dcmd: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4331
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4332
		xferlen	= kdcmd->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4333
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4334
		ubuf	= (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4335
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4336
#ifdef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4337
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_dcmd: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4338
		xferlen	= kdcmd->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4339
		ubuf	= (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4340
#else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4341
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_dcmd: DDI_MODEL_LP64"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4342
		xferlen	= kdcmd->sgl.sge64[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4343
		ubuf	= (void *)(ulong_t)kdcmd->sgl.sge64[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4344
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4345
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4346
	if (xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4347
		/* means IOCTL requires DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4348
		/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4349
		dcmd_dma_obj.size = xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4350
		dcmd_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4351
		dcmd_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4352
		dcmd_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4353
		dcmd_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4354
		dcmd_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4355
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4356
		/* allocate kernel buffer for DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4357
		if (mrsas_alloc_dma_obj(instance, &dcmd_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4358
		    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4359
			con_log(CL_ANN, (CE_WARN, "issue_mfi_dcmd: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4360
			    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4361
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4362
		}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4363
		(void) memset(dcmd_dma_obj.buffer, 0, xferlen);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4364
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4365
		/* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4366
		if (kdcmd->flags & MFI_FRAME_DIR_WRITE) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4367
			for (i = 0; i < xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4368
				if (ddi_copyin((uint8_t *)ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4369
				    (uint8_t *)dcmd_dma_obj.buffer + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4370
				    1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4371
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4372
					    "issue_mfi_dcmd : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4373
					    "copy from user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4374
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4375
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4376
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4377
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4378
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4379
		kphys_addr = dcmd_dma_obj.dma_cookie[0].dmac_address;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4380
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4381
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4382
	ddi_put8(acc_handle, &dcmd->cmd, kdcmd->cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4383
	ddi_put8(acc_handle, &dcmd->cmd_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4384
	ddi_put8(acc_handle, &dcmd->sge_count, kdcmd->sge_count);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4385
	ddi_put16(acc_handle, &dcmd->timeout, kdcmd->timeout);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4386
	ddi_put32(acc_handle, &dcmd->data_xfer_len, kdcmd->data_xfer_len);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4387
	ddi_put32(acc_handle, &dcmd->opcode, kdcmd->opcode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4388
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4389
	ddi_rep_put8(acc_handle, (uint8_t *)kdcmd->mbox.b,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4390
	    (uint8_t *)dcmd->mbox.b, DCMD_MBOX_SZ, DDI_DEV_AUTOINCR);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4391
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4392
	ddi_put16(acc_handle, &dcmd->flags, kdcmd->flags & ~MFI_FRAME_SGL64);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4393
	ddi_put32(acc_handle, &dcmd->sgl.sge32[0].length, xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4394
	ddi_put32(acc_handle, &dcmd->sgl.sge32[0].phys_addr, kphys_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4395
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4396
	cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4397
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4398
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4399
	if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4400
		con_log(CL_ANN, (CE_WARN, "issue_mfi_dcmd: fw_ioctl failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4401
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4402
		if (xferlen && (kdcmd->flags & MFI_FRAME_DIR_READ)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4403
			for (i = 0; i < xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4404
				if (ddi_copyout(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4405
				    (uint8_t *)dcmd_dma_obj.buffer + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4406
				    (uint8_t *)ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4407
				    1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4408
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4409
					    "issue_mfi_dcmd : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4410
					    "copy to user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4411
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4412
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4413
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4414
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4415
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4416
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4417
	kdcmd->cmd_status = ddi_get8(acc_handle, &dcmd->cmd_status);
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  4418
	DTRACE_PROBE3(issue_dcmd, uint32_t, kdcmd->opcode, uint8_t,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  4419
	    kdcmd->cmd, uint8_t, kdcmd->cmd_status);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4420
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4421
	if (xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4422
		/* free kernel buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4423
		if (mrsas_free_dma_obj(instance, dcmd_dma_obj) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4424
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4425
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4426
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4427
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4428
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4429
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4430
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4431
 * issue_mfi_smp
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4432
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4433
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4434
issue_mfi_smp(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4435
    struct mrsas_cmd *cmd, int mode)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4436
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4437
	void		*request_ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4438
	void		*response_ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4439
	uint32_t	request_xferlen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4440
	uint32_t	response_xferlen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4441
	uint_t		model;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4442
	dma_obj_t			request_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4443
	dma_obj_t			response_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4444
	ddi_acc_handle_t	acc_handle = cmd->frame_dma_obj.acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4445
	struct mrsas_smp_frame		*ksmp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4446
	struct mrsas_smp_frame		*smp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4447
	struct mrsas_sge32		*sge32;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4448
#ifndef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4449
	struct mrsas_sge64		*sge64;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4450
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4451
	int i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4452
	uint64_t			tmp_sas_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4453
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4454
	smp = &cmd->frame->smp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4455
	ksmp = (struct mrsas_smp_frame *)&ioctl->frame[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4456
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4457
	if (instance->adapterresetinprogress) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4458
		con_log(CL_ANN1, (CE_NOTE, "Reset flag set, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4459
		"returning mfi_pkt and setting TRAN_BUSY\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4460
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4461
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4462
	model = ddi_model_convert_from(mode & FMODELS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4463
	if (model == DDI_MODEL_ILP32) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4464
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4465
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4466
		sge32			= &ksmp->sgl[0].sge32[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4467
		response_xferlen	= sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4468
		request_xferlen		= sge32[1].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4469
		con_log(CL_ANN, (CE_NOTE, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4470
		    "response_xferlen = %x, request_xferlen = %x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4471
		    response_xferlen, request_xferlen));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4472
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4473
		response_ubuf	= (void *)(ulong_t)sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4474
		request_ubuf	= (void *)(ulong_t)sge32[1].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4475
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4476
		    "response_ubuf = %p, request_ubuf = %p",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4477
		    response_ubuf, request_ubuf));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4478
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4479
#ifdef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4480
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4481
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4482
		sge32			= &ksmp->sgl[0].sge32[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4483
		response_xferlen	= sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4484
		request_xferlen		= sge32[1].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4485
		con_log(CL_ANN, (CE_NOTE, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4486
		    "response_xferlen = %x, request_xferlen = %x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4487
		    response_xferlen, request_xferlen));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4488
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4489
		response_ubuf	= (void *)(ulong_t)sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4490
		request_ubuf	= (void *)(ulong_t)sge32[1].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4491
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4492
		    "response_ubuf = %p, request_ubuf = %p",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4493
		    response_ubuf, request_ubuf));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4494
#else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4495
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: DDI_MODEL_LP64"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4496
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4497
		sge64			= &ksmp->sgl[0].sge64[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4498
		response_xferlen	= sge64[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4499
		request_xferlen		= sge64[1].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4500
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4501
		response_ubuf	= (void *)(ulong_t)sge64[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4502
		request_ubuf	= (void *)(ulong_t)sge64[1].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4503
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4504
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4505
	if (request_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4506
		/* means IOCTL requires DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4507
		/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4508
		request_dma_obj.size = request_xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4509
		request_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4510
		request_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4511
		request_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4512
		request_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4513
		request_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4514
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4515
		/* allocate kernel buffer for DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4516
		if (mrsas_alloc_dma_obj(instance, &request_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4517
		    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4518
			con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4519
			    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4520
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4521
		}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4522
		(void) memset(request_dma_obj.buffer, 0, request_xferlen);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4523
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4524
		/* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4525
		for (i = 0; i < request_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4526
			if (ddi_copyin((uint8_t *)request_ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4527
			    (uint8_t *)request_dma_obj.buffer + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4528
			    1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4529
				con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4530
				    "copy from user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4531
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4532
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4533
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4534
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4535
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4536
	if (response_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4537
		/* means IOCTL requires DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4538
		/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4539
		response_dma_obj.size = response_xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4540
		response_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4541
		response_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4542
		response_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4543
		response_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4544
		response_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4545
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4546
		/* allocate kernel buffer for DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4547
		if (mrsas_alloc_dma_obj(instance, &response_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4548
		    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4549
			con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4550
			    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4551
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4552
		}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4553
		(void) memset(response_dma_obj.buffer, 0, response_xferlen);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4554
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4555
		/* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4556
		for (i = 0; i < response_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4557
			if (ddi_copyin((uint8_t *)response_ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4558
			    (uint8_t *)response_dma_obj.buffer + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4559
			    1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4560
				con_log(CL_ANN, (CE_WARN, "issue_mfi_smp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4561
				    "copy from user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4562
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4563
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4564
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4565
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4566
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4567
	ddi_put8(acc_handle, &smp->cmd, ksmp->cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4568
	ddi_put8(acc_handle, &smp->cmd_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4569
	ddi_put8(acc_handle, &smp->connection_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4570
	ddi_put8(acc_handle, &smp->sge_count, ksmp->sge_count);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4571
	/* smp->context		= ksmp->context; */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4572
	ddi_put16(acc_handle, &smp->timeout, ksmp->timeout);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4573
	ddi_put32(acc_handle, &smp->data_xfer_len, ksmp->data_xfer_len);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4574
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4575
	bcopy((void *)&ksmp->sas_addr, (void *)&tmp_sas_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4576
	    sizeof (uint64_t));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4577
	ddi_put64(acc_handle, &smp->sas_addr, tmp_sas_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4578
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4579
	ddi_put16(acc_handle, &smp->flags, ksmp->flags & ~MFI_FRAME_SGL64);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4580
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4581
	model = ddi_model_convert_from(mode & FMODELS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4582
	if (model == DDI_MODEL_ILP32) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4583
		con_log(CL_ANN1, (CE_NOTE,
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4584
		    "issue_mfi_smp: DDI_MODEL_ILP32"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4585
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4586
		sge32 = &smp->sgl[0].sge32[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4587
		ddi_put32(acc_handle, &sge32[0].length, response_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4588
		ddi_put32(acc_handle, &sge32[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4589
		    response_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4590
		ddi_put32(acc_handle, &sge32[1].length, request_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4591
		ddi_put32(acc_handle, &sge32[1].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4592
		    request_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4593
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4594
#ifdef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4595
		con_log(CL_ANN1, (CE_NOTE,
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4596
		    "issue_mfi_smp: DDI_MODEL_ILP32"));
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4597
		sge32 = &smp->sgl[0].sge32[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4598
		ddi_put32(acc_handle, &sge32[0].length, response_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4599
		ddi_put32(acc_handle, &sge32[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4600
		    response_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4601
		ddi_put32(acc_handle, &sge32[1].length, request_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4602
		ddi_put32(acc_handle, &sge32[1].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4603
		    request_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4604
#else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4605
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4606
		    "issue_mfi_smp: DDI_MODEL_LP64"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4607
		sge64 = &smp->sgl[0].sge64[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4608
		ddi_put32(acc_handle, &sge64[0].length, response_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4609
		ddi_put64(acc_handle, &sge64[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4610
		    response_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4611
		ddi_put32(acc_handle, &sge64[1].length, request_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4612
		ddi_put64(acc_handle, &sge64[1].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4613
		    request_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4614
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4615
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4616
	con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4617
	    "smp->response_xferlen = %d, smp->request_xferlen = %d "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4618
	    "smp->data_xfer_len = %d", ddi_get32(acc_handle, &sge32[0].length),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4619
	    ddi_get32(acc_handle, &sge32[1].length),
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4620
	    ddi_get32(acc_handle, &smp->data_xfer_len)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4621
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4622
	cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4623
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4624
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4625
	if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4626
		con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4627
		    "issue_mfi_smp: fw_ioctl failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4628
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4629
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4630
		    "issue_mfi_smp: copy to user space"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4631
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4632
		if (request_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4633
			for (i = 0; i < request_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4634
				if (ddi_copyout(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4635
				    (uint8_t *)request_dma_obj.buffer +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4636
				    i, (uint8_t *)request_ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4637
				    1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4638
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4639
					    "issue_mfi_smp : copy to user space"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4640
					    " failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4641
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4642
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4643
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4644
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4645
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4646
		if (response_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4647
			for (i = 0; i < response_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4648
				if (ddi_copyout(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4649
				    (uint8_t *)response_dma_obj.buffer
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4650
				    + i, (uint8_t *)response_ubuf
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4651
				    + i, 1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4652
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4653
					    "issue_mfi_smp : copy to "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4654
					    "user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4655
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4656
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4657
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4658
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4659
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4660
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4661
	ksmp->cmd_status = ddi_get8(acc_handle, &smp->cmd_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4662
	con_log(CL_ANN1, (CE_NOTE, "issue_mfi_smp: smp->cmd_status = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4663
	    ddi_get8(acc_handle, &smp->cmd_status)));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  4664
	DTRACE_PROBE2(issue_smp, uint8_t, ksmp->cmd, uint8_t, ksmp->cmd_status);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4665
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4666
	if (request_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4667
		/* free kernel buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4668
		if (mrsas_free_dma_obj(instance, request_dma_obj) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4669
		    DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4670
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4671
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4672
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4673
	if (response_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4674
		/* free kernel buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4675
		if (mrsas_free_dma_obj(instance, response_dma_obj) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4676
		    DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4677
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4678
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4679
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4680
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4681
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4682
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4683
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4684
 * issue_mfi_stp
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4685
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4686
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4687
issue_mfi_stp(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4688
    struct mrsas_cmd *cmd, int mode)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4689
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4690
	void		*fis_ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4691
	void		*data_ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4692
	uint32_t	fis_xferlen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4693
	uint32_t	data_xferlen = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4694
	uint_t		model;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4695
	dma_obj_t	fis_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4696
	dma_obj_t	data_dma_obj;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4697
	struct mrsas_stp_frame	*kstp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4698
	struct mrsas_stp_frame	*stp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4699
	ddi_acc_handle_t	acc_handle = cmd->frame_dma_obj.acc_handle;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4700
	int i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4701
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4702
	stp = &cmd->frame->stp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4703
	kstp = (struct mrsas_stp_frame *)&ioctl->frame[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4704
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4705
	if (instance->adapterresetinprogress) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4706
		con_log(CL_ANN1, (CE_NOTE, "Reset flag set, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4707
		"returning mfi_pkt and setting TRAN_BUSY\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4708
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  4709
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4710
	model = ddi_model_convert_from(mode & FMODELS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4711
	if (model == DDI_MODEL_ILP32) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4712
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_stp: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4713
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4714
		fis_xferlen	= kstp->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4715
		data_xferlen	= kstp->sgl.sge32[1].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4716
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4717
		fis_ubuf	= (void *)(ulong_t)kstp->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4718
		data_ubuf	= (void *)(ulong_t)kstp->sgl.sge32[1].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4719
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4720
	else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4721
	{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4722
#ifdef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4723
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_stp: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4724
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4725
		fis_xferlen	= kstp->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4726
		data_xferlen	= kstp->sgl.sge32[1].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4727
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4728
		fis_ubuf	= (void *)(ulong_t)kstp->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4729
		data_ubuf	= (void *)(ulong_t)kstp->sgl.sge32[1].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4730
#else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4731
		con_log(CL_ANN1, (CE_NOTE, "issue_mfi_stp: DDI_MODEL_LP64"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4732
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4733
		fis_xferlen	= kstp->sgl.sge64[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4734
		data_xferlen	= kstp->sgl.sge64[1].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4735
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4736
		fis_ubuf	= (void *)(ulong_t)kstp->sgl.sge64[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4737
		data_ubuf	= (void *)(ulong_t)kstp->sgl.sge64[1].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4738
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4739
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4740
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4741
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4742
	if (fis_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4743
		con_log(CL_ANN, (CE_NOTE, "issue_mfi_stp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4744
		    "fis_ubuf = %p fis_xferlen = %x", fis_ubuf, fis_xferlen));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4745
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4746
		/* means IOCTL requires DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4747
		/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4748
		fis_dma_obj.size = fis_xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4749
		fis_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4750
		fis_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4751
		fis_dma_obj.dma_attr.dma_attr_count_max	= 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4752
		fis_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4753
		fis_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4754
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4755
		/* allocate kernel buffer for DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4756
		if (mrsas_alloc_dma_obj(instance, &fis_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4757
		    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4758
			con_log(CL_ANN, (CE_WARN, "issue_mfi_stp : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4759
			    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4760
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4761
		}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4762
		(void) memset(fis_dma_obj.buffer, 0, fis_xferlen);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4763
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4764
		/* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4765
		for (i = 0; i < fis_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4766
			if (ddi_copyin((uint8_t *)fis_ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4767
			    (uint8_t *)fis_dma_obj.buffer + i, 1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4768
				con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4769
				    "copy from user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4770
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4771
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4772
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4773
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4774
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4775
	if (data_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4776
		con_log(CL_ANN, (CE_NOTE, "issue_mfi_stp: data_ubuf = %p "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4777
		    "data_xferlen = %x", data_ubuf, data_xferlen));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4778
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4779
		/* means IOCTL requires DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4780
		/* allocate the data transfer buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4781
		data_dma_obj.size = data_xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4782
		data_dma_obj.dma_attr = mrsas_generic_dma_attr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4783
		data_dma_obj.dma_attr.dma_attr_addr_hi = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4784
		data_dma_obj.dma_attr.dma_attr_count_max = 0xFFFFFFFFU;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4785
		data_dma_obj.dma_attr.dma_attr_sgllen = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4786
		data_dma_obj.dma_attr.dma_attr_align = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4787
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4788
/* allocate kernel buffer for DMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4789
		if (mrsas_alloc_dma_obj(instance, &data_dma_obj,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4790
		    (uchar_t)DDI_STRUCTURE_LE_ACC) != 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4791
			con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4792
			    "could not allocate data transfer buffer."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4793
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4794
		}
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  4795
		(void) memset(data_dma_obj.buffer, 0, data_xferlen);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4796
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4797
		/* If IOCTL requires DMA WRITE, do ddi_copyin IOCTL data copy */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4798
		for (i = 0; i < data_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4799
			if (ddi_copyin((uint8_t *)data_ubuf + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4800
			    (uint8_t *)data_dma_obj.buffer + i, 1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4801
				con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4802
				    "copy from user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4803
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4804
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4805
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4806
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4807
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4808
	ddi_put8(acc_handle, &stp->cmd, kstp->cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4809
	ddi_put8(acc_handle, &stp->cmd_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4810
	ddi_put8(acc_handle, &stp->connection_status, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4811
	ddi_put8(acc_handle, &stp->target_id, kstp->target_id);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4812
	ddi_put8(acc_handle, &stp->sge_count, kstp->sge_count);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4813
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4814
	ddi_put16(acc_handle, &stp->timeout, kstp->timeout);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4815
	ddi_put32(acc_handle, &stp->data_xfer_len, kstp->data_xfer_len);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4816
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4817
	ddi_rep_put8(acc_handle, (uint8_t *)kstp->fis, (uint8_t *)stp->fis, 10,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4818
	    DDI_DEV_AUTOINCR);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4819
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4820
	ddi_put16(acc_handle, &stp->flags, kstp->flags & ~MFI_FRAME_SGL64);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4821
	ddi_put32(acc_handle, &stp->stp_flags, kstp->stp_flags);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4822
	ddi_put32(acc_handle, &stp->sgl.sge32[0].length, fis_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4823
	ddi_put32(acc_handle, &stp->sgl.sge32[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4824
	    fis_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4825
	ddi_put32(acc_handle, &stp->sgl.sge32[1].length, data_xferlen);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4826
	ddi_put32(acc_handle, &stp->sgl.sge32[1].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4827
	    data_dma_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4828
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4829
	cmd->sync_cmd = MRSAS_TRUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4830
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4831
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4832
	if (instance->func_ptr->issue_cmd_in_sync_mode(instance, cmd)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4833
		con_log(CL_ANN, (CE_WARN, "issue_mfi_stp: fw_ioctl failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4834
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4835
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4836
		if (fis_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4837
			for (i = 0; i < fis_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4838
				if (ddi_copyout(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4839
				    (uint8_t *)fis_dma_obj.buffer + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4840
				    (uint8_t *)fis_ubuf + i, 1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4841
					con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4842
					    "issue_mfi_stp : copy to "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4843
					    "user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4844
					return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4845
				}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4846
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4847
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4848
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4849
	if (data_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4850
		for (i = 0; i < data_xferlen; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4851
			if (ddi_copyout(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4852
			    (uint8_t *)data_dma_obj.buffer + i,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4853
			    (uint8_t *)data_ubuf + i, 1, mode)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4854
				con_log(CL_ANN, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4855
				    "issue_mfi_stp : copy to"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4856
				    " user space failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4857
				return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4858
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4859
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4860
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4861
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4862
	kstp->cmd_status = ddi_get8(acc_handle, &stp->cmd_status);
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  4863
	DTRACE_PROBE2(issue_stp, uint8_t, kstp->cmd, uint8_t, kstp->cmd_status);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4864
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4865
	if (fis_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4866
		/* free kernel buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4867
		if (mrsas_free_dma_obj(instance, fis_dma_obj) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4868
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4869
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4870
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4871
	if (data_xferlen) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4872
		/* free kernel buffer */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4873
		if (mrsas_free_dma_obj(instance, data_dma_obj) != DDI_SUCCESS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4874
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4875
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4876
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4877
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4878
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4879
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4880
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4881
 * fill_up_drv_ver
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4882
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4883
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4884
fill_up_drv_ver(struct mrsas_drv_ver *dv)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4885
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4886
	(void) memset(dv, 0, sizeof (struct mrsas_drv_ver));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4887
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4888
	(void) memcpy(dv->signature, "$LSI LOGIC$", strlen("$LSI LOGIC$"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4889
	(void) memcpy(dv->os_name, "Solaris", strlen("Solaris"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4890
	(void) memcpy(dv->drv_name, "mr_sas", strlen("mr_sas"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4891
	(void) memcpy(dv->drv_ver, MRSAS_VERSION, strlen(MRSAS_VERSION));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4892
	(void) memcpy(dv->drv_rel_date, MRSAS_RELDATE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4893
	    strlen(MRSAS_RELDATE));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4894
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4895
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4896
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4897
 * handle_drv_ioctl
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4898
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4899
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4900
handle_drv_ioctl(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4901
    int mode)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4902
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4903
	int	i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4904
	int	rval = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4905
	int	*props = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4906
	void	*ubuf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4907
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4908
	uint8_t		*pci_conf_buf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4909
	uint32_t	xferlen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4910
	uint32_t	num_props;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4911
	uint_t		model;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4912
	struct mrsas_dcmd_frame	*kdcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4913
	struct mrsas_drv_ver	dv;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4914
	struct mrsas_pci_information pi;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4915
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4916
	kdcmd = (struct mrsas_dcmd_frame *)&ioctl->frame[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4917
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4918
	model = ddi_model_convert_from(mode & FMODELS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4919
	if (model == DDI_MODEL_ILP32) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4920
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4921
		    "handle_drv_ioctl: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4922
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4923
		xferlen	= kdcmd->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4924
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4925
		ubuf = (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4926
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4927
#ifdef _ILP32
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4928
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4929
		    "handle_drv_ioctl: DDI_MODEL_ILP32"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4930
		xferlen	= kdcmd->sgl.sge32[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4931
		ubuf = (void *)(ulong_t)kdcmd->sgl.sge32[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4932
#else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4933
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4934
		    "handle_drv_ioctl: DDI_MODEL_LP64"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4935
		xferlen	= kdcmd->sgl.sge64[0].length;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4936
		ubuf = (void *)(ulong_t)kdcmd->sgl.sge64[0].phys_addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4937
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4938
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4939
	con_log(CL_ANN1, (CE_NOTE, "handle_drv_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4940
	    "dataBuf=%p size=%d bytes", ubuf, xferlen));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4941
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4942
	switch (kdcmd->opcode) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4943
	case MRSAS_DRIVER_IOCTL_DRIVER_VERSION:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4944
		con_log(CL_ANN1, (CE_NOTE, "handle_drv_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4945
		    "MRSAS_DRIVER_IOCTL_DRIVER_VERSION"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4946
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4947
		fill_up_drv_ver(&dv);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4948
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4949
		if (ddi_copyout(&dv, ubuf, xferlen, mode)) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4950
			con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4951
			    "MRSAS_DRIVER_IOCTL_DRIVER_VERSION : "
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4952
			    "copy to user space failed"));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4953
			kdcmd->cmd_status = 1;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4954
			rval = 1;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4955
		} else {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4956
			kdcmd->cmd_status = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4957
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4958
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4959
	case MRSAS_DRIVER_IOCTL_PCI_INFORMATION:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4960
		con_log(CL_ANN1, (CE_NOTE, "handle_drv_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4961
		    "MRSAS_DRIVER_IOCTL_PCI_INFORMAITON"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4962
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4963
		if (ddi_prop_lookup_int_array(DDI_DEV_T_ANY, instance->dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4964
		    0, "reg", &props, &num_props)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4965
			con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4966
			    "MRSAS_DRIVER_IOCTL_PCI_INFORMATION : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4967
			    "ddi_prop_look_int_array failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4968
			rval = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4969
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4970
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4971
			pi.busNumber = (props[0] >> 16) & 0xFF;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4972
			pi.deviceNumber = (props[0] >> 11) & 0x1f;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4973
			pi.functionNumber = (props[0] >> 8) & 0x7;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4974
			ddi_prop_free((void *)props);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4975
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4976
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4977
		pci_conf_buf = (uint8_t *)&pi.pciHeaderInfo;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4978
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4979
		for (i = 0; i < (sizeof (struct mrsas_pci_information) -
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4980
		    offsetof(struct mrsas_pci_information, pciHeaderInfo));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4981
		    i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4982
			pci_conf_buf[i] =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4983
			    pci_config_get8(instance->pci_handle, i);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4984
		}
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4985
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4986
		if (ddi_copyout(&pi, ubuf, xferlen, mode)) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4987
			con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4988
			    "MRSAS_DRIVER_IOCTL_PCI_INFORMATION : "
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4989
			    "copy to user space failed"));
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4990
			kdcmd->cmd_status = 1;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4991
			rval = 1;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4992
		} else {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  4993
			kdcmd->cmd_status = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4994
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4995
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4996
	default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4997
		con_log(CL_ANN, (CE_WARN, "handle_drv_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4998
		    "invalid driver specific IOCTL opcode = 0x%x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  4999
		    kdcmd->opcode));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5000
		kdcmd->cmd_status = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5001
		rval = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5002
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5003
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5004
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5005
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5006
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5007
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5008
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5009
 * handle_mfi_ioctl
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5010
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5011
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5012
handle_mfi_ioctl(struct mrsas_instance *instance, struct mrsas_ioctl *ioctl,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5013
    int mode)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5014
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5015
	int	rval = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5016
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5017
	struct mrsas_header	*hdr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5018
	struct mrsas_cmd	*cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5019
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5020
	cmd = get_mfi_pkt(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5021
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5022
	if (!cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5023
		con_log(CL_ANN, (CE_WARN, "mr_sas: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5024
		    "failed to get a cmd packet"));
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  5025
		DTRACE_PROBE2(mfi_ioctl_err, uint16_t,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  5026
		    instance->fw_outstanding, uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5027
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5028
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5029
	cmd->retry_count_for_ocr = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5030
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5031
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5032
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5033
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5034
	    cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5035
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5036
	hdr = (struct mrsas_header *)&ioctl->frame[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5037
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5038
	switch (ddi_get8(cmd->frame_dma_obj.acc_handle, &hdr->cmd)) {
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5039
	case MFI_CMD_OP_DCMD:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5040
		rval = issue_mfi_dcmd(instance, ioctl, cmd, mode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5041
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5042
	case MFI_CMD_OP_SMP:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5043
		rval = issue_mfi_smp(instance, ioctl, cmd, mode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5044
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5045
	case MFI_CMD_OP_STP:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5046
		rval = issue_mfi_stp(instance, ioctl, cmd, mode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5047
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5048
	case MFI_CMD_OP_LD_SCSI:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5049
	case MFI_CMD_OP_PD_SCSI:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5050
		rval = issue_mfi_pthru(instance, ioctl, cmd, mode);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5051
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5052
	default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5053
		con_log(CL_ANN, (CE_WARN, "handle_mfi_ioctl: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5054
		    "invalid mfi ioctl hdr->cmd = %d", hdr->cmd));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5055
		rval = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5056
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5057
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5058
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  5059
	if (mrsas_common_check(instance, cmd) != DDI_SUCCESS)
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  5060
		rval = DDI_FAILURE;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5061
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5062
	return_mfi_pkt(instance, cmd);
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  5063
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5064
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5065
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5066
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5067
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5068
 * AEN
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5069
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5070
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5071
handle_mfi_aen(struct mrsas_instance *instance, struct mrsas_aen *aen)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5072
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5073
	int	rval = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5074
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5075
	rval = register_mfi_aen(instance, instance->aen_seq_num,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5076
	    aen->class_locale_word);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5077
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5078
	aen->cmd_status = (uint8_t)rval;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5079
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5080
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5081
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5082
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5083
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5084
register_mfi_aen(struct mrsas_instance *instance, uint32_t seq_num,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5085
    uint32_t class_locale_word)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5086
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5087
	int	ret_val;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5088
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5089
	struct mrsas_cmd	*cmd, *aen_cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5090
	struct mrsas_dcmd_frame	*dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5091
	union mrsas_evt_class_locale	curr_aen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5092
	union mrsas_evt_class_locale	prev_aen;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5093
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5094
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5095
	 * If there an AEN pending already (aen_cmd), check if the
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5096
	 * class_locale of that pending AEN is inclusive of the new
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5097
	 * AEN request we currently have. If it is, then we don't have
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5098
	 * to do anything. In other words, whichever events the current
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5099
	 * AEN request is subscribing to, have already been subscribed
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5100
	 * to.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5101
	 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5102
	 * If the old_cmd is _not_ inclusive, then we have to abort
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5103
	 * that command, form a class_locale that is superset of both
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5104
	 * old and current and re-issue to the FW
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5105
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5106
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5107
	curr_aen.word = LE_32(class_locale_word);
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5108
	curr_aen.members.locale = LE_16(curr_aen.members.locale);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5109
	aen_cmd = instance->aen_cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5110
	if (aen_cmd) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5111
		prev_aen.word = ddi_get32(aen_cmd->frame_dma_obj.acc_handle,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5112
		    &aen_cmd->frame->dcmd.mbox.w[1]);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5113
		prev_aen.word = LE_32(prev_aen.word);
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5114
		prev_aen.members.locale = LE_16(prev_aen.members.locale);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5115
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5116
		 * A class whose enum value is smaller is inclusive of all
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5117
		 * higher values. If a PROGRESS (= -1) was previously
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5118
		 * registered, then a new registration requests for higher
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5119
		 * classes need not be sent to FW. They are automatically
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5120
		 * included.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5121
		 *
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5122
		 * Locale numbers don't have such hierarchy. They are bitmap
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5123
		 * values
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5124
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5125
		if ((prev_aen.members.class <= curr_aen.members.class) &&
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5126
		    !((prev_aen.members.locale & curr_aen.members.locale) ^
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5127
		    curr_aen.members.locale)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5128
			/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5129
			 * Previously issued event registration includes
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5130
			 * current request. Nothing to do.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5131
			 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5132
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5133
			return (0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5134
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5135
			curr_aen.members.locale |= prev_aen.members.locale;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5136
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5137
			if (prev_aen.members.class < curr_aen.members.class)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5138
				curr_aen.members.class = prev_aen.members.class;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5139
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5140
			ret_val = abort_aen_cmd(instance, aen_cmd);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5141
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5142
			if (ret_val) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5143
				con_log(CL_ANN, (CE_WARN, "register_mfi_aen: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5144
				    "failed to abort prevous AEN command"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5145
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5146
				return (ret_val);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5147
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5148
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5149
	} else {
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  5150
		curr_aen.word = LE_32(class_locale_word);
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  5151
		curr_aen.members.locale = LE_16(curr_aen.members.locale);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5152
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5153
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5154
	cmd = get_mfi_pkt(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5155
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  5156
	if (!cmd) {
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  5157
		DTRACE_PROBE2(mfi_aen_err, uint16_t, instance->fw_outstanding,
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  5158
		    uint16_t, instance->max_fw_cmds);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5159
		return (ENOMEM);
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  5160
	}
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5161
	cmd->retry_count_for_ocr = 0;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5162
	/* Clear the frame buffer and assign back the context id */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5163
	(void) memset((char *)&cmd->frame[0], 0, sizeof (union mrsas_frame));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5164
	ddi_put32(cmd->frame_dma_obj.acc_handle, &cmd->frame->hdr.context,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5165
	    cmd->index);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5166
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5167
	dcmd = &cmd->frame->dcmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5168
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5169
	/* for(i = 0; i < DCMD_MBOX_SZ; i++) dcmd->mbox.b[i] = 0; */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5170
	(void) memset(dcmd->mbox.b, 0, DCMD_MBOX_SZ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5171
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5172
	(void) memset(instance->mfi_evt_detail_obj.buffer, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5173
	    sizeof (struct mrsas_evt_detail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5174
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5175
	/* Prepare DCMD for aen registration */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5176
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd, MFI_CMD_OP_DCMD);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5177
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->cmd_status, 0x0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5178
	ddi_put8(cmd->frame_dma_obj.acc_handle, &dcmd->sge_count, 1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5179
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5180
	    MFI_FRAME_DIR_READ);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5181
	ddi_put16(cmd->frame_dma_obj.acc_handle, &dcmd->timeout, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5182
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->data_xfer_len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5183
	    sizeof (struct mrsas_evt_detail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5184
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->opcode,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5185
	    MR_DCMD_CTRL_EVENT_WAIT);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5186
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.w[0], seq_num);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5187
	curr_aen.members.locale = LE_16(curr_aen.members.locale);
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5188
	curr_aen.word = LE_32(curr_aen.word);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5189
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->mbox.w[1],
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5190
	    curr_aen.word);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5191
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].phys_addr,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5192
	    instance->mfi_evt_detail_obj.dma_cookie[0].dmac_address);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5193
	ddi_put32(cmd->frame_dma_obj.acc_handle, &dcmd->sgl.sge32[0].length,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5194
	    sizeof (struct mrsas_evt_detail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5195
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5196
	instance->aen_seq_num = seq_num;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5197
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5198
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5199
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5200
	 * Store reference to the cmd used to register for AEN. When an
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5201
	 * application wants us to register for AEN, we have to abort this
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5202
	 * cmd and re-register with a new EVENT LOCALE supplied by that app
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5203
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5204
	instance->aen_cmd = cmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5205
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5206
	cmd->frame_count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5207
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5208
	/* Issue the aen registration frame */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5209
	/* atomic_add_16 (&instance->fw_outstanding, 1); */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5210
	instance->func_ptr->issue_cmd(cmd, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5211
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5212
	return (0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5213
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5214
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5215
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5216
display_scsi_inquiry(caddr_t scsi_inq)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5217
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5218
#define	MAX_SCSI_DEVICE_CODE	14
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5219
	int		i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5220
	char		inquiry_buf[256] = {0};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5221
	int		len;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5222
	const char	*const scsi_device_types[] = {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5223
		"Direct-Access    ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5224
		"Sequential-Access",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5225
		"Printer          ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5226
		"Processor        ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5227
		"WORM             ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5228
		"CD-ROM           ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5229
		"Scanner          ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5230
		"Optical Device   ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5231
		"Medium Changer   ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5232
		"Communications   ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5233
		"Unknown          ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5234
		"Unknown          ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5235
		"Unknown          ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5236
		"Enclosure        ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5237
	};
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5238
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5239
	len = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5240
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5241
	len += snprintf(inquiry_buf + len, 265 - len, "  Vendor: ");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5242
	for (i = 8; i < 16; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5243
		len += snprintf(inquiry_buf + len, 265 - len, "%c",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5244
		    scsi_inq[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5245
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5246
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5247
	len += snprintf(inquiry_buf + len, 265 - len, "  Model: ");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5248
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5249
	for (i = 16; i < 32; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5250
		len += snprintf(inquiry_buf + len, 265 - len, "%c",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5251
		    scsi_inq[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5252
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5253
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5254
	len += snprintf(inquiry_buf + len, 265 - len, "  Rev: ");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5255
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5256
	for (i = 32; i < 36; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5257
		len += snprintf(inquiry_buf + len, 265 - len, "%c",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5258
		    scsi_inq[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5259
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5260
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5261
	len += snprintf(inquiry_buf + len, 265 - len, "\n");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5262
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5263
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5264
	i = scsi_inq[0] & 0x1f;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5265
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5266
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5267
	len += snprintf(inquiry_buf + len, 265 - len, "  Type:   %s ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5268
	    i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] :
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5269
	    "Unknown          ");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5270
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5271
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5272
	len += snprintf(inquiry_buf + len, 265 - len,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5273
	    "                 ANSI SCSI revision: %02x", scsi_inq[2] & 0x07);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5274
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5275
	if ((scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5276
		len += snprintf(inquiry_buf + len, 265 - len, " CCS\n");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5277
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5278
		len += snprintf(inquiry_buf + len, 265 - len, "\n");
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5279
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5280
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5281
	con_log(CL_ANN1, (CE_CONT, inquiry_buf));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5282
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5283
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5284
static void
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5285
io_timeout_checker(void *arg)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5286
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5287
	struct scsi_pkt *pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5288
	struct mrsas_instance *instance = arg;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5289
	struct mrsas_cmd	*cmd = NULL;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5290
	struct mrsas_header	*hdr;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5291
	int time = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5292
	int counter = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5293
	struct mlist_head	*pos, *next;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5294
	mlist_t			process_list;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5295
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5296
	if (instance->adapterresetinprogress == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5297
		con_log(CL_ANN1, (CE_NOTE, "io_timeout_checker"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5298
		    " reset in progress"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5299
		instance->timeout_id = timeout(io_timeout_checker,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5300
		    (void *) instance, drv_usectohz(MRSAS_1_SECOND));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5301
		return;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5302
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5303
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5304
	/* See if this check needs to be in the beginning or last in ISR */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5305
	if (mrsas_initiate_ocr_if_fw_is_faulty(instance) ==  1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5306
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5307
		    "Fw Fault state Handling in io_timeout_checker"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5308
		if (instance->adapterresetinprogress == 0) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5309
			(void) mrsas_reset_ppc(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5310
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5311
		instance->timeout_id = timeout(io_timeout_checker,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5312
		    (void *) instance, drv_usectohz(MRSAS_1_SECOND));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5313
		return;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5314
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5315
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5316
	INIT_LIST_HEAD(&process_list);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5317
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5318
	mutex_enter(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5319
	mlist_for_each_safe(pos, next, &instance->cmd_pend_list) {
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5320
		cmd = mlist_entry(pos, struct mrsas_cmd, list);
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5321
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5322
		if (cmd == NULL) {
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5323
			continue;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5324
		}
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5325
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5326
		if (cmd->sync_cmd == MRSAS_TRUE) {
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5327
			hdr = (struct mrsas_header *)&cmd->frame->hdr;
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5328
			if (hdr == NULL) {
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5329
				continue;
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5330
			}
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5331
			time = --cmd->drv_pkt_time;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5332
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5333
			pkt = cmd->pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5334
			if (pkt == NULL) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5335
				continue;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5336
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5337
			time = --cmd->drv_pkt_time;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5338
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5339
		if (time <= 0) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5340
			con_log(CL_ANN1, (CE_NOTE, "%llx: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5341
			    "io_timeout_checker: TIMING OUT: pkt "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5342
			    ": %p, cmd %p", gethrtime(), (void *)pkt,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5343
			    (void *)cmd));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5344
			counter++;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5345
			break;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5346
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5347
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5348
	mutex_exit(&instance->cmd_pend_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5349
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5350
	if (counter) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5351
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5352
		    "io_timeout_checker "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5353
		    "cmd->retrycount_for_ocr %d, "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5354
		    "cmd index %d , cmd address %p ",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5355
		    cmd->retry_count_for_ocr+1, cmd->index, (void *)cmd));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5356
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5357
		if (instance->disable_online_ctrl_reset == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5358
			con_log(CL_ANN1, (CE_NOTE, "mrsas: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5359
			    "OCR is not supported by the Firmware "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5360
			    "Failing all the queued packets \n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5361
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5362
			(void) mrsas_kill_adapter(instance);
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5363
			return;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5364
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5365
			if (cmd->retry_count_for_ocr <=  IO_RETRY_COUNT) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5366
				if (instance->adapterresetinprogress == 0) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5367
				con_log(CL_ANN1, (CE_NOTE, "mrsas: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5368
				    "OCR is supported by FW "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5369
				    "triggering  mrsas_reset_ppc"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5370
				(void) mrsas_reset_ppc(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5371
				}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5372
			} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5373
				con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5374
				    "io_timeout_checker:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5375
				    " cmdindex: %d,cmd address: %p "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5376
				    "timed out even after 3 resets: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5377
				    "so kill adapter", cmd->index,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5378
				    (void *)cmd));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5379
				(void) mrsas_kill_adapter(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5380
				return;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5381
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5382
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5383
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5384
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5385
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5386
	con_log(CL_ANN1, (CE_NOTE, "mrsas: "
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5387
	    "schedule next timeout check: "
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5388
	    "do timeout \n"));
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5389
	instance->timeout_id =
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5390
	    timeout(io_timeout_checker, (void *)instance,
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5391
	    drv_usectohz(MRSAS_1_SECOND));
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5392
}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5393
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5394
read_fw_status_reg_ppc(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5395
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5396
	return ((int)RD_OB_SCRATCH_PAD_0(instance));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5397
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5398
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5399
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5400
issue_cmd_ppc(struct mrsas_cmd *cmd, struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5401
{
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5402
	struct scsi_pkt *pkt;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5403
	atomic_add_16(&instance->fw_outstanding, 1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5404
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5405
	pkt = cmd->pkt;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5406
	if (pkt) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5407
		con_log(CL_ANN1, (CE_CONT, "%llx : issue_cmd_ppc:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5408
		    "ISSUED CMD TO FW : called : cmd:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5409
		    ": %p instance : %p pkt : %p pkt_time : %x\n",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5410
		    gethrtime(), (void *)cmd, (void *)instance,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5411
		    (void *)pkt, cmd->drv_pkt_time));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5412
		if (instance->adapterresetinprogress) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5413
			cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5414
			con_log(CL_ANN1, (CE_NOTE, "Reset the scsi_pkt timer"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5415
		} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5416
			push_pending_mfi_pkt(instance, cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5417
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5418
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5419
	} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5420
		con_log(CL_ANN1, (CE_CONT, "%llx : issue_cmd_ppc:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5421
		    "ISSUED CMD TO FW : called : cmd : %p, instance: %p"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5422
		    "(NO PKT)\n", gethrtime(), (void *)cmd, (void *)instance));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5423
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5424
	/* Issue the command to the FW */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5425
	WR_IB_QPORT((cmd->frame_phys_addr) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5426
	    (((cmd->frame_count - 1) << 1) | 1), instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5427
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5428
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5429
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5430
 * issue_cmd_in_sync_mode
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5431
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5432
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5433
issue_cmd_in_sync_mode_ppc(struct mrsas_instance *instance,
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5434
struct mrsas_cmd *cmd)
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5435
{
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5436
	int	i;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5437
	uint32_t	msecs = MFI_POLL_TIMEOUT_SECS * (10 * MILLISEC);
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5438
	struct mrsas_header *hdr = &cmd->frame->hdr;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5439
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5440
	con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_sync_mode_ppc: called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5441
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5442
	if (instance->adapterresetinprogress) {
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5443
		cmd->drv_pkt_time = ddi_get16(
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5444
		    cmd->frame_dma_obj.acc_handle, &hdr->timeout);
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5445
		if (cmd->drv_pkt_time < debug_timeout_g)
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5446
			cmd->drv_pkt_time = (uint16_t)debug_timeout_g;
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5447
		con_log(CL_ANN1, (CE_NOTE, "sync_mode_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5448
		    "issue and return in reset case\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5449
		WR_IB_QPORT((cmd->frame_phys_addr) |
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5450
		    (((cmd->frame_count - 1) << 1) | 1), instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5451
		return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5452
	} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5453
		con_log(CL_ANN1, (CE_NOTE, "sync_mode_ppc: pushing the pkt\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5454
		push_pending_mfi_pkt(instance, cmd);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5455
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5456
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5457
	cmd->cmd_status	= ENODATA;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5458
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5459
	WR_IB_QPORT((cmd->frame_phys_addr) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5460
	    (((cmd->frame_count - 1) << 1) | 1), instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5461
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5462
	mutex_enter(&instance->int_cmd_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5463
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5464
	for (i = 0; i < msecs && (cmd->cmd_status == ENODATA); i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5465
		cv_wait(&instance->int_cmd_cv, &instance->int_cmd_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5466
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5467
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5468
	mutex_exit(&instance->int_cmd_mtx);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5469
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5470
	con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_sync_mode_ppc: done"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5471
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5472
	if (i < (msecs -1)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5473
		return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5474
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5475
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5476
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5477
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5478
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5479
/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5480
 * issue_cmd_in_poll_mode
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5481
 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5482
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5483
issue_cmd_in_poll_mode_ppc(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5484
    struct mrsas_cmd *cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5485
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5486
	int		i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5487
	uint16_t	flags;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5488
	uint32_t	msecs = MFI_POLL_TIMEOUT_SECS * MILLISEC;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5489
	struct mrsas_header *frame_hdr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5490
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5491
	con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_poll_mode_ppc: called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5492
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5493
	frame_hdr = (struct mrsas_header *)cmd->frame;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5494
	ddi_put8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5495
	    MFI_CMD_STATUS_POLL_MODE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5496
	flags = ddi_get16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5497
	flags 	|= MFI_FRAME_DONT_POST_IN_REPLY_QUEUE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5498
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5499
	ddi_put16(cmd->frame_dma_obj.acc_handle, &frame_hdr->flags, flags);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5500
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5501
	/* issue the frame using inbound queue port */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5502
	WR_IB_QPORT((cmd->frame_phys_addr) |
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5503
	    (((cmd->frame_count - 1) << 1) | 1), instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5504
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5505
	/* wait for cmd_status to change from 0xFF */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5506
	for (i = 0; i < msecs && (
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5507
	    ddi_get8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5508
	    == MFI_CMD_STATUS_POLL_MODE); i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5509
		drv_usecwait(MILLISEC); /* wait for 1000 usecs */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5510
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5511
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5512
	if (ddi_get8(cmd->frame_dma_obj.acc_handle, &frame_hdr->cmd_status)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5513
	    == MFI_CMD_STATUS_POLL_MODE) {
12356
1bca2256c259 6826343 mr_sas driver should support fastboot
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12244
diff changeset
  5514
		con_log(CL_ANN1, (CE_NOTE, "issue_cmd_in_poll_mode: "
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5515
		    "cmd polling timed out"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5516
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5517
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5518
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5519
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5520
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5521
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5522
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5523
enable_intr_ppc(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5524
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5525
	uint32_t	mask;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5526
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5527
	con_log(CL_ANN1, (CE_NOTE, "enable_intr_ppc: called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5528
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5529
	/* WR_OB_DOORBELL_CLEAR(0xFFFFFFFF, instance); */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5530
	WR_OB_DOORBELL_CLEAR(OB_DOORBELL_CLEAR_MASK, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5531
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5532
	/* WR_OB_INTR_MASK(~0x80000000, instance); */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5533
	WR_OB_INTR_MASK(~(MFI_REPLY_2108_MESSAGE_INTR_MASK), instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5534
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5535
	/* dummy read to force PCI flush */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5536
	mask = RD_OB_INTR_MASK(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5537
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5538
	con_log(CL_ANN1, (CE_NOTE, "enable_intr_ppc: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5539
	    "outbound_intr_mask = 0x%x", mask));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5540
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5541
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5542
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5543
disable_intr_ppc(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5544
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5545
	uint32_t	mask;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5546
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5547
	con_log(CL_ANN1, (CE_NOTE, "disable_intr_ppc: called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5548
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5549
	con_log(CL_ANN1, (CE_NOTE, "disable_intr_ppc: before : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5550
	    "outbound_intr_mask = 0x%x", RD_OB_INTR_MASK(instance)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5551
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5552
	/* WR_OB_INTR_MASK(0xFFFFFFFF, instance); */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5553
	WR_OB_INTR_MASK(OB_INTR_MASK, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5554
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5555
	con_log(CL_ANN1, (CE_NOTE, "disable_intr_ppc: after : "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5556
	    "outbound_intr_mask = 0x%x", RD_OB_INTR_MASK(instance)));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5557
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5558
	/* dummy read to force PCI flush */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5559
	mask = RD_OB_INTR_MASK(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5560
#ifdef lint
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5561
	mask = mask;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5562
#endif
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5563
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5564
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5565
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5566
intr_ack_ppc(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5567
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5568
	uint32_t	status;
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5569
	int ret = DDI_INTR_CLAIMED;
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5570
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5571
	con_log(CL_ANN1, (CE_NOTE, "intr_ack_ppc: called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5572
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5573
	/* check if it is our interrupt */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5574
	status = RD_OB_INTR_STATUS(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5575
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5576
	con_log(CL_ANN1, (CE_NOTE, "intr_ack_ppc: status = 0x%x", status));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5577
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5578
	if (!(status & MFI_REPLY_2108_MESSAGE_INTR)) {
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5579
		ret = DDI_INTR_UNCLAIMED;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5580
	}
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5581
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5582
	if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
10600
687e6ace87ba 6874823 mr_sas driver should automatically enable MSI and MSI-X interrupts
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9795
diff changeset
  5583
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_LOST);
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5584
		ret = DDI_INTR_UNCLAIMED;
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5585
	}
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5586
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5587
	if (ret == DDI_INTR_UNCLAIMED) {
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5588
		return (ret);
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5589
	}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5590
	/* clear the interrupt by writing back the same value */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5591
	WR_OB_DOORBELL_CLEAR(status, instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5592
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5593
	/* dummy READ */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5594
	status = RD_OB_INTR_STATUS(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5595
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5596
	con_log(CL_ANN1, (CE_NOTE, "intr_ack_ppc: interrupt cleared"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5597
9795
152ae1212035 6813803 Solaris needs SAS 2.0 MegaRAID mr_sas driver on Sparc
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 9440
diff changeset
  5598
	return (ret);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5599
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5600
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5601
/*
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5602
 * Marks HBA as bad. This will be called either when an
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5603
 * IO packet times out even after 3 FW resets
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5604
 * or FW is found to be fault even after 3 continuous resets.
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5605
 */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5606
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5607
static int
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5608
mrsas_kill_adapter(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5609
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5610
		if (instance->deadadapter == 1)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5611
			return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5612
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5613
		con_log(CL_ANN1, (CE_NOTE, "mrsas_kill_adapter: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5614
		    "Writing to doorbell with MFI_STOP_ADP "));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5615
		mutex_enter(&instance->ocr_flags_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5616
		instance->deadadapter = 1;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5617
		mutex_exit(&instance->ocr_flags_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5618
		instance->func_ptr->disable_intr(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5619
		WR_IB_DOORBELL(MFI_STOP_ADP, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5620
		(void) mrsas_complete_pending_cmds(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5621
		return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5622
}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5623
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5624
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5625
static int
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5626
mrsas_reset_ppc(struct mrsas_instance *instance)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5627
{
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5628
	uint32_t status;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5629
	uint32_t retry = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5630
	uint32_t cur_abs_reg_val;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5631
	uint32_t fw_state;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5632
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5633
	if (instance->deadadapter == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5634
		con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5635
		    "no more resets as HBA has been marked dead "));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5636
		return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5637
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5638
	mutex_enter(&instance->ocr_flags_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5639
	instance->adapterresetinprogress = 1;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5640
	mutex_exit(&instance->ocr_flags_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5641
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: adpterresetinprogress "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5642
	    "flag set, time %llx", gethrtime()));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5643
	instance->func_ptr->disable_intr(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5644
retry_reset:
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5645
	WR_IB_WRITE_SEQ(0, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5646
	WR_IB_WRITE_SEQ(4, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5647
	WR_IB_WRITE_SEQ(0xb, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5648
	WR_IB_WRITE_SEQ(2, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5649
	WR_IB_WRITE_SEQ(7, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5650
	WR_IB_WRITE_SEQ(0xd, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5651
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: magic number written "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5652
	    "to write sequence register\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5653
	delay(100 * drv_usectohz(MILLISEC));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5654
	status = RD_OB_DRWE(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5655
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5656
	while (!(status & DIAG_WRITE_ENABLE)) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5657
		delay(100 * drv_usectohz(MILLISEC));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5658
		status = RD_OB_DRWE(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5659
		if (retry++ == 100) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5660
			con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: DRWE bit "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5661
			    "check retry count %d\n", retry));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5662
			return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5663
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5664
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5665
	WR_IB_DRWE(status | DIAG_RESET_ADAPTER, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5666
	delay(100 * drv_usectohz(MILLISEC));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5667
	status = RD_OB_DRWE(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5668
	while (status & DIAG_RESET_ADAPTER) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5669
		delay(100 * drv_usectohz(MILLISEC));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5670
		status = RD_OB_DRWE(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5671
		if (retry++ == 100) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5672
			(void) mrsas_kill_adapter(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5673
			return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5674
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5675
	}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5676
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: Adapter reset complete"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5677
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5678
	    "Calling mfi_state_transition_to_ready"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5679
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5680
	/* Mark HBA as bad, if FW is fault after 3 continuous resets */
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5681
	if (mfi_state_transition_to_ready(instance) ||
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5682
	    debug_fw_faults_after_ocr_g == 1) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5683
		cur_abs_reg_val =
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5684
		    instance->func_ptr->read_fw_status_reg(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5685
		fw_state	= cur_abs_reg_val & MFI_STATE_MASK;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5686
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5687
#ifdef OCRDEBUG
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5688
		con_log(CL_ANN1, (CE_NOTE,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5689
		    "mrsas_reset_ppc :before fake: FW is not ready "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5690
		    "FW state = 0x%x", fw_state));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5691
		if (debug_fw_faults_after_ocr_g == 1)
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5692
			fw_state = MFI_STATE_FAULT;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5693
#endif
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5694
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5695
		con_log(CL_ANN1, (CE_NOTE,  "mrsas_reset_ppc : FW is not ready "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5696
		    "FW state = 0x%x", fw_state));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5697
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5698
		if (fw_state == MFI_STATE_FAULT) {
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5699
			/* increment the count */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5700
			instance->fw_fault_count_after_ocr++;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5701
			if (instance->fw_fault_count_after_ocr
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5702
			    < MAX_FW_RESET_COUNT) {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5703
				con_log(CL_ANN1, (CE_WARN, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5704
				    "FW is in fault after OCR count %d ",
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5705
				    instance->fw_fault_count_after_ocr));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5706
				goto retry_reset;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5707
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5708
			} else {
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5709
				con_log(CL_ANN1, (CE_WARN, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5710
				    "Max Reset Count exceeded "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5711
				    "Mark HBA as bad"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5712
				(void) mrsas_kill_adapter(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5713
				return (DDI_FAILURE);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5714
			}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5715
		}
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5716
	}
12757
e25e7e1b3c65 6962689 application DCMD timeout count is truncated by OCR
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 12638
diff changeset
  5717
	/* reset the counter as FW is up after OCR */
12244
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5718
	instance->fw_fault_count_after_ocr = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5719
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5720
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5721
	ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5722
	    instance->producer, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5723
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5724
	ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5725
	    instance->consumer, 0);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5726
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5727
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5728
	    " after resetting produconsumer chck indexs:"
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5729
	    "producer %x consumer %x", *instance->producer,
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5730
	    *instance->consumer));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5731
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5732
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5733
	    "Calling mrsas_issue_init_mfi"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5734
	(void) mrsas_issue_init_mfi(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5735
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5736
	    "mrsas_issue_init_mfi Done"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5737
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5738
	    "Calling mrsas_print_pending_cmd\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5739
	(void) mrsas_print_pending_cmds(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5740
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5741
	    "mrsas_print_pending_cmd done\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5742
	instance->func_ptr->enable_intr(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5743
	instance->fw_outstanding = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5744
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5745
	    "Calling mrsas_issue_pending_cmds"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5746
	(void) mrsas_issue_pending_cmds(instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5747
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5748
	"Complete"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5749
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5750
	    "Calling aen registration"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5751
	instance->func_ptr->issue_cmd(instance->aen_cmd, instance);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5752
	con_log(CL_ANN1, (CE_NOTE, "Unsetting adpresetinprogress flag.\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5753
	mutex_enter(&instance->ocr_flags_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5754
	instance->adapterresetinprogress = 0;
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5755
	mutex_exit(&instance->ocr_flags_mtx);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5756
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc: "
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5757
	    "adpterresetinprogress flag unset"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5758
	con_log(CL_ANN1, (CE_NOTE, "mrsas_reset_ppc done\n"));
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5759
	return (DDI_SUCCESS);
9332ab22b7ba 6814017 mr_sas driver should support timeout
Yu Wu - Sun Microsystems - Beijing China <Yu.Wu@Sun.COM>
parents: 11856
diff changeset
  5760
}
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5761
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5762
mrsas_common_check(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5763
    struct  mrsas_cmd *cmd)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5764
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5765
	int ret = DDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5766
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5767
	if (mrsas_check_dma_handle(cmd->frame_dma_obj.dma_handle) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5768
	    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5769
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5770
		if (cmd->pkt != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5771
			cmd->pkt->pkt_reason = CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5772
			cmd->pkt->pkt_statistics = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5773
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5774
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5775
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5776
	if (mrsas_check_dma_handle(instance->mfi_internal_dma_obj.dma_handle)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5777
	    != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5778
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5779
		if (cmd->pkt != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5780
			cmd->pkt->pkt_reason = CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5781
			cmd->pkt->pkt_statistics = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5782
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5783
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5784
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5785
	if (mrsas_check_dma_handle(instance->mfi_evt_detail_obj.dma_handle) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5786
	    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5787
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5788
		if (cmd->pkt != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5789
			cmd->pkt->pkt_reason = CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5790
			cmd->pkt->pkt_statistics = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5791
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5792
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5793
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5794
	if (mrsas_check_acc_handle(instance->regmap_handle) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5795
		ddi_fm_service_impact(instance->dip, DDI_SERVICE_UNAFFECTED);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5796
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5797
		ddi_fm_acc_err_clear(instance->regmap_handle, DDI_FME_VER0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5798
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5799
		if (cmd->pkt != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5800
			cmd->pkt->pkt_reason = CMD_TRAN_ERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5801
			cmd->pkt->pkt_statistics = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5802
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5803
		ret = DDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5804
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5805
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5806
	return (ret);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5807
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5808
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5809
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5810
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5811
mrsas_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5812
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5813
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5814
	 * as the driver can always deal with an error in any dma or
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5815
	 * access handle, we can just return the fme_status value.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5816
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5817
	pci_ereport_post(dip, err, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5818
	return (err->fme_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5819
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5820
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5821
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5822
mrsas_fm_init(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5823
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5824
	/* Need to change iblock to priority for new MSI intr */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5825
	ddi_iblock_cookie_t fm_ibc;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5826
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5827
	/* Only register with IO Fault Services if we have some capability */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5828
	if (instance->fm_capabilities) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5829
		/* Adjust access and dma attributes for FMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5830
		endian_attr.devacc_attr_access = DDI_FLAGERR_ACC;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5831
		mrsas_generic_dma_attr.dma_attr_flags = DDI_DMA_FLAGERR;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5832
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5833
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5834
		 * Register capabilities with IO Fault Services.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5835
		 * fm_capabilities will be updated to indicate
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5836
		 * capabilities actually supported (not requested.)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5837
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5838
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5839
		ddi_fm_init(instance->dip, &instance->fm_capabilities, &fm_ibc);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5840
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5841
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5842
		 * Initialize pci ereport capabilities if ereport
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5843
		 * capable (should always be.)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5844
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5845
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5846
		if (DDI_FM_EREPORT_CAP(instance->fm_capabilities) ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5847
		    DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5848
			pci_ereport_setup(instance->dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5849
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5850
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5851
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5852
		 * Register error callback if error callback capable.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5853
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5854
		if (DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5855
			ddi_fm_handler_register(instance->dip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5856
			    mrsas_fm_error_cb, (void*) instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5857
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5858
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5859
		endian_attr.devacc_attr_access = DDI_DEFAULT_ACC;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5860
		mrsas_generic_dma_attr.dma_attr_flags = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5861
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5862
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5863
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5864
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5865
mrsas_fm_fini(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5866
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5867
	/* Only unregister FMA capabilities if registered */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5868
	if (instance->fm_capabilities) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5869
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5870
		 * Un-register error callback if error callback capable.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5871
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5872
		if (DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5873
			ddi_fm_handler_unregister(instance->dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5874
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5875
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5876
		/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5877
		 * Release any resources allocated by pci_ereport_setup()
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5878
		 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5879
		if (DDI_FM_EREPORT_CAP(instance->fm_capabilities) ||
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5880
		    DDI_FM_ERRCB_CAP(instance->fm_capabilities)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5881
			pci_ereport_teardown(instance->dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5882
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5883
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5884
		/* Unregister from IO Fault Services */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5885
		ddi_fm_fini(instance->dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5886
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5887
		/* Adjust access and dma attributes for FMA */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5888
		endian_attr.devacc_attr_access = DDI_DEFAULT_ACC;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5889
		mrsas_generic_dma_attr.dma_attr_flags = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5890
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5891
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5892
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5893
int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5894
mrsas_check_acc_handle(ddi_acc_handle_t handle)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5895
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5896
	ddi_fm_error_t de;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5897
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5898
	if (handle == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5899
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5900
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5901
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5902
	ddi_fm_acc_err_get(handle, &de, DDI_FME_VERSION);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5903
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5904
	return (de.fme_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5905
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5906
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5907
int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5908
mrsas_check_dma_handle(ddi_dma_handle_t handle)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5909
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5910
	ddi_fm_error_t de;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5911
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5912
	if (handle == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5913
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5914
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5915
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5916
	ddi_fm_dma_err_get(handle, &de, DDI_FME_VERSION);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5917
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5918
	return (de.fme_status);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5919
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5920
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5921
void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5922
mrsas_fm_ereport(struct mrsas_instance *instance, char *detail)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5923
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5924
	uint64_t ena;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5925
	char buf[FM_MAX_CLASS];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5926
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5927
	(void) snprintf(buf, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, detail);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5928
	ena = fm_ena_generate(0, FM_ENA_FMT1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5929
	if (DDI_FM_EREPORT_CAP(instance->fm_capabilities)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5930
		ddi_fm_ereport_post(instance->dip, buf, ena, DDI_NOSLEEP,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5931
		    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERSION, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5932
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5933
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5934
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5935
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5936
mrsas_add_intrs(struct mrsas_instance *instance, int intr_type)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5937
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5938
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5939
	dev_info_t *dip = instance->dip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5940
	int	avail, actual, count;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5941
	int	i, flag, ret;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5942
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5943
	con_log(CL_DLEVEL1, (CE_WARN, "mrsas_add_intrs: intr_type = %x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5944
	    intr_type));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5945
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5946
	/* Get number of interrupts */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5947
	ret = ddi_intr_get_nintrs(dip, intr_type, &count);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5948
	if ((ret != DDI_SUCCESS) || (count == 0)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5949
		con_log(CL_ANN, (CE_WARN, "ddi_intr_get_nintrs() failed:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5950
		    "ret %d count %d", ret, count));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5951
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5952
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5953
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5954
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5955
	con_log(CL_DLEVEL1, (CE_WARN, "mrsas_add_intrs: count = %d ", count));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5956
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5957
	/* Get number of available interrupts */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5958
	ret = ddi_intr_get_navail(dip, intr_type, &avail);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5959
	if ((ret != DDI_SUCCESS) || (avail == 0)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5960
		con_log(CL_ANN, (CE_WARN, "ddi_intr_get_navail() failed:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5961
		    "ret %d avail %d", ret, avail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5962
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5963
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5964
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5965
	con_log(CL_DLEVEL1, (CE_WARN, "mrsas_add_intrs: avail = %d ", avail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5966
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5967
	/* Only one interrupt routine. So limit the count to 1 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5968
	if (count > 1) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5969
		count = 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5970
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5971
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5972
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5973
	 * Allocate an array of interrupt handlers. Currently we support
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5974
	 * only one interrupt. The framework can be extended later.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5975
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5976
	instance->intr_size = count * sizeof (ddi_intr_handle_t);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5977
	instance->intr_htable = kmem_zalloc(instance->intr_size, KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5978
	ASSERT(instance->intr_htable);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5979
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5980
	flag = ((intr_type == DDI_INTR_TYPE_MSI) || (intr_type ==
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5981
	    DDI_INTR_TYPE_MSIX)) ? DDI_INTR_ALLOC_STRICT:DDI_INTR_ALLOC_NORMAL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5982
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5983
	/* Allocate interrupt */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5984
	ret = ddi_intr_alloc(dip, instance->intr_htable, intr_type, 0,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5985
	    count, &actual, flag);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5986
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5987
	if ((ret != DDI_SUCCESS) || (actual == 0)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5988
		con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5989
		    "avail = %d", avail));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5990
		kmem_free(instance->intr_htable, instance->intr_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5991
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5992
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5993
	if (actual < count) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5994
		con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5995
		    "Requested = %d  Received = %d", count, actual));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5996
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5997
	instance->intr_cnt = actual;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5998
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  5999
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6000
	 * Get the priority of the interrupt allocated.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6001
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6002
	if ((ret = ddi_intr_get_pri(instance->intr_htable[0],
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6003
	    &instance->intr_pri)) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6004
		con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6005
		    "get priority call failed"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6006
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6007
		for (i = 0; i < actual; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6008
			(void) ddi_intr_free(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6009
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6010
		kmem_free(instance->intr_htable, instance->intr_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6011
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6012
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6013
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6014
	/*
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6015
	 * Test for high level mutex. we don't support them.
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6016
	 */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6017
	if (instance->intr_pri >= ddi_intr_get_hilevel_pri()) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6018
		con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs: "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6019
		    "High level interrupts not supported."));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6020
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6021
		for (i = 0; i < actual; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6022
			(void) ddi_intr_free(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6023
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6024
		kmem_free(instance->intr_htable, instance->intr_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6025
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6026
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6027
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6028
	con_log(CL_DLEVEL1, (CE_NOTE, "mrsas_add_intrs: intr_pri = 0x%x ",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6029
	    instance->intr_pri));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6030
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6031
	/* Call ddi_intr_add_handler() */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6032
	for (i = 0; i < actual; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6033
		ret = ddi_intr_add_handler(instance->intr_htable[i],
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6034
		    (ddi_intr_handler_t *)mrsas_isr, (caddr_t)instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6035
		    (caddr_t)(uintptr_t)i);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6036
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6037
		if (ret != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6038
			con_log(CL_ANN, (CE_WARN, "mrsas_add_intrs:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6039
			    "failed %d", ret));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6040
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6041
			for (i = 0; i < actual; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6042
				(void) ddi_intr_free(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6043
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6044
			kmem_free(instance->intr_htable, instance->intr_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6045
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6046
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6047
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6048
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6049
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6050
	con_log(CL_DLEVEL1, (CE_WARN, " ddi_intr_add_handler done"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6051
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6052
	if ((ret = ddi_intr_get_cap(instance->intr_htable[0],
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6053
	    &instance->intr_cap)) != DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6054
		con_log(CL_ANN, (CE_WARN, "ddi_intr_get_cap() failed %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6055
		    ret));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6056
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6057
		/* Free already allocated intr */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6058
		for (i = 0; i < actual; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6059
			(void) ddi_intr_remove_handler(
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6060
			    instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6061
			(void) ddi_intr_free(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6062
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6063
		kmem_free(instance->intr_htable, instance->intr_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6064
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6065
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6066
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6067
	if (instance->intr_cap &  DDI_INTR_FLAG_BLOCK) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6068
		con_log(CL_ANN, (CE_WARN, "Calling ddi_intr_block _enable"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6069
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6070
		(void) ddi_intr_block_enable(instance->intr_htable,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6071
		    instance->intr_cnt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6072
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6073
		con_log(CL_ANN, (CE_NOTE, " calling ddi_intr_enable"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6074
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6075
		for (i = 0; i < instance->intr_cnt; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6076
			(void) ddi_intr_enable(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6077
			con_log(CL_ANN, (CE_NOTE, "ddi intr enable returns "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6078
			    "%d", i));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6079
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6080
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6081
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6082
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6083
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6084
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6085
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6086
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6087
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6088
mrsas_rem_intrs(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6089
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6090
	int i;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6091
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6092
	con_log(CL_ANN, (CE_NOTE, "mrsas_rem_intrs called"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6093
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6094
	/* Disable all interrupts first */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6095
	if (instance->intr_cap & DDI_INTR_FLAG_BLOCK) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6096
		(void) ddi_intr_block_disable(instance->intr_htable,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6097
		    instance->intr_cnt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6098
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6099
		for (i = 0; i < instance->intr_cnt; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6100
			(void) ddi_intr_disable(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6101
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6102
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6103
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6104
	/* Remove all the handlers */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6105
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6106
	for (i = 0; i < instance->intr_cnt; i++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6107
		(void) ddi_intr_remove_handler(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6108
		(void) ddi_intr_free(instance->intr_htable[i]);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6109
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6110
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6111
	kmem_free(instance->intr_htable, instance->intr_size);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6112
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6113
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6114
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6115
mrsas_tran_bus_config(dev_info_t *parent, uint_t flags,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6116
    ddi_bus_config_op_t op, void *arg, dev_info_t **childp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6117
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6118
	struct mrsas_instance *instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6119
	int config;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6120
	int rval;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6121
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6122
	char *ptr = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6123
	int tgt, lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6124
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6125
	con_log(CL_ANN1, (CE_NOTE, "Bus config called for op = %x", op));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6126
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6127
	if ((instance = ddi_get_soft_state(mrsas_state,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6128
	    ddi_get_instance(parent))) == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6129
		return (NDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6130
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6131
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6132
	/* Hold nexus during bus_config */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6133
	ndi_devi_enter(parent, &config);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6134
	switch (op) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6135
	case BUS_CONFIG_ONE: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6136
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6137
		/* parse wwid/target name out of name given */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6138
		if ((ptr = strchr((char *)arg, '@')) == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6139
			rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6140
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6141
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6142
		ptr++;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6143
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6144
		if (mrsas_parse_devname(arg, &tgt, &lun) != 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6145
			rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6146
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6147
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6148
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6149
		if (lun == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6150
			rval = mrsas_config_ld(instance, tgt, lun, childp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6151
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6152
			rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6153
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6154
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6155
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6156
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6157
	case BUS_CONFIG_DRIVER:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6158
	case BUS_CONFIG_ALL: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6159
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6160
		rval = mrsas_config_all_devices(instance);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6161
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6162
		rval = NDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6163
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6164
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6165
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6166
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6167
	if (rval == NDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6168
		rval = ndi_busop_bus_config(parent, flags, op, arg, childp, 0);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6169
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6170
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6171
	ndi_devi_exit(parent, config);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6172
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6173
	con_log(CL_ANN1, (CE_NOTE, "mrsas_tran_bus_config: rval = %x",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6174
	    rval));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6175
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6176
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6177
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6178
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6179
mrsas_config_all_devices(struct mrsas_instance *instance)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6180
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6181
	int rval, tgt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6182
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6183
	for (tgt = 0; tgt < MRDRV_MAX_LD; tgt++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6184
		(void) mrsas_config_ld(instance, tgt, 0, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6185
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6186
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6187
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6188
	rval = NDI_SUCCESS;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6189
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6190
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6191
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6192
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6193
mrsas_parse_devname(char *devnm, int *tgt, int *lun)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6194
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6195
	char devbuf[SCSI_MAXNAMELEN];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6196
	char *addr;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6197
	char *p,  *tp, *lp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6198
	long num;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6199
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6200
	/* Parse dev name and address */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6201
	(void) strcpy(devbuf, devnm);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6202
	addr = "";
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6203
	for (p = devbuf; *p != '\0'; p++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6204
		if (*p == '@') {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6205
			addr = p + 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6206
			*p = '\0';
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6207
		} else if (*p == ':') {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6208
			*p = '\0';
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6209
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6210
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6211
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6212
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6213
	/* Parse target and lun */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6214
	for (p = tp = addr, lp = NULL; *p != '\0'; p++) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6215
		if (*p == ',') {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6216
			lp = p + 1;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6217
			*p = '\0';
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6218
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6219
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6220
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6221
	if (tgt && tp) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6222
		if (ddi_strtol(tp, NULL, 0x10, &num)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6223
			return (DDI_FAILURE); /* Can declare this as constant */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6224
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6225
			*tgt = (int)num;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6226
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6227
	if (lun && lp) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6228
		if (ddi_strtol(lp, NULL, 0x10, &num)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6229
			return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6230
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6231
			*lun = (int)num;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6232
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6233
	return (DDI_SUCCESS);  /* Success case */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6234
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6235
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6236
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6237
mrsas_config_ld(struct mrsas_instance *instance, uint16_t tgt,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6238
    uint8_t lun, dev_info_t **ldip)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6239
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6240
	struct scsi_device *sd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6241
	dev_info_t *child;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6242
	int rval;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6243
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6244
	con_log(CL_ANN1, (CE_NOTE, "mrsas_config_ld: t = %d l = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6245
	    tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6246
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6247
	if ((child = mrsas_find_child(instance, tgt, lun)) != NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6248
		if (ldip) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6249
			*ldip = child;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6250
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6251
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6252
		    "mrsas_config_ld: Child = %p found t = %d l = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6253
		    (void *)child, tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6254
		return (NDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6255
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6256
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6257
	sd = kmem_zalloc(sizeof (struct scsi_device), KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6258
	sd->sd_address.a_hba_tran = instance->tran;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6259
	sd->sd_address.a_target = (uint16_t)tgt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6260
	sd->sd_address.a_lun = (uint8_t)lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6261
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6262
	if (scsi_hba_probe(sd, NULL) == SCSIPROBE_EXISTS)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6263
		rval = mrsas_config_scsi_device(instance, sd, ldip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6264
	else
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6265
		rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6266
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6267
	/* sd_unprobe is blank now. Free buffer manually */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6268
	if (sd->sd_inq) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6269
		kmem_free(sd->sd_inq, SUN_INQSIZE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6270
		sd->sd_inq = (struct scsi_inquiry *)NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6271
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6272
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6273
	kmem_free(sd, sizeof (struct scsi_device));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6274
	con_log(CL_ANN1, (CE_NOTE, "mrsas_config_ld: return rval = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6275
	    rval));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6276
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6277
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6278
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6279
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6280
mrsas_config_scsi_device(struct mrsas_instance *instance,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6281
    struct scsi_device *sd, dev_info_t **dipp)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6282
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6283
	char *nodename = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6284
	char **compatible = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6285
	int ncompatible = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6286
	char *childname;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6287
	dev_info_t *ldip = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6288
	int tgt = sd->sd_address.a_target;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6289
	int lun = sd->sd_address.a_lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6290
	int dtype = sd->sd_inq->inq_dtype & DTYPE_MASK;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6291
	int rval;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6292
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6293
	con_log(CL_ANN1, (CE_WARN, "mr_sas: scsi_device t%dL%d", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6294
	scsi_hba_nodename_compatible_get(sd->sd_inq, NULL, dtype,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6295
	    NULL, &nodename, &compatible, &ncompatible);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6296
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6297
	if (nodename == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6298
		con_log(CL_ANN1, (CE_WARN, "mr_sas: Found no compatible driver "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6299
		    "for t%dL%d", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6300
		rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6301
		goto finish;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6302
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6303
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6304
	childname = (dtype == DTYPE_DIRECT) ? "sd" : nodename;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6305
	con_log(CL_ANN1, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6306
	    "mr_sas: Childname = %2s nodename = %s", childname, nodename));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6307
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6308
	/* Create a dev node */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6309
	rval = ndi_devi_alloc(instance->dip, childname, DEVI_SID_NODEID, &ldip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6310
	con_log(CL_ANN1, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6311
	    "mr_sas_config_scsi_device: ndi_devi_alloc rval = %x", rval));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6312
	if (rval == NDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6313
		if (ndi_prop_update_int(DDI_DEV_T_NONE, ldip, "target", tgt) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6314
		    DDI_PROP_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6315
			con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to create "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6316
			    "property for t%dl%d target", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6317
			rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6318
			goto finish;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6319
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6320
		if (ndi_prop_update_int(DDI_DEV_T_NONE, ldip, "lun", lun) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6321
		    DDI_PROP_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6322
			con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to create "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6323
			    "property for t%dl%d lun", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6324
			rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6325
			goto finish;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6326
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6327
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6328
		if (ndi_prop_update_string_array(DDI_DEV_T_NONE, ldip,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6329
		    "compatible", compatible, ncompatible) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6330
		    DDI_PROP_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6331
			con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to create "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6332
			    "property for t%dl%d compatible", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6333
			rval = NDI_FAILURE;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6334
			goto finish;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6335
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6336
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6337
		rval = ndi_devi_online(ldip, NDI_ONLINE_ATTACH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6338
		if (rval != NDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6339
			con_log(CL_ANN1, (CE_WARN, "mr_sas: unable to online "
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6340
			    "t%dl%d", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6341
			ndi_prop_remove_all(ldip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6342
			(void) ndi_devi_free(ldip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6343
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6344
			con_log(CL_ANN1, (CE_WARN, "mr_sas: online Done :"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6345
			    "0 t%dl%d", tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6346
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6347
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6348
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6349
finish:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6350
	if (dipp) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6351
		*dipp = ldip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6352
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6353
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6354
	con_log(CL_DLEVEL1, (CE_WARN,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6355
	    "mr_sas: config_scsi_device rval = %d t%dL%d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6356
	    rval, tgt, lun));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6357
	scsi_hba_nodename_compatible_free(nodename, compatible);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6358
	return (rval);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6359
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6360
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6361
/*ARGSUSED*/
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6362
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6363
mrsas_service_evt(struct mrsas_instance *instance, int tgt, int lun, int event,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6364
    uint64_t wwn)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6365
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6366
	struct mrsas_eventinfo *mrevt = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6367
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6368
	con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6369
	    "mrsas_service_evt called for t%dl%d event = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6370
	    tgt, lun, event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6371
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6372
	if ((instance->taskq == NULL) || (mrevt =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6373
	    kmem_zalloc(sizeof (struct mrsas_eventinfo), KM_NOSLEEP)) == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6374
		return (ENOMEM);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6375
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6376
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6377
	mrevt->instance = instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6378
	mrevt->tgt = tgt;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6379
	mrevt->lun = lun;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6380
	mrevt->event = event;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6381
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6382
	if ((ddi_taskq_dispatch(instance->taskq,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6383
	    (void (*)(void *))mrsas_issue_evt_taskq, mrevt, DDI_NOSLEEP)) !=
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6384
	    DDI_SUCCESS) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6385
		con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6386
		    "mr_sas: Event task failed for t%dl%d event = %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6387
		    tgt, lun, event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6388
		kmem_free(mrevt, sizeof (struct mrsas_eventinfo));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6389
		return (DDI_FAILURE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6390
	}
10820
c5e75c2534ed 6852351 mr_sas driver should have dtrace probes added in critical places for performance and debugging
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents: 10600
diff changeset
  6391
	DTRACE_PROBE3(service_evt, int, tgt, int, lun, int, event);
9440
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6392
	return (DDI_SUCCESS);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6393
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6394
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6395
static void
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6396
mrsas_issue_evt_taskq(struct mrsas_eventinfo *mrevt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6397
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6398
	struct mrsas_instance *instance = mrevt->instance;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6399
	dev_info_t *dip, *pdip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6400
	int circ1 = 0;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6401
	char *devname;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6402
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6403
	con_log(CL_ANN1, (CE_NOTE, "mrsas_issue_evt_taskq: called for"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6404
	    " tgt %d lun %d event %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6405
	    mrevt->tgt, mrevt->lun, mrevt->event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6406
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6407
	if (mrevt->tgt < MRDRV_MAX_LD && mrevt->lun == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6408
		dip = instance->mr_ld_list[mrevt->tgt].dip;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6409
	} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6410
		return;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6411
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6412
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6413
	ndi_devi_enter(instance->dip, &circ1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6414
	switch (mrevt->event) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6415
	case MRSAS_EVT_CONFIG_TGT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6416
		if (dip == NULL) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6417
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6418
			if (mrevt->lun == 0) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6419
				(void) mrsas_config_ld(instance, mrevt->tgt,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6420
				    0, NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6421
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6422
			con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6423
			    "mr_sas: EVT_CONFIG_TGT called:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6424
			    " for tgt %d lun %d event %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6425
			    mrevt->tgt, mrevt->lun, mrevt->event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6426
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6427
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6428
			con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6429
			    "mr_sas: EVT_CONFIG_TGT dip != NULL:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6430
			    " for tgt %d lun %d event %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6431
			    mrevt->tgt, mrevt->lun, mrevt->event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6432
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6433
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6434
	case MRSAS_EVT_UNCONFIG_TGT:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6435
		if (dip) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6436
			if (i_ddi_devi_attached(dip)) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6437
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6438
				pdip = ddi_get_parent(dip);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6439
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6440
				devname = kmem_zalloc(MAXNAMELEN + 1, KM_SLEEP);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6441
				(void) ddi_deviname(dip, devname);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6442
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6443
				(void) devfs_clean(pdip, devname + 1,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6444
				    DV_CLEAN_FORCE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6445
				kmem_free(devname, MAXNAMELEN + 1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6446
			}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6447
			(void) ndi_devi_offline(dip, NDI_DEVI_REMOVE);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6448
			con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6449
			    "mr_sas: EVT_UNCONFIG_TGT called:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6450
			    " for tgt %d lun %d event %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6451
			    mrevt->tgt, mrevt->lun, mrevt->event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6452
		} else {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6453
			con_log(CL_ANN1, (CE_NOTE,
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6454
			    "mr_sas: EVT_UNCONFIG_TGT dip == NULL:"
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6455
			    " for tgt %d lun %d event %d",
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6456
			    mrevt->tgt, mrevt->lun, mrevt->event));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6457
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6458
		break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6459
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6460
	kmem_free(mrevt, sizeof (struct mrsas_eventinfo));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6461
	ndi_devi_exit(instance->dip, circ1);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6462
}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6463
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6464
static int
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6465
mrsas_mode_sense_build(struct scsi_pkt *pkt)
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6466
{
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6467
	union scsi_cdb		*cdbp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6468
	uint16_t 		page_code;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6469
	struct scsa_cmd		*acmd;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6470
	struct buf		*bp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6471
	struct mode_header	*modehdrp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6472
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6473
	cdbp = (void *)pkt->pkt_cdbp;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6474
	page_code = cdbp->cdb_un.sg.scsi[0];
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6475
	acmd = PKT2CMD(pkt);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6476
	bp = acmd->cmd_buf;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6477
	if ((!bp) && bp->b_un.b_addr && bp->b_bcount && acmd->cmd_dmacount) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6478
		con_log(CL_ANN1, (CE_WARN, "Failing MODESENSE Command"));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6479
		/* ADD pkt statistics as Command failed. */
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6480
		return (NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6481
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6482
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6483
	bp_mapin(bp);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6484
	bzero(bp->b_un.b_addr, bp->b_bcount);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6485
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6486
	switch (page_code) {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6487
		case 0x3: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6488
			struct mode_format *page3p = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6489
			modehdrp = (struct mode_header *)(bp->b_un.b_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6490
			modehdrp->bdesc_length = MODE_BLK_DESC_LENGTH;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6491
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6492
			page3p = (void *)((caddr_t)modehdrp +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6493
			    MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6494
			page3p->mode_page.code = 0x3;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6495
			page3p->mode_page.length =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6496
			    (uchar_t)(sizeof (struct mode_format));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6497
			page3p->data_bytes_sect = 512;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6498
			page3p->sect_track = 63;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6499
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6500
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6501
		case 0x4: {
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6502
			struct mode_geometry *page4p = NULL;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6503
			modehdrp = (struct mode_header *)(bp->b_un.b_addr);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6504
			modehdrp->bdesc_length = MODE_BLK_DESC_LENGTH;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6505
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6506
			page4p = (void *)((caddr_t)modehdrp +
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6507
			    MODE_HEADER_LENGTH + MODE_BLK_DESC_LENGTH);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6508
			page4p->mode_page.code = 0x4;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6509
			page4p->mode_page.length =
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6510
			    (uchar_t)(sizeof (struct mode_geometry));
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6511
			page4p->heads = 255;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6512
			page4p->rpm = 10000;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6513
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6514
		}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6515
		default:
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6516
			break;
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6517
	}
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6518
	return (NULL);
eea09f1f5a59 6770895 Solaris needs SAS 2.0 MegaRAID mr_sas driver
Susan Scheufele <Susan.Scheufele@Sun.COM>
parents:
diff changeset
  6519
}