usr/src/uts/common/io/scsi/adapters/pmcs/pmcs_scsa.c
author Jesse Butler <jesse.butler@oracle.com>
Thu, 12 Aug 2010 14:52:21 -0600
changeset 13102 579992f451e3
parent 13017 f651e899cbc9
permissions -rw-r--r--
6973916 pmcs smp synchronization change causing livelocks
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     1
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     2
 * CDDL HEADER START
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     3
 *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     7
 *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    11
 * and limitations under the License.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    12
 *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    18
 *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    19
 * CDDL HEADER END
12060
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
    20
 */
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
    21
/*
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
    22
 * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    23
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    24
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    25
 * SCSI (SCSA) midlayer interface for PMC drier.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    26
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    27
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    28
#include <sys/scsi/adapters/pmcs/pmcs.h>
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    29
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    30
extern scsi_lun_t scsi_lun64_to_lun(scsi_lun64_t lun64);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    31
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    32
static int pmcs_scsa_tran_tgt_init(dev_info_t *, dev_info_t *,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    33
    scsi_hba_tran_t *, struct scsi_device *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    34
static void pmcs_scsa_tran_tgt_free(dev_info_t *, dev_info_t *,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    35
    scsi_hba_tran_t *, struct scsi_device *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    36
static int pmcs_scsa_start(struct scsi_address *, struct scsi_pkt *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    37
static int pmcs_scsa_abort(struct scsi_address *, struct scsi_pkt *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    38
static int pmcs_scsa_reset(struct scsi_address *, int);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    39
static int pmcs_scsi_reset_notify(struct scsi_address *, int,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    40
    void (*)(caddr_t), caddr_t);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    41
static int pmcs_scsa_getcap(struct scsi_address *, char *, int);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    42
static int pmcs_scsa_setcap(struct scsi_address *, char *, int, int);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    43
static int pmcs_scsa_setup_pkt(struct scsi_pkt *, int (*)(caddr_t), caddr_t);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    44
static void pmcs_scsa_teardown_pkt(struct scsi_pkt *);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
    45
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
    46
static int pmcs_smp_init(dev_info_t *, dev_info_t *, smp_hba_tran_t *,
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
    47
    smp_device_t *);
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
    48
static void pmcs_smp_free(dev_info_t *, dev_info_t *, smp_hba_tran_t *,
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
    49
    smp_device_t *);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    50
static int pmcs_smp_start(struct smp_pkt *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    51
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    52
static int pmcs_scsi_quiesce(dev_info_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    53
static int pmcs_scsi_unquiesce(dev_info_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    54
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    55
static int pmcs_cap(struct scsi_address *, char *, int, int, int);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    56
static pmcs_xscsi_t *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    57
    pmcs_addr2xp(struct scsi_address *, uint64_t *, pmcs_cmd_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    58
static int pmcs_SAS_run(pmcs_cmd_t *, pmcwork_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    59
static void pmcs_SAS_done(pmcs_hw_t *, pmcwork_t *, uint32_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    60
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    61
static int pmcs_SATA_run(pmcs_cmd_t *, pmcwork_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    62
static void pmcs_SATA_done(pmcs_hw_t *, pmcwork_t *, uint32_t *);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    63
static uint8_t pmcs_SATA_rwparm(uint8_t *, uint32_t *, uint64_t *, uint64_t);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    64
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    65
static void pmcs_ioerror(pmcs_hw_t *, pmcs_dtype_t pmcs_dtype,
12060
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
    66
    pmcwork_t *, uint32_t *, uint32_t);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    67
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    68
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    69
int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    70
pmcs_scsa_init(pmcs_hw_t *pwp, const ddi_dma_attr_t *ap)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    71
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    72
	scsi_hba_tran_t *tran;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    73
	ddi_dma_attr_t pmcs_scsa_dattr;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    74
	int flags;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    75
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    76
	(void) memcpy(&pmcs_scsa_dattr, ap, sizeof (ddi_dma_attr_t));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    77
	pmcs_scsa_dattr.dma_attr_sgllen =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    78
	    ((PMCS_SGL_NCHUNKS - 1) * (PMCS_MAX_CHUNKS - 1)) + PMCS_SGL_NCHUNKS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    79
	pmcs_scsa_dattr.dma_attr_flags = DDI_DMA_RELAXED_ORDERING;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    80
	pmcs_scsa_dattr.dma_attr_flags |= DDI_DMA_FLAGERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    81
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    82
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    83
	 * Allocate a transport structure
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    84
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    85
	tran = scsi_hba_tran_alloc(pwp->dip, SCSI_HBA_CANSLEEP);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    86
	if (tran == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
    87
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
    88
		    "scsi_hba_tran_alloc failed");
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    89
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    90
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    91
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    92
	tran->tran_hba_private		= pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    93
	tran->tran_tgt_init		= pmcs_scsa_tran_tgt_init;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    94
	tran->tran_tgt_free		= pmcs_scsa_tran_tgt_free;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    95
	tran->tran_start		= pmcs_scsa_start;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    96
	tran->tran_abort		= pmcs_scsa_abort;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    97
	tran->tran_reset		= pmcs_scsa_reset;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    98
	tran->tran_reset_notify		= pmcs_scsi_reset_notify;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
    99
	tran->tran_getcap		= pmcs_scsa_getcap;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   100
	tran->tran_setcap		= pmcs_scsa_setcap;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   101
	tran->tran_setup_pkt		= pmcs_scsa_setup_pkt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   102
	tran->tran_teardown_pkt		= pmcs_scsa_teardown_pkt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   103
	tran->tran_quiesce		= pmcs_scsi_quiesce;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   104
	tran->tran_unquiesce		= pmcs_scsi_unquiesce;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   105
	tran->tran_interconnect_type	= INTERCONNECT_SAS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   106
	tran->tran_hba_len		= sizeof (pmcs_cmd_t);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   107
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   108
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   109
	 * Attach this instance of the hba
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   110
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   111
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   112
	flags = SCSI_HBA_TRAN_SCB | SCSI_HBA_TRAN_CDB | SCSI_HBA_ADDR_COMPLEX |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   113
	    SCSI_HBA_TRAN_PHCI | SCSI_HBA_HBA;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   114
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   115
	if (scsi_hba_attach_setup(pwp->dip, &pmcs_scsa_dattr, tran, flags)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   116
		scsi_hba_tran_free(tran);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   117
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   118
		    "scsi_hba_attach failed");
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   119
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   120
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   121
	pwp->tran = tran;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   122
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   123
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   124
	 * Attach the SMP part of this hba
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   125
	 */
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   126
	pwp->smp_tran = smp_hba_tran_alloc(pwp->dip);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   127
	ASSERT(pwp->smp_tran != NULL);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   128
	pwp->smp_tran->smp_tran_hba_private = pwp;
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   129
	pwp->smp_tran->smp_tran_init = pmcs_smp_init;
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   130
	pwp->smp_tran->smp_tran_free = pmcs_smp_free;
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   131
	pwp->smp_tran->smp_tran_start = pmcs_smp_start;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   132
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   133
	if (smp_hba_attach_setup(pwp->dip, pwp->smp_tran) != DDI_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   134
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   135
		    "smp_hba_attach failed");
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
   136
		smp_hba_tran_free(pwp->smp_tran);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   137
		pwp->smp_tran = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   138
		scsi_hba_tran_free(tran);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   139
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   140
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   141
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   142
	return (DDI_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   143
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   144
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   145
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   146
 * SCSA entry points
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   147
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   148
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   149
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   150
pmcs_scsa_tran_tgt_init(dev_info_t *hba_dip, dev_info_t *tgt_dip,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   151
    scsi_hba_tran_t *tran, struct scsi_device *sd)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   152
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   153
	pmcs_hw_t	*pwp = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   154
	int		rval;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   155
	char		*variant_prop = "sata";
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   156
	char		*tgt_port = NULL, *ua = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   157
	pmcs_xscsi_t	*tgt = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   158
	pmcs_iport_t	*iport;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   159
	pmcs_lun_t	*lun = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   160
	pmcs_phy_t	*phyp = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   161
	uint64_t	lun_num;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   162
	boolean_t	got_scratch = B_FALSE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   163
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   164
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   165
	 * First, make sure we're an iport and get the pointer to the HBA
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   166
	 * node's softstate
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   167
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   168
	if (scsi_hba_iport_unit_address(hba_dip) == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   169
		pmcs_prt(TRAN2PMC(tran), PMCS_PRT_DEBUG_CONFIG, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   170
		    "%s: We don't enumerate devices on the HBA node", __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   171
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   172
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   173
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   174
	pwp = ITRAN2PMC(tran);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   175
	iport = ITRAN2IPORT(tran);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   176
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   177
	/*
11556
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   178
	 * Get the unit-address
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   179
	 */
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   180
	ua = scsi_device_unit_address(sd);
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   181
	if (ua == NULL) {
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   182
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, NULL,
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   183
		    "%s: Couldn't get UA", __func__);
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   184
		pwp = NULL;
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   185
		goto tgt_init_fail;
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   186
	}
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   187
	pmcs_prt(pwp, PMCS_PRT_DEBUG3, NULL, NULL,
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   188
	    "got ua '%s'", ua);
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   189
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   190
	/*
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   191
	 * Get the target address
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   192
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   193
	rval = scsi_device_prop_lookup_string(sd, SCSI_DEVICE_PROP_PATH,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   194
	    SCSI_ADDR_PROP_TARGET_PORT, &tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   195
	if (rval != DDI_PROP_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   196
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   197
		    "Couldn't get target UA");
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   198
		pwp = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   199
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   200
	}
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   201
	pmcs_prt(pwp, PMCS_PRT_DEBUG3, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   202
	    "got tgt_port '%s'", tgt_port);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   203
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   204
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   205
	 * Validate that this tran_tgt_init is for an active iport.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   206
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   207
	if (iport->ua_state == UA_INACTIVE) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   208
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   209
		    "%s: Got tran_tgt_init on inactive iport for '%s'",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   210
		    __func__, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   211
		pwp = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   212
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   213
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   214
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   215
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   216
	 * Since we're going to wait for scratch, be sure to acquire it while
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   217
	 * we're not holding any other locks
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   218
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   219
	(void) pmcs_acquire_scratch(pwp, B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   220
	got_scratch = B_TRUE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   221
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   222
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   223
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   224
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   225
	 * See if there's already a target softstate.  If not, allocate one.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   226
	 */
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
   227
	tgt = pmcs_get_target(iport, tgt_port, B_TRUE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   228
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   229
	if (tgt == NULL) {
12668
12abda5fe158 6957990 RCC hotplug causes panic - Deadlock: cycle in blocking chain
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12539
diff changeset
   230
		pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL, "%s: "
12abda5fe158 6957990 RCC hotplug causes panic - Deadlock: cycle in blocking chain
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12539
diff changeset
   231
		    "No tgt for tgt_port (%s)", __func__, tgt_port);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   232
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   233
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   234
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   235
	phyp = tgt->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   236
	if (!IS_ROOT_PHY(phyp)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   237
		pmcs_inc_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   238
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   239
	ASSERT(mutex_owned(&phyp->phy_lock));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   240
11556
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   241
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, phyp, tgt, "@%s tgt = 0x%p, dip = 0x%p",
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   242
	    ua, (void *)tgt, (void *)tgt_dip);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   243
11556
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   244
	/* Now get the lun */
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   245
	lun_num = scsi_device_prop_get_int64(sd, SCSI_DEVICE_PROP_PATH,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   246
	    SCSI_ADDR_PROP_LUN64, SCSI_LUN64_ILLEGAL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   247
	if (lun_num == SCSI_LUN64_ILLEGAL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   248
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   249
		    "No LUN for tgt %p", (void *)tgt);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   250
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   251
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   252
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   253
	pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt, "%s: @%s tgt 0x%p phy "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   254
	    "0x%p (%s)", __func__, ua, (void *)tgt, (void *)phyp, phyp->path);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   255
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   256
	mutex_enter(&tgt->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   257
	tgt->dtype = phyp->dtype;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   258
	if (tgt->dtype != SAS && tgt->dtype != SATA) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   259
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   260
		    "PHY 0x%p went away?", (void *)phyp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   261
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   262
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   263
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   264
	/* We don't support SATA devices at LUN > 0. */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   265
	if ((tgt->dtype == SATA) && (lun_num > 0)) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   266
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   267
		    "%s: No support for SATA devices at LUN > 0 "
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   268
		    "(target = 0x%p)", __func__, (void *)tgt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   269
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   270
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   271
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   272
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   273
	 * Allocate LU soft state. We use ddi_soft_state_bystr_zalloc instead
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   274
	 * of kmem_alloc because ddi_soft_state_bystr_zalloc allows us to
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   275
	 * verify that the framework never tries to initialize two scsi_device
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   276
	 * structures with the same unit-address at the same time.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   277
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   278
	if (ddi_soft_state_bystr_zalloc(tgt->lun_sstate, ua) != DDI_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   279
		pmcs_prt(pwp, PMCS_PRT_DEBUG2, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   280
		    "Couldn't allocate LU soft state");
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   281
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   282
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   283
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   284
	lun = ddi_soft_state_bystr_get(tgt->lun_sstate, ua);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   285
	if (lun == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   286
		pmcs_prt(pwp, PMCS_PRT_DEBUG2, phyp, tgt,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   287
		    "Couldn't get LU soft state");
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   288
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   289
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   290
	scsi_device_hba_private_set(sd, lun);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   291
	lun->lun_num = lun_num;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   292
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   293
	/* convert the scsi_lun64_t value to SCSI standard form */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   294
	lun->scsi_lun = scsi_lun64_to_lun(lun_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   295
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   296
	ASSERT(strlen(ua) < (PMCS_MAX_UA_SIZE - 1));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   297
	bcopy(ua, lun->unit_address, strnlen(ua, PMCS_MAX_UA_SIZE - 1));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   298
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   299
	lun->target = tgt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   300
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   301
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   302
	 * If this is the first tran_tgt_init, add this target to our list
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   303
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   304
	if (tgt->target_num == PMCS_INVALID_TARGET_NUM) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   305
		int target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   306
		for (target = 0; target < pwp->max_dev; target++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   307
			if (pwp->targets[target] != NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   308
				continue;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   309
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   310
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   311
			pwp->targets[target] = tgt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   312
			tgt->target_num = (uint16_t)target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   313
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   314
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   315
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   316
		if (target == pwp->max_dev) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   317
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   318
			    "Target list full.");
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   319
			goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   320
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   321
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   322
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   323
	tgt->dip = sd->sd_dev;
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   324
	lun->sd = sd;
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   325
	list_insert_tail(&tgt->lun_list, lun);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   326
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   327
	if (!pmcs_assign_device(pwp, tgt)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   328
		pmcs_release_scratch(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   329
		pwp->targets[tgt->target_num] = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   330
		tgt->target_num = PMCS_INVALID_TARGET_NUM;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   331
		tgt->phy = NULL;
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   332
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   333
		    "%s: pmcs_assign_device failed for target 0x%p",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   334
		    __func__, (void *)tgt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   335
		goto tgt_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   336
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   337
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   338
	pmcs_release_scratch(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   339
	tgt->ref_count++;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   340
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   341
	(void) scsi_device_prop_update_int(sd, SCSI_DEVICE_PROP_PATH,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   342
	    SCSI_ADDR_PROP_TARGET, (uint32_t)(tgt->target_num));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   343
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   344
	/* SM-HBA */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   345
	if (tgt->dtype == SATA) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   346
		/* TCR in PSARC/1997/281 opinion */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   347
		(void) scsi_device_prop_update_string(sd,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   348
		    SCSI_DEVICE_PROP_PATH, "variant", variant_prop);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   349
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   350
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   351
	tgt->phy_addressable = PMCS_PHY_ADDRESSABLE(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   352
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   353
	if (tgt->phy_addressable) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   354
		(void) scsi_device_prop_update_int(sd, SCSI_DEVICE_PROP_PATH,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   355
		    SCSI_ADDR_PROP_SATA_PHY, phyp->phynum);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   356
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   357
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   358
	/* SM-HBA */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   359
	(void) pmcs_smhba_set_scsi_device_props(pwp, phyp, sd);
11307
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
   360
	/*
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
   361
	 * Make sure attached port and target port pm props are updated
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
   362
	 * By passing in 0s, we're not actually updating any values, but
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
   363
	 * the properties should now get updated on the node.
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
   364
	 */
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   365
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   366
	mutex_exit(&tgt->statlock);
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   367
	pmcs_update_phy_pm_props(phyp, 0, 0, B_TRUE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   368
	pmcs_unlock_phy(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   369
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   370
	scsi_device_prop_free(sd, SCSI_DEVICE_PROP_PATH, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   371
	return (DDI_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   372
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   373
tgt_init_fail:
11442
4bcc8ace2511 6913807 target-port-pm/attached-port-pm values incorrect
David Hollister <David.Hollister@Sun.COM>
parents: 11347
diff changeset
   374
	scsi_device_hba_private_set(sd, NULL);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   375
	if (got_scratch) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   376
		pmcs_release_scratch(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   377
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   378
	if (lun) {
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   379
		list_remove(&tgt->lun_list, lun);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   380
		ddi_soft_state_bystr_free(tgt->lun_sstate, ua);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   381
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   382
	if (phyp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   383
		mutex_exit(&tgt->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   384
		pmcs_unlock_phy(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   385
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   386
		 * phyp's ref count was incremented in pmcs_new_tport.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   387
		 * We're failing configuration, we now need to decrement it.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   388
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   389
		if (!IS_ROOT_PHY(phyp)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   390
			pmcs_dec_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   391
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   392
		phyp->target = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   393
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   394
	if (tgt && tgt->ref_count == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   395
		ddi_soft_state_bystr_free(iport->tgt_sstate, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   396
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   397
	if (pwp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   398
		mutex_exit(&pwp->lock);
11556
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   399
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   400
		    "%s: failed for @%s tgt 0x%p phy 0x%p", __func__, ua,
99144956c627 6913819 SCSAv3: pmcs_scsa_tran_tgt_free: alignment error panic
Reed <Reed.Liu@Sun.COM>
parents: 11554
diff changeset
   401
		    (void *)tgt, (void *)phyp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   402
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   403
	if (tgt_port) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   404
		scsi_device_prop_free(sd, SCSI_DEVICE_PROP_PATH, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   405
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   406
	return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   407
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   408
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   409
static void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   410
pmcs_scsa_tran_tgt_free(dev_info_t *hba_dip, dev_info_t *tgt_dip,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   411
    scsi_hba_tran_t *tran, struct scsi_device *sd)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   412
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   413
	_NOTE(ARGUNUSED(hba_dip, tgt_dip));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   414
	pmcs_hw_t	*pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   415
	pmcs_lun_t	*lun;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   416
	pmcs_xscsi_t	*target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   417
	char		*unit_address;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   418
	pmcs_phy_t	*phyp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   419
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   420
	if (scsi_hba_iport_unit_address(hba_dip) == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   421
		pwp = TRAN2PMC(tran);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   422
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   423
		    "%s: We don't enumerate devices on the HBA node", __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   424
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   425
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   426
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   427
	lun = (pmcs_lun_t *)scsi_device_hba_private_get(sd);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   428
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   429
	ASSERT((lun != NULL) && (lun->target != NULL));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   430
	ASSERT(lun->target->ref_count > 0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   431
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   432
	target = lun->target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   433
	unit_address = lun->unit_address;
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   434
	list_remove(&target->lun_list, lun);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   435
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   436
	pwp = ITRAN2PMC(tran);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   437
	mutex_enter(&pwp->lock);
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   438
	phyp = target->phy;
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   439
	if (phyp) {
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   440
		mutex_enter(&phyp->phy_lock);
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   441
	}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   442
	mutex_enter(&target->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   443
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   444
	pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, target,
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   445
	    "%s: for @%s tgt 0x%p phy 0x%p", __func__, unit_address,
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   446
	    (void *)target, (void *)phyp);
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   447
	ddi_soft_state_bystr_free(lun->target->lun_sstate, unit_address);
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
   448
11087
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   449
	if (target->recover_wait) {
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   450
		mutex_exit(&target->statlock);
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   451
		if (phyp) {
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   452
			mutex_exit(&phyp->phy_lock);
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
   453
		}
11087
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   454
		mutex_exit(&pwp->lock);
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   455
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, target, "%s: "
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   456
		    "Target 0x%p in device state recovery, fail tran_tgt_free",
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   457
		    __func__, (void *)target);
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   458
		return;
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   459
	}
af762f250609 6887350 device configuration creeps to halt when faulty devices are involved
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11052
diff changeset
   460
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   461
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   462
	 * If this target still has a PHY pointer and that PHY's target pointer
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   463
	 * has been cleared, then that PHY has been reaped. In that case, there
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   464
	 * would be no need to decrement the reference count
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   465
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   466
	if (phyp && !IS_ROOT_PHY(phyp) && phyp->target) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   467
		pmcs_dec_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   468
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   469
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   470
	if (--target->ref_count == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   471
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   472
		 * Remove this target from our list.  The target soft
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   473
		 * state will remain, and the device will remain registered
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   474
		 * with the hardware unless/until we're told the device
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   475
		 * physically went away.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   476
		 */
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   477
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, target,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   478
		    "%s: Free target 0x%p (vtgt %d)", __func__, (void *)target,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   479
		    target->target_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   480
		pwp->targets[target->target_num] = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   481
		target->target_num = PMCS_INVALID_TARGET_NUM;
12949
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
   482
		/* If the PHY has a pointer to this target, clear it */
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
   483
		if (phyp && (phyp->target == target)) {
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   484
			phyp->target = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   485
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   486
		target->phy = NULL;
12861
c711078fce8e 6968764 panic : pmcs:pmcs_lock_phy_impl
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12668
diff changeset
   487
		if (phyp) {
c711078fce8e 6968764 panic : pmcs:pmcs_lock_phy_impl
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12668
diff changeset
   488
			mutex_exit(&phyp->phy_lock);
c711078fce8e 6968764 panic : pmcs:pmcs_lock_phy_impl
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12668
diff changeset
   489
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   490
		pmcs_destroy_target(target);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   491
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   492
		mutex_exit(&target->statlock);
12861
c711078fce8e 6968764 panic : pmcs:pmcs_lock_phy_impl
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12668
diff changeset
   493
		if (phyp) {
c711078fce8e 6968764 panic : pmcs:pmcs_lock_phy_impl
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12668
diff changeset
   494
			mutex_exit(&phyp->phy_lock);
c711078fce8e 6968764 panic : pmcs:pmcs_lock_phy_impl
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12668
diff changeset
   495
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   496
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   497
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   498
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   499
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   500
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   501
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   502
pmcs_scsa_start(struct scsi_address *ap, struct scsi_pkt *pkt)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   503
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   504
	pmcs_cmd_t *sp = PKT2CMD(pkt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   505
	pmcs_hw_t *pwp = ADDR2PMC(ap);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   506
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   507
	boolean_t blocked;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   508
	uint32_t hba_state;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   509
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   510
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   511
	    "%s: pkt %p sd %p cdb0=0x%02x dl=%lu", __func__, (void *)pkt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   512
	    (void *)scsi_address_device(&pkt->pkt_address),
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   513
	    pkt->pkt_cdbp[0] & 0xff, pkt->pkt_dma_len);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   514
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   515
	if (pkt->pkt_flags & FLAG_NOINTR) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   516
		pmcs_prt(pwp, PMCS_PRT_DEBUG3, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   517
		    "%s: nointr pkt", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   518
		return (TRAN_BADPKT);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   519
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   520
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   521
	sp->cmd_tag = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   522
	pkt->pkt_state = pkt->pkt_statistics = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   523
	pkt->pkt_reason = CMD_INCOMPLETE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   524
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   525
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   526
	hba_state = pwp->state;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   527
	blocked = pwp->blocked;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   528
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   529
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   530
	if (hba_state != STATE_RUNNING) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   531
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   532
		    "%s: hba dead", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   533
		return (TRAN_FATAL_ERROR);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   534
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   535
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   536
	xp = pmcs_addr2xp(ap, NULL, sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   537
	if (xp == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   538
		pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   539
		    "%s: dropping due to null target", __func__);
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   540
		goto dead_target;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   541
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   542
	ASSERT(mutex_owned(&xp->statlock));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   543
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   544
	/*
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   545
	 * First, check to see if the device is gone.
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   546
	 */
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   547
	if (xp->dev_gone) {
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   548
		xp->actv_pkts++;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   549
		mutex_exit(&xp->statlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   550
		pmcs_prt(pwp, PMCS_PRT_DEBUG3, NULL, xp,
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   551
		    "%s: dropping due to dead target 0x%p",
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   552
		    __func__, (void *)xp);
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   553
		goto dead_target;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   554
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   555
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   556
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   557
	 * If we're blocked (quiesced) just return.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   558
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   559
	if (blocked) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   560
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   561
		    "%s: hba blocked", __func__);
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   562
		xp->actv_pkts++;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   563
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   564
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   565
		STAILQ_INSERT_TAIL(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   566
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   567
		return (TRAN_ACCEPT);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   568
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   569
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   570
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   571
	 * If we're draining or resetting, queue and return.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   572
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   573
	if (xp->draining || xp->resetting || xp->recover_wait) {
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   574
		xp->actv_pkts++;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   575
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   576
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   577
		STAILQ_INSERT_TAIL(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   578
		mutex_exit(&xp->wqlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   579
		pmcs_prt(pwp, PMCS_PRT_DEBUG1, NULL, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   580
		    "%s: draining/resetting/recovering (cnt %u)",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   581
		    __func__, xp->actv_cnt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   582
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   583
		 * By the time we get here, draining or
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   584
		 * resetting may have come and gone, not
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   585
		 * yet noticing that we had put something
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   586
		 * on the wait queue, so schedule a worker
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   587
		 * to look at this later.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   588
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   589
		SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   590
		return (TRAN_ACCEPT);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   591
	}
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   592
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   593
	xp->actv_pkts++;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   594
	mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   595
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   596
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   597
	 * Queue this command to the tail of the wait queue.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   598
	 * This keeps us getting commands out of order.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   599
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   600
	mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   601
	STAILQ_INSERT_TAIL(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   602
	mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   603
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   604
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   605
	 * Now run the queue for this device.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   606
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   607
	(void) pmcs_scsa_wq_run_one(pwp, xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   608
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   609
	return (TRAN_ACCEPT);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   610
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   611
dead_target:
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   612
	pkt->pkt_state = STATE_GOT_BUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   613
	pkt->pkt_reason = CMD_DEV_GONE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   614
	mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   615
	STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   616
	PMCS_CQ_RUN_LOCKED(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   617
	mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   618
	return (TRAN_ACCEPT);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   619
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   620
11545
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   621
/* Return code 1 = Success */
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   622
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   623
pmcs_scsa_abort(struct scsi_address *ap, struct scsi_pkt *pkt)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   624
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   625
	pmcs_hw_t *pwp = ADDR2PMC(ap);
11545
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   626
	pmcs_cmd_t *sp = NULL;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   627
	pmcs_xscsi_t *xp = NULL;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   628
	pmcs_phy_t *pptr = NULL;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   629
	pmcs_lun_t *pmcs_lun = (pmcs_lun_t *)
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   630
	    scsi_device_hba_private_get(scsi_address_device(ap));
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   631
	uint32_t tag;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   632
	uint64_t lun;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   633
	pmcwork_t *pwrk;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   634
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   635
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   636
	if (pwp->state != STATE_RUNNING) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   637
		mutex_exit(&pwp->lock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   638
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   639
		    "%s: hba dead", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   640
		return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   641
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   642
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   643
11545
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   644
	if (pkt == NULL) {
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   645
		if (pmcs_lun == NULL) {
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   646
			pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: "
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   647
			    "No pmcs_lun_t struct to do ABORT_ALL", __func__);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   648
			return (0);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   649
		}
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   650
		xp = pmcs_lun->target;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   651
		if (xp != NULL) {
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   652
			pptr = xp->phy;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   653
		}
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   654
		if (pptr == NULL) {
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   655
			pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp, "%s: pkt is "
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   656
			    "NULL. No tgt/phy to do ABORT_ALL", __func__);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   657
			return (0);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   658
		}
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   659
		pmcs_lock_phy(pptr);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   660
		if (pmcs_abort(pwp, pptr, 0, 1, 0)) {
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   661
			pptr->abort_pending = 1;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   662
			SCHEDULE_WORK(pwp, PMCS_WORK_ABORT_HANDLE);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   663
		}
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   664
		pmcs_unlock_phy(pptr);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   665
		return (1);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   666
	}
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   667
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   668
	sp = PKT2CMD(pkt);
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   669
	xp = sp->cmd_target;
d1e2b4c62a9c 6916340 panic in pmcs_scsa_abort() when scsi_vhci calls scsi_reset()
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11501
diff changeset
   670
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   671
	if (sp->cmd_lun) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   672
		lun = sp->cmd_lun->lun_num;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   673
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   674
		lun = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   675
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   676
	if (xp == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   677
		return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   678
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   679
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   680
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   681
	 * See if we have a real work structure associated with this cmd.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   682
	 */
12258
186d3102b90d 6940745 work structures without a pmcs_cmd_t need to be cleaned up after hot reset
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12060
diff changeset
   683
	pwrk = pmcs_tag2wp(pwp, sp->cmd_tag, B_FALSE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   684
	if (pwrk && pwrk->arg == sp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   685
		tag = pwrk->htag;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   686
		pptr = pwrk->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   687
		pwrk->timer = 0;	/* we don't time this here */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   688
		ASSERT(pwrk->state == PMCS_WORK_STATE_ONCHIP);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   689
		mutex_exit(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   690
		pmcs_lock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   691
		if (pptr->dtype == SAS) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   692
			if (pmcs_ssp_tmf(pwp, pptr, SAS_ABORT_TASK, tag, lun,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   693
			    NULL)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   694
				pptr->abort_pending = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   695
				pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   696
				SCHEDULE_WORK(pwp, PMCS_WORK_ABORT_HANDLE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   697
				return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   698
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   699
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   700
			/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   701
			 * XXX: Was the command that was active an
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   702
			 * NCQ I/O command?
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   703
			 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   704
			pptr->need_rl_ext = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   705
			if (pmcs_sata_abort_ncq(pwp, pptr)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   706
				pptr->abort_pending = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   707
				pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   708
				SCHEDULE_WORK(pwp, PMCS_WORK_ABORT_HANDLE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   709
				return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   710
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   711
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   712
		pptr->abort_pending = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   713
		pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   714
		SCHEDULE_WORK(pwp, PMCS_WORK_ABORT_HANDLE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   715
		return (1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   716
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   717
	if (pwrk) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   718
		mutex_exit(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   719
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   720
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   721
	 * Okay, those weren't the droids we were looking for.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   722
	 * See if the command is on any of the wait queues.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   723
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   724
	mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   725
	sp = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   726
	STAILQ_FOREACH(sp, &xp->wq, cmd_next) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   727
		if (sp == PKT2CMD(pkt)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   728
			STAILQ_REMOVE(&xp->wq, sp, pmcs_cmd, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   729
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   730
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   731
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   732
	mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   733
	if (sp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   734
		pkt->pkt_reason = CMD_ABORTED;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   735
		pkt->pkt_statistics |= STAT_ABORTED;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   736
		mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   737
		STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   738
		PMCS_CQ_RUN_LOCKED(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   739
		mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   740
		return (1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   741
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   742
	return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   743
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   744
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   745
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   746
 * SCSA reset functions
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   747
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   748
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   749
pmcs_scsa_reset(struct scsi_address *ap, int level)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   750
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   751
	pmcs_hw_t *pwp = ADDR2PMC(ap);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   752
	pmcs_phy_t *pptr;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   753
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   754
	uint64_t lun = (uint64_t)-1, *lp = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   755
	int rval;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   756
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   757
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   758
	if (pwp->state != STATE_RUNNING) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   759
		mutex_exit(&pwp->lock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   760
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   761
		    "%s: hba dead", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   762
		return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   763
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   764
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   765
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   766
	switch (level)  {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   767
	case RESET_ALL:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   768
		rval = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   769
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   770
	case RESET_LUN:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   771
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   772
		 * Point lp at lun so that pmcs_addr2xp
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   773
		 * will fill out the 64 bit lun number.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   774
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   775
		lp = &lun;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   776
		/* FALLTHROUGH */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   777
	case RESET_TARGET:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   778
		xp = pmcs_addr2xp(ap, lp, NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   779
		if (xp == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   780
			pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   781
			    "%s: no xp found for this scsi address", __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   782
			return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   783
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   784
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   785
		if (xp->dev_gone) {
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   786
			mutex_exit(&xp->statlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   787
			pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   788
			    "%s: Target 0x%p has gone away", __func__,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   789
			    (void *)xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   790
			return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   791
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   792
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   793
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   794
		 * If we're already performing this action, or if device
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   795
		 * state recovery is already running, just return failure.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   796
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   797
		if (xp->resetting || xp->recover_wait) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   798
			mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   799
			return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   800
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   801
		xp->reset_wait = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   802
		xp->reset_success = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   803
		xp->resetting = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   804
		pptr = xp->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   805
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   806
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   807
		if (pmcs_reset_dev(pwp, pptr, lun)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   808
			rval = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   809
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   810
			rval = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   811
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   812
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   813
		mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   814
		if (rval == 1) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   815
			xp->reset_success = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   816
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   817
		if (xp->reset_wait) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   818
			xp->reset_wait = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   819
			cv_signal(&xp->reset_cv);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   820
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   821
		xp->resetting = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   822
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   823
		SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   824
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   825
	default:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   826
		rval = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   827
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   828
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   829
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   830
	return (rval);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   831
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   832
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   833
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   834
pmcs_scsi_reset_notify(struct scsi_address *ap, int flag,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   835
    void (*callback)(caddr_t), caddr_t arg)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   836
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   837
	pmcs_hw_t *pwp = ADDR2PMC(ap);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   838
	return (scsi_hba_reset_notify_setup(ap, flag, callback, arg,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   839
	    &pwp->lock, &pwp->reset_notify_listf));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   840
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   841
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   842
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   843
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   844
pmcs_cap(struct scsi_address *ap, char *cap, int val, int tonly, int set)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   845
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   846
	_NOTE(ARGUNUSED(val, tonly));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   847
	int cidx, rval = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   848
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   849
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   850
	cidx = scsi_hba_lookup_capstr(cap);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   851
	if (cidx == -1) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   852
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   853
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   854
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   855
	xp = pmcs_addr2xp(ap, NULL, NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   856
	if (xp == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   857
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   858
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   859
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   860
	switch (cidx) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   861
	case SCSI_CAP_DMA_MAX:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   862
	case SCSI_CAP_INITIATOR_ID:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   863
		if (set == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   864
			rval = INT_MAX;	/* argh */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   865
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   866
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   867
	case SCSI_CAP_DISCONNECT:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   868
	case SCSI_CAP_SYNCHRONOUS:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   869
	case SCSI_CAP_WIDE_XFER:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   870
	case SCSI_CAP_PARITY:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   871
	case SCSI_CAP_ARQ:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   872
	case SCSI_CAP_UNTAGGED_QING:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   873
		if (set == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   874
			rval = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   875
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   876
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   877
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   878
	case SCSI_CAP_TAGGED_QING:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   879
		rval = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   880
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   881
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   882
	case SCSI_CAP_MSG_OUT:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   883
	case SCSI_CAP_RESET_NOTIFICATION:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   884
	case SCSI_CAP_QFULL_RETRIES:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   885
	case SCSI_CAP_QFULL_RETRY_INTERVAL:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   886
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   887
	case SCSI_CAP_SCSI_VERSION:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   888
		if (set == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   889
			rval = SCSI_VERSION_3;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   890
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   891
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   892
	case SCSI_CAP_INTERCONNECT_TYPE:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   893
		if (set) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   894
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   895
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   896
		if (xp->phy_addressable) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   897
			rval = INTERCONNECT_SATA;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   898
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   899
			rval = INTERCONNECT_SAS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   900
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   901
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   902
	case SCSI_CAP_CDB_LEN:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   903
		if (set == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   904
			rval = 16;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   905
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   906
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   907
	case SCSI_CAP_LUN_RESET:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   908
		if (set) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   909
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   910
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   911
		if (xp->dtype == SATA) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   912
			rval = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   913
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   914
			rval = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   915
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   916
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   917
	default:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   918
		rval = -1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   919
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   920
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   921
	mutex_exit(&xp->statlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
   922
	pmcs_prt(ADDR2PMC(ap), PMCS_PRT_DEBUG3, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   923
	    "%s: cap %s val %d set %d rval %d",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   924
	    __func__, cap, val, set, rval);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   925
	return (rval);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   926
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   927
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   928
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   929
 * Returns with statlock held if the xp is found.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   930
 * Fills in pmcs_cmd_t with values if pmcs_cmd_t pointer non-NULL.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   931
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   932
static pmcs_xscsi_t *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   933
pmcs_addr2xp(struct scsi_address *ap, uint64_t *lp, pmcs_cmd_t *sp)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   934
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   935
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   936
	pmcs_lun_t *lun = (pmcs_lun_t *)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   937
	    scsi_device_hba_private_get(scsi_address_device(ap));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   938
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   939
	if ((lun == NULL) || (lun->target == NULL)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   940
		return (NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   941
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   942
	xp = lun->target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   943
	mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   944
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
   945
	if (xp->dev_gone || (xp->phy == NULL)) {
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   946
		/*
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   947
		 * This may be a retried packet, so it's possible cmd_target
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   948
		 * and cmd_lun may still be populated.  Clear them.
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   949
		 */
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   950
		if (sp != NULL) {
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   951
			sp->cmd_target = NULL;
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   952
			sp->cmd_lun = NULL;
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
   953
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   954
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   955
		return (NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   956
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   957
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   958
	if (sp != NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   959
		sp->cmd_target = xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   960
		sp->cmd_lun = lun;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   961
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   962
	if (lp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   963
		*lp = lun->lun_num;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   964
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   965
	return (xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   966
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   967
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   968
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   969
pmcs_scsa_getcap(struct scsi_address *ap, char *cap, int whom)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   970
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   971
	int r;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   972
	if (cap == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   973
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   974
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   975
	r = pmcs_cap(ap, cap, 0, whom, 0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   976
	return (r);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   977
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   978
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   979
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   980
pmcs_scsa_setcap(struct scsi_address *ap, char *cap, int value, int whom)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   981
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   982
	int r;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   983
	if (cap == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   984
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   985
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   986
	r = pmcs_cap(ap, cap, value, whom, 1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   987
	return (r);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   988
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   989
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   990
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   991
pmcs_scsa_setup_pkt(struct scsi_pkt *pkt, int (*callback)(caddr_t),
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   992
    caddr_t cbarg)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   993
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   994
	_NOTE(ARGUNUSED(callback, cbarg));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   995
	pmcs_cmd_t *sp = pkt->pkt_ha_private;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   996
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   997
	bzero(sp, sizeof (pmcs_cmd_t));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   998
	sp->cmd_pkt = pkt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
   999
	return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1000
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1001
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1002
static void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1003
pmcs_scsa_teardown_pkt(struct scsi_pkt *pkt)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1004
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1005
	pmcs_cmd_t *sp = pkt->pkt_ha_private;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1006
	sp->cmd_target = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1007
	sp->cmd_lun = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1008
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1009
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1010
static int
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1011
pmcs_smp_start(struct smp_pkt *smp_pkt)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1012
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1013
	struct pmcwork *pwrk;
12462
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  1014
	pmcs_iport_t *iport;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1015
	const uint_t rdoff = SAS_SMP_MAX_PAYLOAD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1016
	uint32_t msg[PMCS_MSG_SIZE], *ptr, htag, status;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1017
	uint64_t wwn;
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1018
	pmcs_hw_t *pwp;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1019
	pmcs_phy_t *pptr;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1020
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1021
	uint_t reqsz, rspsz, will_retry;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1022
	int result;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1023
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1024
	pwp = smp_pkt->smp_pkt_address->smp_a_hba_tran->smp_tran_hba_private;
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1025
	bcopy(smp_pkt->smp_pkt_address->smp_a_wwn, &wwn, SAS_WWN_BYTE_SIZE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1026
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1027
	pmcs_prt(pwp, PMCS_PRT_DEBUG1, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1028
	    "%s: starting for wwn 0x%" PRIx64, __func__, wwn);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1029
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1030
	will_retry = smp_pkt->smp_pkt_will_retry;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1031
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1032
	(void) pmcs_acquire_scratch(pwp, B_TRUE);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1033
	reqsz = smp_pkt->smp_pkt_reqsize;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1034
	if (reqsz > SAS_SMP_MAX_PAYLOAD) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1035
		reqsz = SAS_SMP_MAX_PAYLOAD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1036
	}
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1037
	(void) memcpy(pwp->scratch, smp_pkt->smp_pkt_req, reqsz);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1038
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1039
	rspsz = smp_pkt->smp_pkt_rspsize;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1040
	if (rspsz > SAS_SMP_MAX_PAYLOAD) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1041
		rspsz = SAS_SMP_MAX_PAYLOAD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1042
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1043
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1044
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1045
	 * The request size from the SMP driver always includes 4 bytes
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1046
	 * for the CRC. The PMCS chip, however, doesn't want to see those
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1047
	 * counts as part of the transfer size.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1048
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1049
	reqsz -= 4;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1050
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1051
	pptr = pmcs_find_phy_by_wwn(pwp, wwn);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1052
	/* PHY is now locked */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1053
	if (pptr == NULL || pptr->dtype != EXPANDER) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1054
		if (pptr) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1055
			pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1056
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1057
		pmcs_release_scratch(pwp);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1058
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL,
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1059
		    "%s: could not find phy", __func__);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1060
		smp_pkt->smp_pkt_reason = ENXIO;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1061
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1062
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1063
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1064
	if ((pptr->iport == NULL) || !pptr->valid_device_id) {
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1065
		pmcs_unlock_phy(pptr);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1066
		pmcs_release_scratch(pwp);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1067
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, pptr->target,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1068
		    "%s: Can't reach PHY %s", __func__, pptr->path);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1069
		smp_pkt->smp_pkt_reason = ENXIO;
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1070
		return (DDI_FAILURE);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1071
	}
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1072
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1073
	pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_WAIT, pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1074
	if (pwrk == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1075
		pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1076
		pmcs_release_scratch(pwp);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1077
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1078
		    "%s: could not get work structure", __func__);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1079
		smp_pkt->smp_pkt_reason = will_retry ? EAGAIN : EBUSY;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1080
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1081
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1082
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1083
	pwrk->arg = msg;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1084
	pwrk->dtype = EXPANDER;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1085
	mutex_enter(&pwp->iqp_lock[PMCS_IQ_OTHER]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1086
	ptr = GET_IQ_ENTRY(pwp, PMCS_IQ_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1087
	if (ptr == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1088
		pmcs_pwork(pwp, pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1089
		mutex_exit(&pwp->iqp_lock[PMCS_IQ_OTHER]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1090
		pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1091
		pmcs_release_scratch(pwp);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1092
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1093
		    "%s: could not get IQ entry", __func__);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1094
		smp_pkt->smp_pkt_reason = will_retry ? EAGAIN :EBUSY;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1095
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1096
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1097
	msg[0] = LE_32(PMCS_HIPRI(pwp, PMCS_OQ_GENERAL, PMCIN_SMP_REQUEST));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1098
	msg[1] = LE_32(pwrk->htag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1099
	msg[2] = LE_32(pptr->device_id);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1100
	msg[3] = LE_32(SMP_INDIRECT_RESPONSE | SMP_INDIRECT_REQUEST);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1101
	msg[8] = LE_32(DWORD0(pwp->scratch_dma));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1102
	msg[9] = LE_32(DWORD1(pwp->scratch_dma));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1103
	msg[10] = LE_32(reqsz);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1104
	msg[11] = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1105
	msg[12] = LE_32(DWORD0(pwp->scratch_dma+rdoff));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1106
	msg[13] = LE_32(DWORD1(pwp->scratch_dma+rdoff));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1107
	msg[14] = LE_32(rspsz);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1108
	msg[15] = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1109
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1110
	COPY_MESSAGE(ptr, msg, PMCS_MSG_SIZE);
12462
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  1111
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  1112
	pmcs_hold_iport(pptr->iport);
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  1113
	iport = pptr->iport;
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  1114
	pmcs_smp_acquire(iport);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1115
	pwrk->state = PMCS_WORK_STATE_ONCHIP;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1116
	htag = pwrk->htag;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1117
	INC_IQ_ENTRY(pwp, PMCS_IQ_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1118
	pmcs_unlock_phy(pptr);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1119
	WAIT_FOR(pwrk, smp_pkt->smp_pkt_timeout * 1000, result);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1120
	pmcs_pwork(pwp, pwrk);
13102
579992f451e3 6973916 pmcs smp synchronization change causing livelocks
Jesse Butler <jesse.butler@oracle.com>
parents: 13017
diff changeset
  1121
	pmcs_smp_release(iport);
579992f451e3 6973916 pmcs smp synchronization change causing livelocks
Jesse Butler <jesse.butler@oracle.com>
parents: 13017
diff changeset
  1122
	pmcs_rele_iport(iport);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1123
	pmcs_lock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1124
	if (result) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1125
		pmcs_timed_out(pwp, htag, __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1126
		if (pmcs_abort(pwp, pptr, htag, 0, 0)) {
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1127
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, pptr->target,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1128
			    "%s: Unable to issue SMP ABORT for htag 0x%08x",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1129
			    __func__, htag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1130
		} else {
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1131
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, pptr->target,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1132
			    "%s: Issuing SMP ABORT for htag 0x%08x",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1133
			    __func__, htag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1134
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1135
		pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1136
		pmcs_release_scratch(pwp);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1137
		smp_pkt->smp_pkt_reason = ETIMEDOUT;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1138
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1139
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1140
	status = LE_32(msg[2]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1141
	if (status == PMCOUT_STATUS_OVERFLOW) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1142
		status = PMCOUT_STATUS_OK;
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1143
		smp_pkt->smp_pkt_reason = EOVERFLOW;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1144
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1145
	if (status != PMCOUT_STATUS_OK) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1146
		const char *emsg = pmcs_status_str(status);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1147
		if (emsg == NULL) {
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1148
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, pptr->target,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1149
			    "SMP operation failed (0x%x)", status);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1150
		} else {
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1151
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, pptr, pptr->target,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1152
			    "SMP operation failed (%s)", emsg);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1153
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1154
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1155
		if ((status == PMCOUT_STATUS_ERROR_HW_TIMEOUT) ||
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1156
		    (status == PMCOUT_STATUS_IO_XFER_OPEN_RETRY_TIMEOUT)) {
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1157
			smp_pkt->smp_pkt_reason =
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1158
			    will_retry ? EAGAIN : ETIMEDOUT;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1159
			result = DDI_FAILURE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1160
		} else if (status ==
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1161
		    PMCOUT_STATUS_OPEN_CNX_ERROR_IT_NEXUS_LOSS) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1162
			xp = pptr->target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1163
			if (xp == NULL) {
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1164
				smp_pkt->smp_pkt_reason = EIO;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1165
				result = DDI_FAILURE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1166
				goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1167
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1168
			if (xp->dev_state !=
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1169
			    PMCS_DEVICE_STATE_NON_OPERATIONAL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1170
				xp->dev_state =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1171
				    PMCS_DEVICE_STATE_NON_OPERATIONAL;
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1172
				pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, xp->phy,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1173
				    xp, "%s: Got _IT_NEXUS_LOSS SMP status. "
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1174
				    "Tgt(0x%p) dev_state set to "
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1175
				    "_NON_OPERATIONAL", __func__,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1176
				    (void *)xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1177
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1178
			/* ABORT any pending commands related to this device */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1179
			if (pmcs_abort(pwp, pptr, pptr->device_id, 1, 1) != 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1180
				pptr->abort_pending = 1;
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1181
				smp_pkt->smp_pkt_reason = EIO;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1182
				result = DDI_FAILURE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1183
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1184
		} else {
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1185
			smp_pkt->smp_pkt_reason = will_retry ? EAGAIN : EIO;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1186
			result = DDI_FAILURE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1187
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1188
	} else {
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1189
		(void) memcpy(smp_pkt->smp_pkt_rsp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1190
		    &((uint8_t *)pwp->scratch)[rdoff], rspsz);
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1191
		if (smp_pkt->smp_pkt_reason == EOVERFLOW) {
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1192
			result = DDI_FAILURE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1193
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1194
			result = DDI_SUCCESS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1195
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1196
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1197
out:
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1198
	pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, pptr->target,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1199
	    "%s: done for wwn 0x%" PRIx64, __func__, wwn);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1200
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1201
	pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1202
	pmcs_release_scratch(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1203
	return (result);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1204
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1205
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1206
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1207
pmcs_smp_init(dev_info_t *self, dev_info_t *child,
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1208
    smp_hba_tran_t *tran, smp_device_t *smp_sd)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1209
{
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1210
	_NOTE(ARGUNUSED(tran, smp_sd));
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1211
	pmcs_iport_t *iport;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1212
	pmcs_hw_t *pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1213
	pmcs_xscsi_t *tgt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1214
	pmcs_phy_t *phy, *pphy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1215
	uint64_t wwn;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1216
	char *addr, *tgt_port;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1217
	int ua_form = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1218
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1219
	iport = ddi_get_soft_state(pmcs_iport_softstate,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1220
	    ddi_get_instance(self));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1221
	ASSERT(iport);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1222
	if (iport == NULL)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1223
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1224
	pwp = iport->pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1225
	ASSERT(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1226
	if (pwp == NULL)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1227
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1228
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1229
	/* Get "target-port" prop from devinfo node */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1230
	if (ddi_prop_lookup_string(DDI_DEV_T_ANY, child,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1231
	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1232
	    SCSI_ADDR_PROP_TARGET_PORT, &tgt_port) != DDI_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1233
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: Failed to "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1234
		    "lookup prop ("SCSI_ADDR_PROP_TARGET_PORT")", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1235
		/* Dont fail _smp_init() because we couldnt get/set a prop */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1236
		return (DDI_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1237
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1238
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1239
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1240
	 * Validate that this tran_tgt_init is for an active iport.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1241
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1242
	if (iport->ua_state == UA_INACTIVE) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1243
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1244
		    "%s: Init on inactive iport for '%s'", __func__, tgt_port);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1245
		ddi_prop_free(tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1246
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1247
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1248
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1249
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1250
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1251
	/* Retrieve softstate using unit-address */
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  1252
	tgt = pmcs_get_target(iport, tgt_port, B_TRUE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1253
	if (tgt == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1254
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1255
		    "%s: tgt softstate not found", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1256
		ddi_prop_free(tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1257
		mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1258
		return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1259
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1260
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1261
	pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, tgt, "%s: %s (%s)",
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1262
	    __func__, ddi_get_name(child), tgt_port);
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1263
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1264
	mutex_enter(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1265
	phy = tgt->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1266
	ASSERT(mutex_owned(&phy->phy_lock));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1267
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1268
	if (IS_ROOT_PHY(phy)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1269
		/* Expander attached to HBA - don't ref_count it */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1270
		wwn = pwp->sas_wwns[0];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1271
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1272
		pmcs_inc_phy_ref_count(phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1273
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1274
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1275
		 * Parent (in topology) is also an expander
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1276
		 * Now that we've increased the ref count on phy, it's OK
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1277
		 * to drop the lock so we can acquire the parent's lock.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1278
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1279
		pphy = phy->parent;
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1280
		mutex_exit(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1281
		pmcs_unlock_phy(phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1282
		pmcs_lock_phy(pphy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1283
		wwn = pmcs_barray2wwn(pphy->sas_address);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1284
		pmcs_unlock_phy(pphy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1285
		pmcs_lock_phy(phy);
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1286
		mutex_enter(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1287
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1288
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1289
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1290
	 * If this is the 1st smp_init, add this to our list.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1291
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1292
	if (tgt->target_num == PMCS_INVALID_TARGET_NUM) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1293
		int target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1294
		for (target = 0; target < pwp->max_dev; target++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1295
			if (pwp->targets[target] != NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1296
				continue;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1297
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1298
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1299
			pwp->targets[target] = tgt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1300
			tgt->target_num = (uint16_t)target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1301
			tgt->assigned = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1302
			tgt->dev_state = PMCS_DEVICE_STATE_OPERATIONAL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1303
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1304
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1305
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1306
		if (target == pwp->max_dev) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1307
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1308
			    "Target list full.");
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1309
			goto smp_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1310
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1311
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1312
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1313
	if (!pmcs_assign_device(pwp, tgt)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1314
		pwp->targets[tgt->target_num] = NULL;
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1315
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1316
		    "%s: pmcs_assign_device failed for target 0x%p",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1317
		    __func__, (void *)tgt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1318
		goto smp_init_fail;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1319
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1320
11307
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1321
	/*
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1322
	 * Update the attached port and target port pm properties
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1323
	 */
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1324
	tgt->smpd = smp_sd;
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1325
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1326
	pmcs_unlock_phy(phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1327
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1328
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1329
	tgt->ref_count++;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1330
	tgt->dtype = phy->dtype;
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1331
	mutex_exit(&tgt->statlock);
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1332
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1333
	pmcs_update_phy_pm_props(phy, 0, 0, B_TRUE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1334
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1335
	addr = scsi_wwn_to_wwnstr(wwn, ua_form, NULL);
11307
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1336
	if (smp_device_prop_update_string(smp_sd, SCSI_ADDR_PROP_ATTACHED_PORT,
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  1337
	    addr) != DDI_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1338
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: Failed to set "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1339
		    "prop ("SCSI_ADDR_PROP_ATTACHED_PORT")", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1340
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1341
	(void) scsi_free_wwnstr(addr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1342
	ddi_prop_free(tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1343
	return (DDI_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1344
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1345
smp_init_fail:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1346
	tgt->phy = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1347
	tgt->target_num = PMCS_INVALID_TARGET_NUM;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1348
	phy->target = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1349
	if (!IS_ROOT_PHY(phy)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1350
		pmcs_dec_phy_ref_count(phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1351
	}
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  1352
	mutex_exit(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1353
	pmcs_unlock_phy(phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1354
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1355
	ddi_soft_state_bystr_free(iport->tgt_sstate, tgt->unit_address);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1356
	ddi_prop_free(tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1357
	return (DDI_FAILURE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1358
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1359
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1360
static void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1361
pmcs_smp_free(dev_info_t *self, dev_info_t *child,
11052
f59c5298a2cc 6898706 smp should register devids
Chris Horne <Chris.Horne@Sun.COM>
parents: 11048
diff changeset
  1362
    smp_hba_tran_t *tran, smp_device_t *smp)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1363
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1364
	_NOTE(ARGUNUSED(tran, smp));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1365
	pmcs_iport_t *iport;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1366
	pmcs_hw_t *pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1367
	pmcs_xscsi_t *tgt;
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1368
	pmcs_phy_t *phyp;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1369
	char *tgt_port;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1370
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1371
	iport = ddi_get_soft_state(pmcs_iport_softstate,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1372
	    ddi_get_instance(self));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1373
	ASSERT(iport);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1374
	if (iport == NULL)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1375
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1376
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1377
	pwp = iport->pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1378
	if (pwp == NULL)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1379
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1380
	ASSERT(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1381
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1382
	/* Get "target-port" prop from devinfo node */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1383
	if (ddi_prop_lookup_string(DDI_DEV_T_ANY, child,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1384
	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1385
	    SCSI_ADDR_PROP_TARGET_PORT, &tgt_port) != DDI_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1386
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s: Failed to "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1387
		    "lookup prop ("SCSI_ADDR_PROP_TARGET_PORT")", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1388
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1389
	}
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1390
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1391
	/* Retrieve softstate using unit-address */
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1392
	mutex_enter(&pwp->lock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1393
	tgt = ddi_soft_state_bystr_get(iport->tgt_sstate, tgt_port);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1394
	pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, tgt, "%s: %s (%s)", __func__,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1395
	    ddi_get_name(child), tgt_port);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1396
	ddi_prop_free(tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1397
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1398
	if (tgt == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1399
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1400
		    "%s: tgt softstate not found", __func__);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1401
		mutex_exit(&pwp->lock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1402
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1403
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1404
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1405
	phyp = tgt->phy;
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1406
	if (phyp) {
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1407
		mutex_enter(&phyp->phy_lock);
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1408
		if (!IS_ROOT_PHY(phyp)) {
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1409
			pmcs_dec_phy_ref_count(phyp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1410
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1411
	}
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1412
	mutex_enter(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1413
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1414
	if (--tgt->ref_count == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1415
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1416
		 * Remove this target from our list. The softstate
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1417
		 * will remain, and the device will remain registered
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1418
		 * with the hardware unless/until we're told that the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1419
		 * device physically went away.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1420
		 */
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1421
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, NULL, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1422
		    "Removing target 0x%p (vtgt %d) from target list",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1423
		    (void *)tgt, tgt->target_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1424
		pwp->targets[tgt->target_num] = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1425
		tgt->target_num = PMCS_INVALID_TARGET_NUM;
12949
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  1426
		/* If the PHY has a pointer to this target, clear it */
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  1427
		if (phyp && (phyp->target == tgt)) {
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1428
			phyp->target = NULL;
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  1429
		}
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1430
		tgt->phy = NULL;
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1431
		pmcs_destroy_target(tgt);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1432
	} else {
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  1433
		mutex_exit(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1434
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1435
12385
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1436
	if (phyp) {
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1437
		mutex_exit(&phyp->phy_lock);
61a45f43f68d 6949739 system crash in pmcs_expander_content_discover()
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12343
diff changeset
  1438
	}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1439
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1440
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1441
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1442
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1443
pmcs_scsi_quiesce(dev_info_t *dip)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1444
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1445
	pmcs_hw_t *pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1446
	int totactive = -1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1447
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1448
	uint16_t target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1449
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1450
	if (ddi_get_soft_state(pmcs_iport_softstate, ddi_get_instance(dip)))
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1451
		return (0);		/* iport */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1452
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1453
	pwp  = ddi_get_soft_state(pmcs_softc_state, ddi_get_instance(dip));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1454
	if (pwp == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1455
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1456
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1457
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1458
	if (pwp->state != STATE_RUNNING) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1459
		mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1460
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1461
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1462
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1463
	pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s called", __func__);
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  1464
	pwp->quiesced = pwp->blocked = 1;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1465
	while (totactive) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1466
		totactive = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1467
		for (target = 0; target < pwp->max_dev; target++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1468
			xp = pwp->targets[target];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1469
			if (xp == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1470
				continue;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1471
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1472
			mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1473
			if (xp->actv_cnt) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1474
				totactive += xp->actv_cnt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1475
				xp->draining = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1476
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1477
			mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1478
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1479
		if (totactive) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1480
			cv_wait(&pwp->drain_cv, &pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1481
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1482
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1483
		 * The pwp->blocked may have been reset. e.g a SCSI bus reset
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1484
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1485
		pwp->blocked = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1486
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1487
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1488
	for (target = 0; target < pwp->max_dev; target++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1489
		xp = pwp->targets[target];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1490
		if (xp == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1491
			continue;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1492
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1493
		mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1494
		xp->draining = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1495
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1496
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1497
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1498
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1499
	if (totactive == 0) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1500
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1501
		    "%s drain complete", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1502
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1503
	return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1504
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1505
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1506
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1507
pmcs_scsi_unquiesce(dev_info_t *dip)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1508
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1509
	pmcs_hw_t *pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1510
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1511
	if (ddi_get_soft_state(pmcs_iport_softstate, ddi_get_instance(dip)))
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1512
		return (0);		/* iport */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1513
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1514
	pwp  = ddi_get_soft_state(pmcs_softc_state, ddi_get_instance(dip));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1515
	if (pwp == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1516
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1517
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1518
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1519
	if (pwp->state != STATE_RUNNING) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1520
		mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1521
		return (-1);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1522
	}
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1523
	pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL, "%s called", __func__);
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  1524
	pwp->blocked = pwp->quiesced = 0;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1525
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1526
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1527
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1528
	 * Run all pending commands.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1529
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1530
	pmcs_scsa_wq_run(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1531
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1532
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1533
	 * Complete all completed commands.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1534
	 * This also unlocks us.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1535
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1536
	PMCS_CQ_RUN(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1537
	return (0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1538
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1539
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1540
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1541
 * Start commands for a particular device
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1542
 * If the actual start of a command fails, return B_FALSE.  Any other result
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1543
 * is a B_TRUE return.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1544
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1545
boolean_t
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1546
pmcs_scsa_wq_run_one(pmcs_hw_t *pwp, pmcs_xscsi_t *xp)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1547
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1548
	pmcs_cmd_t *sp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1549
	pmcs_phy_t *phyp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1550
	pmcwork_t *pwrk;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1551
	boolean_t run_one, blocked;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1552
	int rval;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1553
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1554
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1555
	 * First, check to see if we're blocked or resource limited
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1556
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1557
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1558
	blocked = pwp->blocked;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1559
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1560
	 * If resource_limited is set, we're resource constrained and
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1561
	 * we will run only one work request for this target.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1562
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1563
	run_one = pwp->resource_limited;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1564
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1565
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1566
	if (blocked) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1567
		/* Queues will get restarted when we get unblocked */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1568
		return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1569
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1570
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1571
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1572
	 * Might as well verify the queue is not empty before moving on
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1573
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1574
	mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1575
	if (STAILQ_EMPTY(&xp->wq)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1576
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1577
		return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1578
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1579
	mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1580
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1581
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1582
	 * If we're draining or resetting, just reschedule work queue and bail.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1583
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1584
	mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1585
	if (xp->draining || xp->resetting || xp->special_running ||
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1586
	    xp->special_needed) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1587
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1588
		SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1589
		return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1590
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1591
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1592
	/*
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
  1593
	 * Next, check to see if the target is gone.
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1594
	 */
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
  1595
	if (xp->dev_gone) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1596
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
  1597
		    "%s: Flushing wait queue for dead tgt 0x%p", __func__,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1598
		    (void *)xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1599
		pmcs_flush_target_queues(pwp, xp, PMCS_TGT_WAIT_QUEUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1600
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1601
		return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1602
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1603
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1604
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1605
	 * Increment the PHY's ref_count now so we know it won't go away
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1606
	 * after we drop the target lock.  Drop it before returning.  If the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1607
	 * PHY dies, the commands we attempt to send will fail, but at least
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1608
	 * we know we have a real PHY pointer.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1609
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1610
	phyp = xp->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1611
	pmcs_inc_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1612
	mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1613
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1614
	mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1615
	while ((sp = STAILQ_FIRST(&xp->wq)) != NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1616
		pwrk = pmcs_gwork(pwp, PMCS_TAG_TYPE_CBACK, phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1617
		if (pwrk == NULL) {
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1618
			mutex_exit(&xp->wqlock);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1619
			mutex_enter(&pwp->lock);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1620
			if (pwp->resource_limited == 0) {
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1621
				pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, NULL,
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1622
				    "%s: out of work structures", __func__);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1623
			}
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1624
			pwp->resource_limited = 1;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1625
			SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1626
			mutex_exit(&pwp->lock);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1627
			return (B_FALSE);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1628
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1629
		STAILQ_REMOVE_HEAD(&xp->wq, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1630
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1631
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1632
		pwrk->xp = xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1633
		pwrk->arg = sp;
13000
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  1634
		pwrk->timer = 0;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1635
		sp->cmd_tag = pwrk->htag;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1636
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1637
		pwrk->dtype = xp->dtype;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1638
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1639
		if (xp->dtype == SAS) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1640
			pwrk->ptr = (void *) pmcs_SAS_done;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1641
			if ((rval = pmcs_SAS_run(sp, pwrk)) != 0) {
12989
19cd6b4c098c 6961818 panic while increasing stress on appliance
Jesse Butler <jesse.butler@oracle.com>
parents: 12949
diff changeset
  1642
				if (rval != PMCS_WQ_RUN_FAIL_RES_CMP) {
19cd6b4c098c 6961818 panic while increasing stress on appliance
Jesse Butler <jesse.butler@oracle.com>
parents: 12949
diff changeset
  1643
					sp->cmd_tag = NULL;
19cd6b4c098c 6961818 panic while increasing stress on appliance
Jesse Butler <jesse.butler@oracle.com>
parents: 12949
diff changeset
  1644
				}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1645
				pmcs_dec_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1646
				pmcs_pwork(pwp, pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1647
				SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1648
				if (rval == PMCS_WQ_RUN_FAIL_RES) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1649
					return (B_FALSE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1650
				} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1651
					return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1652
				}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1653
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1654
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1655
			ASSERT(xp->dtype == SATA);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1656
			pwrk->ptr = (void *) pmcs_SATA_done;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1657
			if ((rval = pmcs_SATA_run(sp, pwrk)) != 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1658
				sp->cmd_tag = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1659
				pmcs_dec_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1660
				pmcs_pwork(pwp, pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1661
				SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1662
				if (rval == PMCS_WQ_RUN_FAIL_RES) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1663
					return (B_FALSE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1664
				} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1665
					return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1666
				}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1667
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1668
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1669
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1670
		if (run_one) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1671
			goto wq_out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1672
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1673
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1674
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1675
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1676
	mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1677
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1678
wq_out:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1679
	pmcs_dec_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1680
	return (B_TRUE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1681
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1682
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1683
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1684
 * Start commands for all devices.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1685
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1686
void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1687
pmcs_scsa_wq_run(pmcs_hw_t *pwp)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1688
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1689
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1690
	uint16_t target_start, target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1691
	boolean_t	rval = B_TRUE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1692
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1693
	mutex_enter(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1694
	target_start = pwp->last_wq_dev;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1695
	target = target_start;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1697
	do {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1698
		xp = pwp->targets[target];
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  1699
		if ((xp == NULL) || (STAILQ_EMPTY(&xp->wq))) {
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1700
			if (++target == pwp->max_dev) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1701
				target = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1702
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1703
			continue;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1704
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1705
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1706
		mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1707
		rval = pmcs_scsa_wq_run_one(pwp, xp);
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  1708
		mutex_enter(&pwp->lock);
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  1709
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1710
		if (rval == B_FALSE) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1711
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1712
		}
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  1713
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1714
		if (++target == pwp->max_dev) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1715
			target = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1716
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1717
	} while (target != target_start);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1718
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1719
	if (rval) {
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1720
		/*
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1721
		 * If we were resource limited, but apparently are not now,
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1722
		 * reschedule the work queues anyway.
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1723
		 */
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1724
		if (pwp->resource_limited) {
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1725
			SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1726
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1727
		pwp->resource_limited = 0; /* Not resource-constrained */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1728
	} else {
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1729
		/*
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1730
		 * Give everybody a chance, and reschedule to run the queues
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1731
		 * again as long as we're limited.
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1732
		 */
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1733
		pwp->resource_limited = 1;
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  1734
		SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1735
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1736
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1737
	pwp->last_wq_dev = target;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1738
	mutex_exit(&pwp->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1739
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1740
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1741
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1742
 * Pull the completion queue, drop the lock and complete all elements.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1743
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1744
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1745
void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1746
pmcs_scsa_cq_run(void *arg)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1747
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1748
	pmcs_cq_thr_info_t *cqti = (pmcs_cq_thr_info_t *)arg;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1749
	pmcs_hw_t *pwp = cqti->cq_pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1750
	pmcs_cmd_t *sp, *nxt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1751
	struct scsi_pkt *pkt;
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1752
	pmcs_xscsi_t *tgt;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1753
	pmcs_iocomp_cb_t *ioccb, *ioccb_next;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1754
	pmcs_cb_t callback;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1755
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1756
	DTRACE_PROBE1(pmcs__scsa__cq__run__start, pmcs_cq_thr_info_t *, cqti);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1757
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1758
	mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1759
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1760
	while (!pwp->cq_info.cq_stop) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1761
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1762
		 * First, check the I/O completion callback queue.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1763
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1764
		ioccb = pwp->iocomp_cb_head;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1765
		pwp->iocomp_cb_head = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1766
		pwp->iocomp_cb_tail = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1767
		mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1768
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1769
		while (ioccb) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1770
			/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1771
			 * Grab the lock on the work structure. The callback
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1772
			 * routine is responsible for clearing it.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1773
			 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1774
			mutex_enter(&ioccb->pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1775
			ioccb_next = ioccb->next;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1776
			callback = (pmcs_cb_t)ioccb->pwrk->ptr;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1777
			(*callback)(pwp, ioccb->pwrk,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1778
			    (uint32_t *)((void *)ioccb->iomb));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1779
			kmem_cache_free(pwp->iocomp_cb_cache, ioccb);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1780
			ioccb = ioccb_next;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1781
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1782
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1783
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1784
		 * Next, run the completion queue
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1785
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1786
		mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1787
		sp = STAILQ_FIRST(&pwp->cq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1788
		STAILQ_INIT(&pwp->cq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1789
		mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1790
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1791
		DTRACE_PROBE1(pmcs__scsa__cq__run__start__loop,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1792
		    pmcs_cq_thr_info_t *, cqti);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1793
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1794
		if (sp && pmcs_check_acc_dma_handle(pwp)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1795
			ddi_fm_service_impact(pwp->dip, DDI_SERVICE_UNAFFECTED);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1796
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1797
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1798
		while (sp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1799
			nxt = STAILQ_NEXT(sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1800
			pkt = CMD2PKT(sp);
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1801
			tgt = sp->cmd_target;
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1802
			pmcs_prt(pwp, PMCS_PRT_DEBUG3, NULL, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1803
			    "%s: calling completion on %p for tgt %p", __func__,
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1804
			    (void *)sp, (void *)tgt);
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1805
			if (tgt) {
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1806
				mutex_enter(&tgt->statlock);
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1807
				ASSERT(tgt->actv_pkts != 0);
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1808
				tgt->actv_pkts--;
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1809
				mutex_exit(&tgt->statlock);
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  1810
			}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1811
			scsi_hba_pkt_comp(pkt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1812
			sp = nxt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1813
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1814
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1815
		DTRACE_PROBE1(pmcs__scsa__cq__run__end__loop,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1816
		    pmcs_cq_thr_info_t *, cqti);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1817
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1818
		/*
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1819
		 * Check if there are more completions to do.  If so, and we've
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1820
		 * not been told to stop, skip the wait and cycle through again.
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1821
		 */
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1822
		mutex_enter(&pwp->cq_lock);
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1823
		if ((pwp->iocomp_cb_head == NULL) && STAILQ_EMPTY(&pwp->cq) &&
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1824
		    !pwp->cq_info.cq_stop) {
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1825
			mutex_exit(&pwp->cq_lock);
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1826
			mutex_enter(&cqti->cq_thr_lock);
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1827
			cv_wait(&cqti->cq_cv, &cqti->cq_thr_lock);
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1828
			mutex_exit(&cqti->cq_thr_lock);
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1829
			mutex_enter(&pwp->cq_lock);
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1830
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1831
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1832
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1833
	mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1834
	DTRACE_PROBE1(pmcs__scsa__cq__run__stop, pmcs_cq_thr_info_t *, cqti);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1835
	thread_exit();
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1836
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1837
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1838
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1839
 * Run a SAS command.  Called with pwrk->lock held, returns unlocked.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1840
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1841
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1842
pmcs_SAS_run(pmcs_cmd_t *sp, pmcwork_t *pwrk)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1843
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1844
	pmcs_hw_t *pwp = CMD2PMC(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1845
	struct scsi_pkt *pkt = CMD2PKT(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1846
	pmcs_xscsi_t *xp = pwrk->xp;
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1847
	uint32_t iq, lhtag, *ptr;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1848
	sas_ssp_cmd_iu_t sc;
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1849
	int sp_pkt_time = 0;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1850
12462
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  1851
	ASSERT(xp != NULL);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1852
	mutex_enter(&xp->statlock);
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
  1853
	if (!xp->assigned) {
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1854
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1855
		return (PMCS_WQ_RUN_FAIL_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1856
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1857
	if ((xp->actv_cnt >= xp->qdepth) || xp->recover_wait) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1858
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1859
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1860
		STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1861
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1862
		return (PMCS_WQ_RUN_FAIL_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1863
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1864
	GET_IO_IQ_ENTRY(pwp, ptr, pwrk->phy->device_id, iq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1865
	if (ptr == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1866
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1867
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1868
		 * This is a temporary failure not likely to unblocked by
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1869
		 * commands completing as the test for scheduling the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1870
		 * restart of work is a per-device test.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1871
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1872
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1873
		STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1874
		mutex_exit(&xp->wqlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1875
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1876
		    "%s: Failed to get IO IQ entry for tgt %d",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1877
		    __func__, xp->target_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1878
		return (PMCS_WQ_RUN_FAIL_RES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1879
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1880
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1881
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1882
	ptr[0] =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1883
	    LE_32(PMCS_IOMB_IN_SAS(PMCS_OQ_IODONE, PMCIN_SSP_INI_IO_START));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1884
	ptr[1] = LE_32(pwrk->htag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1885
	ptr[2] = LE_32(pwrk->phy->device_id);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1886
	ptr[3] = LE_32(pkt->pkt_dma_len);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1887
	if (ptr[3]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1888
		ASSERT(pkt->pkt_numcookies);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1889
		if (pkt->pkt_dma_flags & DDI_DMA_READ) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1890
			ptr[4] = LE_32(PMCIN_DATADIR_2_INI);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1891
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1892
			ptr[4] = LE_32(PMCIN_DATADIR_2_DEV);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1893
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1894
		if (pmcs_dma_load(pwp, sp, ptr)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1895
			mutex_exit(&pwp->iqp_lock[iq]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1896
			mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1897
			mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1898
			if (STAILQ_EMPTY(&xp->wq)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1899
				STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1900
				mutex_exit(&xp->wqlock);
12989
19cd6b4c098c 6961818 panic while increasing stress on appliance
Jesse Butler <jesse.butler@oracle.com>
parents: 12949
diff changeset
  1901
				return (PMCS_WQ_RUN_FAIL_RES);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1902
			} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1903
				mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1904
				CMD2PKT(sp)->pkt_scbp[0] = STATUS_QFULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1905
				CMD2PKT(sp)->pkt_reason = CMD_CMPLT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1906
				CMD2PKT(sp)->pkt_state |= STATE_GOT_BUS |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1907
				    STATE_GOT_TARGET | STATE_SENT_CMD |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1908
				    STATE_GOT_STATUS;
12989
19cd6b4c098c 6961818 panic while increasing stress on appliance
Jesse Butler <jesse.butler@oracle.com>
parents: 12949
diff changeset
  1909
				sp->cmd_tag = NULL;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1910
				mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1911
				STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  1912
				PMCS_CQ_RUN_LOCKED(pwp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1913
				mutex_exit(&pwp->cq_lock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1914
				pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1915
				    "%s: Failed to dma_load for tgt %d (QF)",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1916
				    __func__, xp->target_num);
12989
19cd6b4c098c 6961818 panic while increasing stress on appliance
Jesse Butler <jesse.butler@oracle.com>
parents: 12949
diff changeset
  1917
				return (PMCS_WQ_RUN_FAIL_RES_CMP);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1918
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1919
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1920
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1921
		ptr[4] = LE_32(PMCIN_DATADIR_NONE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1922
		CLEAN_MESSAGE(ptr, 12);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1923
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1924
	xp->actv_cnt++;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1925
	if (xp->actv_cnt > xp->maxdepth) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1926
		xp->maxdepth = xp->actv_cnt;
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1927
		pmcs_prt(pwp, PMCS_PRT_DEBUG2, pwrk->phy, xp, "%s: max depth "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1928
		    "now %u", pwrk->phy->path, xp->maxdepth);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1929
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1930
	mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1931
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1932
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1933
#ifdef	DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1934
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1935
	 * Generate a PMCOUT_STATUS_XFER_CMD_FRAME_ISSUED
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1936
	 * event when this goes out on the wire.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1937
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1938
	ptr[4] |= PMCIN_MESSAGE_REPORT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1939
#endif
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1940
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1941
	 * Fill in the SSP IU
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1942
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1943
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1944
	bzero(&sc, sizeof (sas_ssp_cmd_iu_t));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1945
	bcopy((uint8_t *)&sp->cmd_lun->scsi_lun, sc.lun, sizeof (scsi_lun_t));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1946
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1947
	switch (pkt->pkt_flags & FLAG_TAGMASK) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1948
	case FLAG_HTAG:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1949
		sc.task_attribute = SAS_CMD_TASK_ATTR_HEAD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1950
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1951
	case FLAG_OTAG:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1952
		sc.task_attribute = SAS_CMD_TASK_ATTR_ORDERED;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1953
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1954
	case FLAG_STAG:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1955
	default:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1956
		sc.task_attribute = SAS_CMD_TASK_ATTR_SIMPLE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1957
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1958
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1959
	(void) memcpy(sc.cdb, pkt->pkt_cdbp,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1960
	    min(SCSA_CDBLEN(sp), sizeof (sc.cdb)));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1961
	(void) memcpy(&ptr[5], &sc, sizeof (sas_ssp_cmd_iu_t));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1962
	pwrk->state = PMCS_WORK_STATE_ONCHIP;
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1963
	lhtag = pwrk->htag;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1964
	mutex_exit(&pwrk->lock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  1965
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1966
	    "%s: giving pkt %p (tag %x) to the hardware", __func__,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1967
	    (void *)pkt, pwrk->htag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1968
#ifdef DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1969
	pmcs_print_entry(pwp, PMCS_PRT_DEBUG3, "SAS INI Message", ptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1970
#endif
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1971
	mutex_enter(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1972
	STAILQ_INSERT_TAIL(&xp->aq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1973
	mutex_exit(&xp->aqlock);
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1974
	sp_pkt_time = CMD2PKT(sp)->pkt_time;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1975
	INC_IQ_ENTRY(pwp, iq);
13000
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  1976
	mutex_enter(&pwrk->lock);
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1977
	if (lhtag == pwrk->htag) {
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1978
		pwrk->timer = US2WT(sp_pkt_time * 1000000);
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1979
		if (pwrk->timer == 0) {
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1980
			pwrk->timer = US2WT(1000000);
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  1981
		}
13000
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  1982
	}
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  1983
	mutex_exit(&pwrk->lock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1984
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1985
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1986
	 * If we just submitted the last command queued from device state
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1987
	 * recovery, clear the wq_recovery_tail pointer.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1988
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1989
	mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1990
	if (xp->wq_recovery_tail == sp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1991
		xp->wq_recovery_tail = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1992
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1993
	mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1994
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1995
	return (PMCS_WQ_RUN_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1996
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1997
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1998
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  1999
 * Complete a SAS command
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2000
 *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2001
 * Called with pwrk lock held.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2002
 * The free of pwrk releases the lock.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2003
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2004
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2005
static void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2006
pmcs_SAS_done(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *msg)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2007
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2008
	pmcs_cmd_t *sp = pwrk->arg;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2009
	pmcs_phy_t *pptr = pwrk->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2010
	pmcs_xscsi_t *xp = pwrk->xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2011
	struct scsi_pkt *pkt = CMD2PKT(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2012
	int dead;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2013
	uint32_t sts;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2014
	boolean_t aborted = B_FALSE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2015
	boolean_t do_ds_recovery = B_FALSE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2016
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2017
	ASSERT(xp != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2018
	ASSERT(sp != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2019
	ASSERT(pptr != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2020
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2021
	DTRACE_PROBE4(pmcs__io__done, uint64_t, pkt->pkt_dma_len, int,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2022
	    (pkt->pkt_dma_flags & DDI_DMA_READ) != 0, hrtime_t, pwrk->start,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2023
	    hrtime_t, gethrtime());
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2024
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2025
	dead = pwrk->dead;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2026
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2027
	if (msg) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2028
		sts = LE_32(msg[2]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2029
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2030
		sts = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2031
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2032
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2033
	if (dead != 0) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2034
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, "%s: dead cmd tag "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2035
		    "0x%x for %s", __func__, pwrk->htag, pptr->path);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2036
		goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2037
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2038
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2039
	if (sts == PMCOUT_STATUS_ABORTED) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2040
		aborted = B_TRUE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2041
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2042
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2043
	if (pwrk->state == PMCS_WORK_STATE_TIMED_OUT) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2044
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2045
		    "%s: cmd 0x%p (tag 0x%x) timed out for %s",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2046
		    __func__, (void *)sp, pwrk->htag, pptr->path);
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  2047
		CMD2PKT(sp)->pkt_scbp[0] = STATUS_GOOD;
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  2048
		CMD2PKT(sp)->pkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET |
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  2049
		    STATE_SENT_CMD;
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  2050
		CMD2PKT(sp)->pkt_statistics |= STAT_TIMEOUT;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2051
		goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2052
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2053
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2054
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2055
	 * If the status isn't okay but not underflow,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2056
	 * step to the side and parse the (possible) error.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2057
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2058
#ifdef DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2059
	if (msg) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2060
		pmcs_print_entry(pwp, PMCS_PRT_DEBUG3, "Outbound Message", msg);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2061
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2062
#endif
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2063
	if (!msg) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2064
		goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2065
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2066
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2067
	switch (sts) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2068
	case PMCOUT_STATUS_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2069
	case PMCOUT_STATUS_IO_DS_NON_OPERATIONAL:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2070
	case PMCOUT_STATUS_IO_DS_IN_RECOVERY:
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2071
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
11347
bd1e73977848 6903492 targets not restored after hotplug & i/o stalls
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11307
diff changeset
  2072
		    "%s: PHY %s requires DS recovery (status=%d)",
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2073
		    __func__, pptr->path, sts);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2074
		do_ds_recovery = B_TRUE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2075
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2076
	case PMCOUT_STATUS_UNDERFLOW:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2077
		(void) pmcs_set_resid(pkt, pkt->pkt_dma_len, LE_32(msg[3]));
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2078
		pmcs_prt(pwp, PMCS_PRT_DEBUG_UNDERFLOW, NULL, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2079
		    "%s: underflow %u for cdb 0x%x",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2080
		    __func__, LE_32(msg[3]), pkt->pkt_cdbp[0] & 0xff);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2081
		sts = PMCOUT_STATUS_OK;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2082
		msg[3] = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2083
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2084
	case PMCOUT_STATUS_OK:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2085
		pkt->pkt_resid = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2086
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2087
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2088
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2089
	if (sts != PMCOUT_STATUS_OK) {
12060
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
  2090
		pmcs_ioerror(pwp, SAS, pwrk, msg, sts);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2091
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2092
		if (msg[3]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2093
			uint8_t local[PMCS_QENTRY_SIZE << 1], *xd;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2094
			sas_ssp_rsp_iu_t *rptr = (void *)local;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2095
			const int lim =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2096
			    (PMCS_QENTRY_SIZE << 1) - SAS_RSP_HDR_SIZE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2097
			static const uint8_t ssp_rsp_evec[] = {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2098
				0x58, 0x61, 0x56, 0x72, 0x00
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2099
			};
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2100
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2101
			/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2102
			 * Transform the the first part of the response
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2103
			 * to host canonical form. This gives us enough
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2104
			 * information to figure out what to do with the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2105
			 * rest (which remains unchanged in the incoming
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2106
			 * message which can be up to two queue entries
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2107
			 * in length).
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2108
			 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2109
			pmcs_endian_transform(pwp, local, &msg[5],
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2110
			    ssp_rsp_evec);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2111
			xd = (uint8_t *)(&msg[5]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2112
			xd += SAS_RSP_HDR_SIZE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2113
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2114
			if (rptr->datapres == SAS_RSP_DATAPRES_RESPONSE_DATA) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2115
				if (rptr->response_data_length != 4) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2116
					pmcs_print_entry(pwp, PMCS_PRT_DEBUG,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2117
					    "Bad SAS RESPONSE DATA LENGTH",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2118
					    msg);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2119
					pkt->pkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2120
					goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2121
				}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2122
				(void) memcpy(&sts, xd, sizeof (uint32_t));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2123
				sts = BE_32(sts);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2124
				/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2125
				 * The only response code we should legally get
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2126
				 * here is an INVALID FRAME response code.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2127
				 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2128
				if (sts == SAS_RSP_INVALID_FRAME) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2129
					pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2130
					    "%s: pkt %p tgt %u path %s "
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2131
					    "completed: INVALID FRAME response",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2132
					    __func__, (void *)pkt,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2133
					    xp->target_num, pptr->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2134
				} else {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2135
					pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2136
					    "%s: pkt %p tgt %u path %s "
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2137
					    "completed: illegal response 0x%x",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2138
					    __func__, (void *)pkt,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2139
					    xp->target_num, pptr->path, sts);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2140
				}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2141
				pkt->pkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2142
				goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2143
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2144
			if (rptr->datapres == SAS_RSP_DATAPRES_SENSE_DATA) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2145
				uint32_t slen;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2146
				slen = rptr->sense_data_length;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2147
				if (slen > lim) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2148
					slen = lim;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2149
				}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2150
				pmcs_latch_status(pwp, sp, rptr->status, xd,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2151
				    slen, pptr->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2152
			} else if (rptr->datapres == SAS_RSP_DATAPRES_NO_DATA) {
11241
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2153
				pmcout_ssp_comp_t *sspcp;
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2154
				sspcp = (pmcout_ssp_comp_t *)msg;
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2155
				uint32_t *residp;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2156
				/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2157
				 * This is the case for a plain SCSI status.
11241
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2158
				 * Note: If RESC_V is set and we're here, there
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2159
				 * is a residual.  We need to find it and update
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2160
				 * the packet accordingly.
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2161
				 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2162
				pmcs_latch_status(pwp, sp, rptr->status, NULL,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2163
				    0, pptr->path);
11241
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2164
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2165
				if (sspcp->resc_v) {
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2166
					/*
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2167
					 * Point residual to the SSP_RESP_IU
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2168
					 */
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2169
					residp = (uint32_t *)(sspcp + 1);
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2170
					/*
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2171
					 * param contains the number of bytes
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2172
					 * between where the SSP_RESP_IU may
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2173
					 * or may not be and the residual.
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2174
					 * Increment residp by the appropriate
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2175
					 * number of words: (param+resc_pad)/4).
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2176
					 */
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2177
					residp += (LE_32(sspcp->param) +
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2178
					    sspcp->resc_pad) /
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2179
					    sizeof (uint32_t);
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2180
					pmcs_prt(pwp, PMCS_PRT_DEBUG_UNDERFLOW,
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2181
					    pptr, xp, "%s: tgt 0x%p "
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2182
					    "residual %d for pkt 0x%p",
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2183
					    __func__, (void *) xp, *residp,
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2184
					    (void *) pkt);
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2185
					ASSERT(LE_32(*residp) <=
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2186
					    pkt->pkt_dma_len);
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2187
					(void) pmcs_set_resid(pkt,
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2188
					    pkt->pkt_dma_len, LE_32(*residp));
13b9f5cc13e3 6902289 pmcs is not always setting pkt_resid when needed
David Hollister <David.Hollister@Sun.COM>
parents: 11087
diff changeset
  2189
				}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2190
			} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2191
				pmcs_print_entry(pwp, PMCS_PRT_DEBUG,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2192
				    "illegal SAS response", msg);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2193
				pkt->pkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2194
				goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2195
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2196
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2197
			pmcs_latch_status(pwp, sp, STATUS_GOOD, NULL, 0,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2198
			    pptr->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2199
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2200
		if (pkt->pkt_dma_len) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2201
			pkt->pkt_state |= STATE_XFERRED_DATA;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2202
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2203
	}
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2204
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2205
	    "%s: pkt %p tgt %u done reason=%x state=%x resid=%ld status=%x",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2206
	    __func__, (void *)pkt, xp->target_num, pkt->pkt_reason,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2207
	    pkt->pkt_state, pkt->pkt_resid, pkt->pkt_scbp[0]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2208
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2209
	if (pwrk->state == PMCS_WORK_STATE_ABORTED) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2210
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2211
		    "%s: scsi_pkt 0x%p aborted for PHY %s; work = 0x%p",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2212
		    __func__, (void *)pkt, pptr->path, (void *)pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2213
		aborted = B_TRUE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2214
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2215
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2216
out:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2217
	pmcs_dma_unload(pwp, sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2218
	mutex_enter(&xp->statlock);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2219
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2220
	/*
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2221
	 * If the device no longer has a PHY pointer, clear the PHY pointer
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2222
	 * from the work structure before we free it.  Otherwise, pmcs_pwork
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2223
	 * may decrement the ref_count on a PHY that's been freed.
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2224
	 */
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2225
	if (xp->phy == NULL) {
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2226
		pwrk->phy = NULL;
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2227
	}
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2228
12506
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2229
	/*
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2230
	 * We may arrive here due to a command timing out, which in turn
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2231
	 * could be addressed in a different context.  So, free the work
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2232
	 * back, but only after confirming it's not already been freed
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2233
	 * elsewhere.
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2234
	 */
12539
4762b6239106 6957598 fix for 6952400 needs fixing
Jesse Butler <jesse.butler@oracle.com>
parents: 12506
diff changeset
  2235
	if (pwrk->htag != PMCS_TAG_FREE) {
12506
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2236
		pmcs_pwork(pwp, pwrk);
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2237
	}
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2238
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2239
	/*
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2240
	 * If the device is gone, we only put this command on the completion
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2241
	 * queue if the work structure is not marked dead.  If it's marked
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2242
	 * dead, it will already have been put there.
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2243
	 */
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2244
	if (xp->dev_gone) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2245
		mutex_exit(&xp->statlock);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2246
		if (!dead) {
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2247
			mutex_enter(&xp->aqlock);
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2248
			STAILQ_REMOVE(&xp->aq, sp, pmcs_cmd, cmd_next);
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2249
			mutex_exit(&xp->aqlock);
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2250
			pmcs_prt(pwp, PMCS_PRT_DEBUG3, pptr, xp,
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2251
			    "%s: Removing cmd 0x%p (htag 0x%x) from aq",
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2252
			    __func__, (void *)sp, sp->cmd_tag);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2253
			mutex_enter(&pwp->cq_lock);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2254
			STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  2255
			PMCS_CQ_RUN_LOCKED(pwp);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2256
			mutex_exit(&pwp->cq_lock);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2257
			pmcs_prt(pwp, PMCS_PRT_DEBUG2, pptr, xp,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2258
			    "%s: Completing command for dead target 0x%p",
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2259
			    __func__, (void *)xp);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2260
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2261
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2262
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2263
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2264
	ASSERT(xp->actv_cnt > 0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2265
	if (--(xp->actv_cnt) == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2266
		if (xp->draining) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2267
			pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2268
			    "%s: waking up drain waiters", __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2269
			cv_signal(&pwp->drain_cv);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2270
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2271
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2272
	mutex_exit(&xp->statlock);
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2273
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2274
	/*
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2275
	 * If the status is other than OK, determine if it's something that
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2276
	 * is worth re-attempting enumeration.  If so, mark the PHY.
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2277
	 */
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2278
	if (sts != PMCOUT_STATUS_OK) {
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2279
		pmcs_status_disposition(pptr, sts);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2280
	}
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2281
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2282
	if (dead == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2283
#ifdef	DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2284
		pmcs_cmd_t *wp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2285
		mutex_enter(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2286
		STAILQ_FOREACH(wp, &xp->aq, cmd_next) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2287
			if (wp == sp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2288
				break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2289
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2290
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2291
		ASSERT(wp != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2292
#else
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2293
		mutex_enter(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2294
#endif
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2295
		pmcs_prt(pwp, PMCS_PRT_DEBUG3, pptr, xp,
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2296
		    "%s: Removing cmd 0x%p (htag 0x%x) from aq", __func__,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2297
		    (void *)sp, sp->cmd_tag);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2298
		STAILQ_REMOVE(&xp->aq, sp, pmcs_cmd, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2299
		if (aborted) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2300
			pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2301
			    "%s: Aborted cmd for tgt 0x%p, signaling waiters",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2302
			    __func__, (void *)xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2303
			cv_signal(&xp->abort_cv);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2304
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2305
		mutex_exit(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2306
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2307
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2308
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2309
	 * If do_ds_recovery is set, we need to initiate device state
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2310
	 * recovery.  In this case, we put this I/O back on the head of
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2311
	 * the wait queue to run again after recovery is complete
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2312
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2313
	if (do_ds_recovery) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2314
		mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2315
		pmcs_start_dev_state_recovery(xp, pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2316
		mutex_exit(&xp->statlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2317
		pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, xp, "%s: Putting cmd 0x%p "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2318
		    "back on wq during recovery for tgt 0x%p", __func__,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2319
		    (void *)sp, (void *)xp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2320
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2321
		if (xp->wq_recovery_tail == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2322
			STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2323
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2324
			/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2325
			 * If there are other I/Os waiting at the head due to
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2326
			 * device state recovery, add this one in the right spot
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2327
			 * to maintain proper order.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2328
			 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2329
			STAILQ_INSERT_AFTER(&xp->wq, xp->wq_recovery_tail, sp,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2330
			    cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2331
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2332
		xp->wq_recovery_tail = sp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2333
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2334
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2335
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2336
		 * If we're not initiating device state recovery and this
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2337
		 * command was not "dead", put it on the completion queue
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2338
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2339
		if (!dead) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2340
			mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2341
			STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  2342
			PMCS_CQ_RUN_LOCKED(pwp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2343
			mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2344
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2345
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2346
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2347
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2348
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2349
 * Run a SATA command (normal reads and writes),
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2350
 * or block and schedule a SATL interpretation
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2351
 * of the command.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2352
 *
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2353
 * Called with pwrk lock held, returns unlocked.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2354
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2355
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2356
static int
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2357
pmcs_SATA_run(pmcs_cmd_t *sp, pmcwork_t *pwrk)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2358
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2359
	pmcs_hw_t *pwp = CMD2PMC(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2360
	struct scsi_pkt *pkt = CMD2PKT(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2361
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2362
	uint8_t cdb_base, asc, tag;
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2363
	uint32_t *ptr, lhtag, iq, nblk, i, mtype;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2364
	fis_t fis;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2365
	size_t amt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2366
	uint64_t lba;
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2367
	int sp_pkt_time = 0;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2368
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2369
	xp = pwrk->xp;
12462
6a2cdc3dccf5 6952363 pmcs_flush_nonio_cmds() flushes entire HBA rather than single target
Jesse Butler <jesse.butler@oracle.com>
parents: 12385
diff changeset
  2370
	ASSERT(xp != NULL);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2371
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2372
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2373
	 * First, see if this is just a plain read/write command.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2374
	 * If not, we have to queue it up for processing, block
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2375
	 * any additional commands from coming in, and wake up
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2376
	 * the thread that will process this command.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2377
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2378
	cdb_base = pkt->pkt_cdbp[0] & 0x1f;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2379
	if (cdb_base != SCMD_READ && cdb_base != SCMD_WRITE) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2380
		pmcs_prt(pwp, PMCS_PRT_DEBUG1, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2381
		    "%s: special SATA cmd %p", __func__, (void *)sp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2382
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2383
		ASSERT(xp->phy != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2384
		pmcs_pwork(pwp, pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2385
		pmcs_lock_phy(xp->phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2386
		mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2387
		xp->special_needed = 1; /* Set the special_needed flag */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2388
		STAILQ_INSERT_TAIL(&xp->sq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2389
		if (pmcs_run_sata_special(pwp, xp)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2390
			SCHEDULE_WORK(pwp, PMCS_WORK_SATA_RUN);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2391
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2392
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2393
		pmcs_unlock_phy(xp->phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2394
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2395
		return (PMCS_WQ_RUN_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2396
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2397
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2398
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL, "%s: regular cmd", __func__);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2399
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2400
	mutex_enter(&xp->statlock);
10755
4e696bc2e825 6888439 cable pull under heavy IOPS results panics in pmcs_SAS_done()
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 10696
diff changeset
  2401
	if (!xp->assigned) {
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2402
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2403
		return (PMCS_WQ_RUN_FAIL_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2404
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2405
	if (xp->special_running || xp->special_needed || xp->recover_wait) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2406
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2407
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2408
		STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2409
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2410
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2411
		 * By the time we get here the special
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2412
		 * commands running or waiting to be run
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2413
		 * may have come and gone, so kick our
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2414
		 * worker to run the waiting queues
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2415
		 * just in case.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2416
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2417
		SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2418
		return (PMCS_WQ_RUN_FAIL_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2419
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2420
	lba = xp->capacity;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2421
	mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2422
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2423
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2424
	 * Extract data length and lba parameters out of the command. The
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2425
	 * function pmcs_SATA_rwparm returns a non-zero ASC value if the CDB
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2426
	 * values are considered illegal.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2427
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2428
	asc = pmcs_SATA_rwparm(pkt->pkt_cdbp, &nblk, &lba, lba);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2429
	if (asc) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2430
		uint8_t sns[18];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2431
		bzero(sns, sizeof (sns));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2432
		sns[0] = 0xf0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2433
		sns[2] = 0x5;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2434
		sns[12] = asc;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2435
		pmcs_latch_status(pwp, sp, STATUS_CHECK, sns, sizeof (sns),
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2436
		    pwrk->phy->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2437
		pmcs_pwork(pwp, pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2438
		mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2439
		STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2440
		PMCS_CQ_RUN_LOCKED(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2441
		mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2442
		return (PMCS_WQ_RUN_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2443
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2444
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2445
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2446
	 * If the command decodes as not moving any data, complete it here.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2447
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2448
	amt = nblk;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2449
	amt <<= 9;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2450
	amt = pmcs_set_resid(pkt, amt, nblk << 9);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2451
	if (amt == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2452
		pmcs_latch_status(pwp, sp, STATUS_GOOD, NULL, 0,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2453
		    pwrk->phy->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2454
		pmcs_pwork(pwp, pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2455
		mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2456
		STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2457
		PMCS_CQ_RUN_LOCKED(pwp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2458
		mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2459
		return (PMCS_WQ_RUN_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2460
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2461
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2462
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2463
	 * Get an inbound queue entry for this I/O
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2464
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2465
	GET_IO_IQ_ENTRY(pwp, ptr, xp->phy->device_id, iq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2466
	if (ptr == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2467
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2468
		 * This is a temporary failure not likely to unblocked by
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2469
		 * commands completing as the test for scheduling the
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2470
		 * restart of work is a per-device test.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2471
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2472
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2473
		STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2474
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2475
		pmcs_dma_unload(pwp, sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2476
		SCHEDULE_WORK(pwp, PMCS_WORK_RUN_QUEUES);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2477
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2478
		    "%s: Failed to get IO IQ entry for tgt %d",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2479
		    __func__, xp->target_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2480
		return (PMCS_WQ_RUN_FAIL_RES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2481
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2482
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2483
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2484
	 * Get a tag.  At this point, hold statlock until the tagmap is
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2485
	 * updated (just prior to sending the cmd to the hardware).
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2486
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2487
	mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2488
	for (tag = 0; tag < xp->qdepth; tag++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2489
		if ((xp->tagmap & (1 << tag)) == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2490
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2491
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2492
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2493
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2494
	if (tag == xp->qdepth) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2495
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2496
		mutex_exit(&pwp->iqp_lock[iq]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2497
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2498
		STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2499
		mutex_exit(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2500
		return (PMCS_WQ_RUN_FAIL_OTHER);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2501
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2502
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2503
	sp->cmd_satltag = (uint8_t)tag;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2504
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2505
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2506
	 * Set up the command
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2507
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2508
	bzero(fis, sizeof (fis));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2509
	ptr[0] =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2510
	    LE_32(PMCS_IOMB_IN_SAS(PMCS_OQ_IODONE, PMCIN_SATA_HOST_IO_START));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2511
	ptr[1] = LE_32(pwrk->htag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2512
	ptr[2] = LE_32(pwrk->phy->device_id);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2513
	ptr[3] = LE_32(amt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2514
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2515
	if (xp->ncq) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2516
		mtype = SATA_PROTOCOL_FPDMA | (tag << 16);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2517
		fis[0] = ((nblk & 0xff) << 24) | (C_BIT << 8) | FIS_REG_H2DEV;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2518
		if (cdb_base == SCMD_READ) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2519
			fis[0] |= (READ_FPDMA_QUEUED << 16);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2520
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2521
			fis[0] |= (WRITE_FPDMA_QUEUED << 16);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2522
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2523
		fis[1] = (FEATURE_LBA << 24) | (lba & 0xffffff);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2524
		fis[2] = ((nblk & 0xff00) << 16) | ((lba >> 24) & 0xffffff);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2525
		fis[3] = tag << 3;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2526
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2527
		int op;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2528
		fis[0] = (C_BIT << 8) | FIS_REG_H2DEV;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2529
		if (xp->pio) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2530
			mtype = SATA_PROTOCOL_PIO;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2531
			if (cdb_base == SCMD_READ) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2532
				op = READ_SECTORS_EXT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2533
			} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2534
				op = WRITE_SECTORS_EXT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2535
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2536
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2537
			mtype = SATA_PROTOCOL_DMA;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2538
			if (cdb_base == SCMD_READ) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2539
				op = READ_DMA_EXT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2540
			} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2541
				op = WRITE_DMA_EXT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2542
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2543
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2544
		fis[0] |= (op << 16);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2545
		fis[1] = (FEATURE_LBA << 24) | (lba & 0xffffff);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2546
		fis[2] = (lba >> 24) & 0xffffff;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2547
		fis[3] = nblk;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2548
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2549
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2550
	if (cdb_base == SCMD_READ) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2551
		ptr[4] = LE_32(mtype | PMCIN_DATADIR_2_INI);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2552
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2553
		ptr[4] = LE_32(mtype | PMCIN_DATADIR_2_DEV);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2554
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2555
#ifdef	DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2556
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2557
	 * Generate a PMCOUT_STATUS_XFER_CMD_FRAME_ISSUED
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2558
	 * event when this goes out on the wire.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2559
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2560
	ptr[4] |= PMCIN_MESSAGE_REPORT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2561
#endif
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2562
	for (i = 0; i < (sizeof (fis_t))/(sizeof (uint32_t)); i++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2563
		ptr[i+5] = LE_32(fis[i]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2564
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2565
	if (pmcs_dma_load(pwp, sp, ptr)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2566
		mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2567
		mutex_exit(&pwp->iqp_lock[iq]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2568
		mutex_enter(&xp->wqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2569
		STAILQ_INSERT_HEAD(&xp->wq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2570
		mutex_exit(&xp->wqlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2571
		pmcs_prt(pwp, PMCS_PRT_DEBUG, NULL, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2572
		    "%s: Failed to dma_load for tgt %d",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2573
		    __func__, xp->target_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2574
		return (PMCS_WQ_RUN_FAIL_RES);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2575
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2576
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2577
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2578
	pwrk->state = PMCS_WORK_STATE_ONCHIP;
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2579
	lhtag = pwrk->htag;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2580
	mutex_exit(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2581
	xp->tagmap |= (1 << tag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2582
	xp->actv_cnt++;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2583
	if (xp->actv_cnt > xp->maxdepth) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2584
		xp->maxdepth = xp->actv_cnt;
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2585
		pmcs_prt(pwp, PMCS_PRT_DEBUG2, pwrk->phy, xp,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2586
		    "%s: max depth now %u", pwrk->phy->path, xp->maxdepth);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2587
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2588
	mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2589
	mutex_enter(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2590
	STAILQ_INSERT_TAIL(&xp->aq, sp, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2591
	mutex_exit(&xp->aqlock);
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2592
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2593
	    "%s: giving pkt %p to hardware", __func__, (void *)pkt);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2594
#ifdef DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2595
	pmcs_print_entry(pwp, PMCS_PRT_DEBUG3, "SATA INI Message", ptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2596
#endif
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2597
	sp_pkt_time = CMD2PKT(sp)->pkt_time;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2598
	INC_IQ_ENTRY(pwp, iq);
13000
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  2599
	mutex_enter(&pwrk->lock);
13017
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2600
	if (lhtag == pwrk->htag) {
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2601
		pwrk->timer = US2WT(sp_pkt_time * 1000000);
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2602
		if (pwrk->timer == 0) {
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2603
			pwrk->timer = US2WT(1000000);
f651e899cbc9 6974282 pkt can get completed before timer gets set
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 13000
diff changeset
  2604
		}
13000
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  2605
	}
28d31e0a7784 6972351 assertion failed: wp != NULL, file: pmcs_scsa.c
Srikanth Suravajhala <srikanth.suravajhala@oracle.com>
parents: 12989
diff changeset
  2606
	mutex_exit(&pwrk->lock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2607
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2608
	return (PMCS_WQ_RUN_SUCCESS);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2609
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2610
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2611
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2612
 * Complete a SATA command.  Called with pwrk lock held.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2613
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2614
void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2615
pmcs_SATA_done(pmcs_hw_t *pwp, pmcwork_t *pwrk, uint32_t *msg)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2616
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2617
	pmcs_cmd_t *sp = pwrk->arg;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2618
	struct scsi_pkt *pkt = CMD2PKT(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2619
	pmcs_phy_t *pptr = pwrk->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2620
	int dead;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2621
	uint32_t sts;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2622
	pmcs_xscsi_t *xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2623
	boolean_t aborted = B_FALSE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2624
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2625
	xp = pwrk->xp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2626
	ASSERT(xp != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2627
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2628
	DTRACE_PROBE4(pmcs__io__done, uint64_t, pkt->pkt_dma_len, int,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2629
	    (pkt->pkt_dma_flags & DDI_DMA_READ) != 0, hrtime_t, pwrk->start,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2630
	    hrtime_t, gethrtime());
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2631
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2632
	dead = pwrk->dead;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2633
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2634
	if (msg) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2635
		sts = LE_32(msg[2]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2636
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2637
		sts = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2638
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2639
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2640
	if (dead != 0) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2641
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp, "%s: dead cmd tag "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2642
		    "0x%x for %s", __func__, pwrk->htag, pptr->path);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2643
		goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2644
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2645
	if ((pwrk->state == PMCS_WORK_STATE_TIMED_OUT) &&
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2646
	    (sts != PMCOUT_STATUS_ABORTED)) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2647
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2648
		    "%s: cmd 0x%p (tag 0x%x) timed out for %s",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2649
		    __func__, (void *)sp, pwrk->htag, pptr->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2650
		CMD2PKT(sp)->pkt_scbp[0] = STATUS_GOOD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2651
		/* pkt_reason already set to CMD_TIMEOUT */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2652
		ASSERT(CMD2PKT(sp)->pkt_reason == CMD_TIMEOUT);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2653
		CMD2PKT(sp)->pkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2654
		    STATE_SENT_CMD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2655
		CMD2PKT(sp)->pkt_statistics |= STAT_TIMEOUT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2656
		goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2657
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2658
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2659
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, pptr, xp, "%s: pkt %p tgt %u done",
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2660
	    __func__, (void *)pkt, xp->target_num);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2661
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2662
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2663
	 * If the status isn't okay but not underflow,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2664
	 * step to the side and parse the (possible) error.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2665
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2666
#ifdef DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2667
	if (msg) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2668
		pmcs_print_entry(pwp, PMCS_PRT_DEBUG3, "Outbound Message", msg);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2669
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2670
#endif
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2671
	if (!msg) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2672
		goto out;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2673
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2674
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2675
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2676
	 * If the status isn't okay or we got a FIS response of some kind,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2677
	 * step to the side and parse the (possible) error.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2678
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2679
	if ((sts != PMCOUT_STATUS_OK) || (LE_32(msg[3]) != 0)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2680
		if (sts == PMCOUT_STATUS_IO_DS_NON_OPERATIONAL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2681
			mutex_exit(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2682
			pmcs_lock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2683
			mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2684
			if ((xp->resetting == 0) && (xp->reset_success != 0) &&
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2685
			    (xp->reset_wait == 0)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2686
				mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2687
				if (pmcs_reset_phy(pwp, pptr,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2688
				    PMCS_PHYOP_LINK_RESET) != 0) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2689
					pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2690
					    "%s: PHY (%s) Local Control/Link "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2691
					    "Reset FAILED as part of error "
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2692
					    "recovery", __func__, pptr->path);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2693
				}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2694
				mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2695
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2696
			mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2697
			pmcs_unlock_phy(pptr);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2698
			mutex_enter(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2699
		}
12060
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
  2700
		pmcs_ioerror(pwp, SATA, pwrk, msg, sts);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2701
	} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2702
		pmcs_latch_status(pwp, sp, STATUS_GOOD, NULL, 0,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2703
		    pwrk->phy->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2704
		pkt->pkt_state |= STATE_XFERRED_DATA;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2705
		pkt->pkt_resid = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2706
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2707
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2708
	pmcs_prt(pwp, PMCS_PRT_DEBUG2, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2709
	    "%s: pkt %p tgt %u done reason=%x state=%x resid=%ld status=%x",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2710
	    __func__, (void *)pkt, xp->target_num, pkt->pkt_reason,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2711
	    pkt->pkt_state, pkt->pkt_resid, pkt->pkt_scbp[0]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2712
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2713
	if (pwrk->state == PMCS_WORK_STATE_ABORTED) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2714
		pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2715
		    "%s: scsi_pkt 0x%p aborted for PHY %s; work = 0x%p",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2716
		    __func__, (void *)pkt, pptr->path, (void *)pwrk);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2717
		aborted = B_TRUE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2718
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2719
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2720
out:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2721
	pmcs_dma_unload(pwp, sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2722
	mutex_enter(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2723
	xp->tagmap &= ~(1 << sp->cmd_satltag);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2724
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2725
	/*
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2726
	 * If the device no longer has a PHY pointer, clear the PHY pointer
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2727
	 * from the work structure before we free it.  Otherwise, pmcs_pwork
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2728
	 * may decrement the ref_count on a PHY that's been freed.
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2729
	 */
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2730
	if (xp->phy == NULL) {
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2731
		pwrk->phy = NULL;
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2732
	}
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2733
12506
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2734
	/*
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2735
	 * We may arrive here due to a command timing out, which in turn
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2736
	 * could be addressed in a different context.  So, free the work
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2737
	 * back, but only after confirming it's not already been freed
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2738
	 * elsewhere.
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2739
	 */
12539
4762b6239106 6957598 fix for 6952400 needs fixing
Jesse Butler <jesse.butler@oracle.com>
parents: 12506
diff changeset
  2740
	if (pwrk->htag != PMCS_TAG_FREE) {
12506
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2741
		pmcs_pwork(pwp, pwrk);
ead0f74ea9df 6955322 Anago: i/o from FC client failed on LCC pull; appliance kit failed
Jesse Butler <jesse.butler@oracle.com>
parents: 12462
diff changeset
  2742
	}
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2743
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2744
	if (xp->dev_gone) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2745
		mutex_exit(&xp->statlock);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2746
		if (!dead) {
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2747
			mutex_enter(&xp->aqlock);
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2748
			STAILQ_REMOVE(&xp->aq, sp, pmcs_cmd, cmd_next);
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2749
			mutex_exit(&xp->aqlock);
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  2750
			pmcs_prt(pwp, PMCS_PRT_DEBUG3, pptr, xp,
11635
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2751
			    "%s: Removing cmd 0x%p (htag 0x%x) from aq",
2d03b93bcbc0 6922016 kernel heap corruption detected
Srikanth, Ramana <Ramana.Srikanth@Sun.COM>
parents: 11601
diff changeset
  2752
			    __func__, (void *)sp, sp->cmd_tag);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2753
			mutex_enter(&pwp->cq_lock);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2754
			STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  2755
			PMCS_CQ_RUN_LOCKED(pwp);
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2756
			mutex_exit(&pwp->cq_lock);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2757
			pmcs_prt(pwp, PMCS_PRT_DEBUG2, pptr, xp,
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2758
			    "%s: Completing command for dead target 0x%p",
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2759
			    __func__, (void *)xp);
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2760
		}
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2761
		return;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2762
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2763
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2764
	ASSERT(xp->actv_cnt > 0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2765
	if (--(xp->actv_cnt) == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2766
		if (xp->draining) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2767
			pmcs_prt(pwp, PMCS_PRT_DEBUG1, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2768
			    "%s: waking up drain waiters", __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2769
			cv_signal(&pwp->drain_cv);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2770
		} else if (xp->special_needed) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2771
			SCHEDULE_WORK(pwp, PMCS_WORK_SATA_RUN);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2772
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2773
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2774
	mutex_exit(&xp->statlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2775
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2776
	/*
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2777
	 * If the status is other than OK, determine if it's something that
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2778
	 * is worth re-attempting enumeration.  If so, mark the PHY.
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2779
	 */
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2780
	if (sts != PMCOUT_STATUS_OK) {
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2781
		pmcs_status_disposition(pptr, sts);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2782
	}
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  2783
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2784
	if (dead == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2785
#ifdef	DEBUG
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2786
		pmcs_cmd_t *wp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2787
		mutex_enter(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2788
		STAILQ_FOREACH(wp, &xp->aq, cmd_next) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2789
			if (wp == sp) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2790
				break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2791
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2792
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2793
		ASSERT(wp != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2794
#else
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2795
		mutex_enter(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2796
#endif
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2797
		STAILQ_REMOVE(&xp->aq, sp, pmcs_cmd, cmd_next);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2798
		if (aborted) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2799
			pmcs_prt(pwp, PMCS_PRT_DEBUG, pptr, xp,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2800
			    "%s: Aborted cmd for tgt 0x%p, signaling waiters",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2801
			    __func__, (void *)xp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2802
			cv_signal(&xp->abort_cv);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2803
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2804
		mutex_exit(&xp->aqlock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2805
		mutex_enter(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2806
		STAILQ_INSERT_TAIL(&pwp->cq, sp, cmd_next);
12343
5bb62d0941dc 6938818 SAS LZ latency increases dramatically after 30 minutes
David Hollister <david.hollister@oracle.com>
parents: 12258
diff changeset
  2807
		PMCS_CQ_RUN_LOCKED(pwp);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2808
		mutex_exit(&pwp->cq_lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2809
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2810
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2811
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2812
static uint8_t
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2813
pmcs_SATA_rwparm(uint8_t *cdb, uint32_t *xfr, uint64_t *lba, uint64_t lbamax)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2814
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2815
	uint8_t asc = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2816
	switch (cdb[0]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2817
	case SCMD_READ_G5:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2818
	case SCMD_WRITE_G5:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2819
		*xfr =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2820
		    (((uint32_t)cdb[10]) <<  24) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2821
		    (((uint32_t)cdb[11]) <<  16) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2822
		    (((uint32_t)cdb[12]) <<   8) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2823
		    ((uint32_t)cdb[13]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2824
		*lba =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2825
		    (((uint64_t)cdb[2]) << 56) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2826
		    (((uint64_t)cdb[3]) << 48) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2827
		    (((uint64_t)cdb[4]) << 40) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2828
		    (((uint64_t)cdb[5]) << 32) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2829
		    (((uint64_t)cdb[6]) << 24) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2830
		    (((uint64_t)cdb[7]) << 16) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2831
		    (((uint64_t)cdb[8]) <<  8) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2832
		    ((uint64_t)cdb[9]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2833
		/* Check for illegal bits */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2834
		if (cdb[15]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2835
			asc = 0x24;	/* invalid field in cdb */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2836
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2837
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2838
	case SCMD_READ_G4:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2839
	case SCMD_WRITE_G4:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2840
		*xfr =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2841
		    (((uint32_t)cdb[6]) <<  16) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2842
		    (((uint32_t)cdb[7]) <<   8) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2843
		    ((uint32_t)cdb[8]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2844
		*lba =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2845
		    (((uint32_t)cdb[2]) << 24) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2846
		    (((uint32_t)cdb[3]) << 16) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2847
		    (((uint32_t)cdb[4]) <<  8) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2848
		    ((uint32_t)cdb[5]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2849
		/* Check for illegal bits */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2850
		if (cdb[11]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2851
			asc = 0x24;	/* invalid field in cdb */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2852
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2853
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2854
	case SCMD_READ_G1:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2855
	case SCMD_WRITE_G1:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2856
		*xfr = (((uint32_t)cdb[7]) <<  8) | ((uint32_t)cdb[8]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2857
		*lba =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2858
		    (((uint32_t)cdb[2]) << 24) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2859
		    (((uint32_t)cdb[3]) << 16) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2860
		    (((uint32_t)cdb[4]) <<  8) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2861
		    ((uint32_t)cdb[5]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2862
		/* Check for illegal bits */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2863
		if (cdb[9]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2864
			asc = 0x24;	/* invalid field in cdb */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2865
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2866
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2867
	case SCMD_READ:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2868
	case SCMD_WRITE:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2869
		*xfr = cdb[4];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2870
		if (*xfr == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2871
			*xfr = 256;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2872
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2873
		*lba =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2874
		    (((uint32_t)cdb[1] & 0x1f) << 16) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2875
		    (((uint32_t)cdb[2]) << 8) |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2876
		    ((uint32_t)cdb[3]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2877
		/* Check for illegal bits */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2878
		if (cdb[5]) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2879
			asc = 0x24;	/* invalid field in cdb */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2880
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2881
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2882
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2883
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2884
	if (asc == 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2885
		if ((*lba + *xfr) > lbamax) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2886
			asc = 0x21;	/* logical block out of range */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2887
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2888
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2889
	return (asc);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2890
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2891
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2892
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2893
 * Called with pwrk lock held.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2894
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2895
static void
12060
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
  2896
pmcs_ioerror(pmcs_hw_t *pwp, pmcs_dtype_t t, pmcwork_t *pwrk, uint32_t *w,
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
  2897
    uint32_t status)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2898
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2899
	static uint8_t por[] = {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2900
	    0xf0, 0x0, 0x6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x28
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2901
	};
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2902
	static uint8_t parity[] = {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2903
	    0xf0, 0x0, 0xb, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x47, 5
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2904
	};
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2905
	const char *msg;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2906
	char buf[20];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2907
	pmcs_cmd_t *sp = pwrk->arg;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2908
	pmcs_phy_t *phyp = pwrk->phy;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2909
	struct scsi_pkt *pkt = CMD2PKT(sp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2910
	uint32_t resid;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2911
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2912
	ASSERT(w != NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2913
	resid = LE_32(w[3]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2914
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2915
	msg = pmcs_status_str(status);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2916
	if (msg == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2917
		(void) snprintf(buf, sizeof (buf), "Error 0x%x", status);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2918
		msg = buf;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2919
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2920
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2921
	if (status != PMCOUT_STATUS_OK) {
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  2922
		pmcs_prt(pwp, PMCS_PRT_DEBUG1, phyp, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2923
		    "%s: device %s tag 0x%x status %s @ %llu", __func__,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2924
		    phyp->path, pwrk->htag, msg,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2925
		    (unsigned long long)gethrtime());
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2926
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2927
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2928
	pkt->pkt_reason = CMD_CMPLT;		/* default reason */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2929
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2930
	switch (status) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2931
	case PMCOUT_STATUS_OK:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2932
		if (t == SATA) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2933
			int i;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2934
			fis_t fis;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2935
			for (i = 0; i < sizeof (fis) / sizeof (fis[0]); i++) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2936
				fis[i] = LE_32(w[4+i]);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2937
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2938
			if ((fis[0] & 0xff) != FIS_REG_D2H) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2939
				pmcs_prt(pwp, PMCS_PRT_DEBUG, phyp, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2940
				    "unexpected fis code 0x%x", fis[0] & 0xff);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2941
			} else {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2942
				pmcs_prt(pwp, PMCS_PRT_DEBUG, phyp, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  2943
				    "FIS ERROR");
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2944
				pmcs_fis_dump(pwp, fis);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2945
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2946
			pkt->pkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2947
			break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2948
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2949
		pmcs_latch_status(pwp, sp, STATUS_GOOD, NULL, 0, phyp->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2950
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2951
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2952
	case PMCOUT_STATUS_ABORTED:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2953
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2954
		 * Command successfully aborted.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2955
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2956
		if (phyp->dead) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2957
			pkt->pkt_reason = CMD_DEV_GONE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2958
			pkt->pkt_state = STATE_GOT_BUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2959
		} else if (pwrk->ssp_event != 0) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2960
			pkt->pkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2961
			pkt->pkt_state = STATE_GOT_BUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2962
		} else if (pwrk->state == PMCS_WORK_STATE_TIMED_OUT) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2963
			pkt->pkt_reason = CMD_TIMEOUT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2964
			pkt->pkt_statistics |= STAT_TIMEOUT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2965
			pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2966
			    STATE_SENT_CMD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2967
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2968
			pkt->pkt_reason = CMD_ABORTED;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2969
			pkt->pkt_statistics |= STAT_ABORTED;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2970
			pkt->pkt_state = STATE_GOT_BUS | STATE_GOT_TARGET |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2971
			    STATE_SENT_CMD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2972
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2973
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2974
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2975
		 * PMCS_WORK_STATE_TIMED_OUT doesn't need to be preserved past
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2976
		 * this point, so go ahead and mark it as aborted.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2977
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2978
		pwrk->state = PMCS_WORK_STATE_ABORTED;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2979
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2980
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2981
	case PMCOUT_STATUS_UNDERFLOW:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2982
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2983
		 * This will only get called for SATA
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2984
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2985
		pkt->pkt_resid = resid;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2986
		if (pkt->pkt_dma_len < pkt->pkt_resid) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2987
			(void) pmcs_set_resid(pkt, pkt->pkt_dma_len, resid);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2988
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2989
		pmcs_latch_status(pwp, sp, STATUS_GOOD, NULL, 0, phyp->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2990
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2991
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2992
	case PMCOUT_STATUS_NO_DEVICE:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2993
	case PMCOUT_STATUS_XFER_ERROR_SATA_LINK_TIMEOUT:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2994
		pkt->pkt_reason = CMD_DEV_GONE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2995
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2996
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2997
	case PMCOUT_STATUS_OPEN_CNX_ERROR_WRONG_DESTINATION:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2998
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  2999
		 * Need to do rediscovery. We probably have
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3000
		 * the wrong device (disk swap), so kill
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3001
		 * this one.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3002
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3003
	case PMCOUT_STATUS_OPEN_CNX_PROTOCOL_NOT_SUPPORTED:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3004
	case PMCOUT_STATUS_OPEN_CNX_ERROR_ZONE_VIOLATION:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3005
	case PMCOUT_STATUS_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
11601
5a8b35d191ab 6915456 pmcs should implement tgtmap activate/deactivate callbacks
David Hollister <David.Hollister@Sun.COM>
parents: 11556
diff changeset
  3006
	case PMCOUT_STATUS_OPEN_CNX_ERROR_UNKNOWN_ERROR:
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3007
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3008
		 * Need to do rediscovery.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3009
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3010
		if (!phyp->dead) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3011
			mutex_exit(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3012
			pmcs_lock_phy(pwrk->phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3013
			pmcs_kill_changed(pwp, pwrk->phy, 0);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3014
			pmcs_unlock_phy(pwrk->phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3015
			mutex_enter(&pwrk->lock);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3016
			pkt->pkt_reason = CMD_INCOMPLETE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3017
			pkt->pkt_state = STATE_GOT_BUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3018
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3019
			pkt->pkt_reason = CMD_DEV_GONE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3020
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3021
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3022
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3023
	case PMCOUT_STATUS_OPEN_CNX_ERROR_BREAK:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3024
	case PMCOUT_STATUS_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3025
	case PMCOUT_STATUS_OPENCNX_ERROR_BAD_DESTINATION:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3026
	case PMCOUT_STATUS_IO_XFER_ERROR_NAK_RECEIVED:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3027
		/* cmd is pending on the target */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3028
	case PMCOUT_STATUS_XFER_ERROR_OFFSET_MISMATCH:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3029
	case PMCOUT_STATUS_XFER_ERROR_REJECTED_NCQ_MODE:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3030
		/* transitory - commands sent while in NCQ failure mode */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3031
	case PMCOUT_STATUS_XFER_ERROR_ABORTED_NCQ_MODE:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3032
		/* NCQ failure */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3033
	case PMCOUT_STATUS_IO_PORT_IN_RESET:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3034
	case PMCOUT_STATUS_XFER_ERR_BREAK:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3035
	case PMCOUT_STATUS_XFER_ERR_PHY_NOT_READY:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3036
		pkt->pkt_reason = CMD_INCOMPLETE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3037
		pkt->pkt_state = STATE_GOT_BUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3038
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3039
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3040
	case PMCOUT_STATUS_IO_XFER_OPEN_RETRY_TIMEOUT:
12060
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
  3041
		pmcs_prt(pwp, PMCS_PRT_DEBUG, phyp, phyp->target,
9f5bdb2db498 6916341 FW87_ND: panic pmcs:pmcs_validate_vpd+33a
David Hollister <David.Hollister@Sun.COM>
parents: 11847
diff changeset
  3042
		    "STATUS_BUSY for htag 0x%08x", sp->cmd_tag);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3043
		pmcs_latch_status(pwp, sp, STATUS_BUSY, NULL, 0, phyp->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3044
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3045
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3046
	case PMCOUT_STATUS_OPEN_CNX_ERROR_STP_RESOURCES_BUSY:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3047
		/* synthesize a RESERVATION CONFLICT */
11307
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  3048
		pmcs_prt(pwp, PMCS_PRT_DEBUG, phyp, phyp->target,
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  3049
		    "%s: Potential affiliation active on 0x%" PRIx64, __func__,
94401ad61b17 6892438 target-port/attached-port phymask properties for SAS transport FMA
David Hollister <David.Hollister@Sun.COM>
parents: 11267
diff changeset
  3050
		    pmcs_barray2wwn(phyp->sas_address));
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3051
		pmcs_latch_status(pwp, sp, STATUS_RESERVATION_CONFLICT, NULL,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3052
		    0, phyp->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3053
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3054
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3055
	case PMCOUT_STATUS_XFER_ERROR_ABORTED_DUE_TO_SRST:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3056
		/* synthesize a power-on/reset */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3057
		pmcs_latch_status(pwp, sp, STATUS_CHECK, por, sizeof (por),
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3058
		    phyp->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3059
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3060
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3061
	case PMCOUT_STATUS_XFER_ERROR_UNEXPECTED_PHASE:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3062
	case PMCOUT_STATUS_XFER_ERROR_RDY_OVERRUN:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3063
	case PMCOUT_STATUS_XFER_ERROR_RDY_NOT_EXPECTED:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3064
	case PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3065
	case PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NACK:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3066
	case PMCOUT_STATUS_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3067
		/* synthesize a PARITY ERROR */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3068
		pmcs_latch_status(pwp, sp, STATUS_CHECK, parity,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3069
		    sizeof (parity), phyp->path);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3070
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3071
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3072
	case PMCOUT_STATUS_IO_XFER_ERROR_DMA:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3073
	case PMCOUT_STATUS_IO_NOT_VALID:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3074
	case PMCOUT_STATUS_PROG_ERROR:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3075
	case PMCOUT_STATUS_XFER_ERROR_PEER_ABORTED:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3076
	case PMCOUT_STATUS_XFER_ERROR_SATA: /* non-NCQ failure */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3077
	default:
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3078
		pkt->pkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3079
		break;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3080
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3081
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3082
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3083
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3084
 * Latch up SCSI status
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3085
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3086
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3087
void
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3088
pmcs_latch_status(pmcs_hw_t *pwp, pmcs_cmd_t *sp, uint8_t status,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3089
    uint8_t *snsp, size_t snslen, char *path)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3090
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3091
	static const char c1[] =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3092
	    "%s: Status Byte 0x%02x for CDB0=0x%02x (%02x %02x %02x) "
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3093
	    "HTAG 0x%x @ %llu";
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3094
	static const char c2[] =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3095
	    "%s: Status Byte 0x%02x for CDB0=0x%02x HTAG 0x%x @ %llu";
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3096
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3097
	CMD2PKT(sp)->pkt_state |= STATE_GOT_BUS | STATE_GOT_TARGET |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3098
	    STATE_SENT_CMD | STATE_GOT_STATUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3099
	CMD2PKT(sp)->pkt_scbp[0] = status;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3100
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3101
	if (status == STATUS_CHECK && snsp &&
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3102
	    (size_t)SCSA_STSLEN(sp) >= sizeof (struct scsi_arq_status)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3103
		struct scsi_arq_status *aqp =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3104
		    (void *) CMD2PKT(sp)->pkt_scbp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3105
		size_t amt = sizeof (struct scsi_extended_sense);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3106
		uint8_t key = scsi_sense_key(snsp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3107
		uint8_t asc = scsi_sense_asc(snsp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3108
		uint8_t ascq = scsi_sense_ascq(snsp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3109
		if (amt > snslen) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3110
			amt = snslen;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3111
		}
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3112
		pmcs_prt(pwp, PMCS_PRT_DEBUG_SCSI_STATUS, NULL, NULL, c1, path,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3113
		    status, CMD2PKT(sp)->pkt_cdbp[0] & 0xff, key, asc, ascq,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3114
		    sp->cmd_tag, (unsigned long long)gethrtime());
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3115
		CMD2PKT(sp)->pkt_state |= STATE_ARQ_DONE;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3116
		(*(uint8_t *)&aqp->sts_rqpkt_status) = STATUS_GOOD;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3117
		aqp->sts_rqpkt_statistics = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3118
		aqp->sts_rqpkt_reason = CMD_CMPLT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3119
		aqp->sts_rqpkt_state = STATE_GOT_BUS |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3120
		    STATE_GOT_TARGET | STATE_SENT_CMD |
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3121
		    STATE_XFERRED_DATA | STATE_GOT_STATUS;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3122
		(void) memcpy(&aqp->sts_sensedata, snsp, amt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3123
		if (aqp->sts_sensedata.es_class != CLASS_EXTENDED_SENSE) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3124
			aqp->sts_rqpkt_reason = CMD_TRAN_ERR;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3125
			aqp->sts_rqpkt_state = 0;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3126
			aqp->sts_rqpkt_resid =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3127
			    sizeof (struct scsi_extended_sense);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3128
		} else {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3129
			aqp->sts_rqpkt_resid =
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3130
			    sizeof (struct scsi_extended_sense) - amt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3131
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3132
	} else if (status) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3133
		pmcs_prt(pwp, PMCS_PRT_DEBUG_SCSI_STATUS, NULL, NULL, c2,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3134
		    path, status, CMD2PKT(sp)->pkt_cdbp[0] & 0xff,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3135
		    sp->cmd_tag, (unsigned long long)gethrtime());
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3136
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3137
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3138
	CMD2PKT(sp)->pkt_reason = CMD_CMPLT;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3139
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3140
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3141
/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3142
 * Calculate and set packet residual and return the amount
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3143
 * left over after applying various filters.
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3144
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3145
size_t
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3146
pmcs_set_resid(struct scsi_pkt *pkt, size_t amt, uint32_t cdbamt)
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3147
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3148
	pkt->pkt_resid = cdbamt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3149
	if (amt > pkt->pkt_resid) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3150
		amt = pkt->pkt_resid;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3151
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3152
	if (amt > pkt->pkt_dma_len) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3153
		amt = pkt->pkt_dma_len;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3154
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3155
	return (amt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3156
}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3157
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3158
/*
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3159
 * Return the existing target softstate (unlocked) if there is one.  If so,
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3160
 * the PHY is locked and that lock must be freed by the caller after the
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3161
 * target/PHY linkage is established.  If there isn't one, and alloc_tgt is
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3162
 * TRUE, then allocate one.
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3163
 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3164
pmcs_xscsi_t *
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3165
pmcs_get_target(pmcs_iport_t *iport, char *tgt_port, boolean_t alloc_tgt)
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3166
{
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3167
	pmcs_hw_t *pwp = iport->pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3168
	pmcs_phy_t *phyp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3169
	pmcs_xscsi_t *tgt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3170
	uint64_t wwn;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3171
	char unit_address[PMCS_MAX_UA_SIZE];
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3172
	int ua_form = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3173
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3174
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3175
	 * Find the PHY for this target
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3176
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3177
	phyp = pmcs_find_phy_by_sas_address(pwp, iport, NULL, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3178
	if (phyp == NULL) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3179
		pmcs_prt(pwp, PMCS_PRT_DEBUG3, NULL, NULL,
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3180
		    "%s: No PHY for target @ %s", __func__, tgt_port);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3181
		return (NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3182
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3183
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3184
	tgt = ddi_soft_state_bystr_get(iport->tgt_sstate, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3185
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3186
	if (tgt) {
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3187
		mutex_enter(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3188
		/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3189
		 * There's already a target.  Check its PHY pointer to see
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3190
		 * if we need to clear the old linkages
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3191
		 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3192
		if (tgt->phy && (tgt->phy != phyp)) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3193
			pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3194
			    "%s: Target PHY updated from %p to %p", __func__,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3195
			    (void *)tgt->phy, (void *)phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3196
			if (!IS_ROOT_PHY(tgt->phy)) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3197
				pmcs_dec_phy_ref_count(tgt->phy);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3198
				pmcs_inc_phy_ref_count(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3199
			}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3200
			tgt->phy->target = NULL;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3201
		}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3202
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3203
		/*
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3204
		 * If this target has no PHY pointer and alloc_tgt is FALSE,
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3205
		 * that implies we expect the target to already exist.  This
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3206
		 * implies that there has already been a tran_tgt_init on at
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3207
		 * least one LU.
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3208
		 */
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3209
		if ((tgt->phy == NULL) && !alloc_tgt) {
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3210
			pmcs_prt(pwp, PMCS_PRT_DEBUG, phyp, tgt,
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3211
			    "%s: Establish linkage from new PHY to old target @"
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3212
			    "%s", __func__, tgt->unit_address);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3213
			for (int idx = 0; idx < tgt->ref_count; idx++) {
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3214
				pmcs_inc_phy_ref_count(phyp);
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3215
			}
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3216
		}
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3217
12949
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3218
		/*
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3219
		 * Set this target pointer back up, since it's been
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3220
		 * through pmcs_clear_xp().
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3221
		 */
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3222
		tgt->dev_gone = 0;
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3223
		tgt->assigned = 1;
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3224
		tgt->dtype = phyp->dtype;
dd7214c03e0d 6968895 only one path seen on JBOD after SAS cable pull/reinsert
Jesse Butler <jesse.butler@oracle.com>
parents: 12874
diff changeset
  3225
		tgt->dev_state = PMCS_DEVICE_STATE_OPERATIONAL;
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3226
		tgt->phy = phyp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3227
		phyp->target = tgt;
11847
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3228
533fb074e3b8 6930117 LCC Hotplug can cause lost targets and a system hang
David Hollister <David.Hollister@Sun.COM>
parents: 11693
diff changeset
  3229
		mutex_exit(&tgt->statlock);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3230
		return (tgt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3231
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3232
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3233
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3234
	 * Make sure the PHY we found is on the correct iport
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3235
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3236
	if (phyp->iport != iport) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3237
		pmcs_prt(pwp, PMCS_PRT_DEBUG, phyp, NULL,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3238
		    "%s: No target at %s on this iport", __func__, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3239
		pmcs_unlock_phy(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3240
		return (NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3241
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3242
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3243
	/*
11692
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3244
	 * If this was just a lookup (i.e. alloc_tgt is false), return now.
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3245
	 */
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3246
	if (alloc_tgt == B_FALSE) {
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3247
		pmcs_unlock_phy(phyp);
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3248
		return (NULL);
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3249
	}
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3250
8795ed2df6db 6898573 Watch dog support for PMCS
Jesse Butler <Jesse.Butler@Sun.COM>
parents: 11635
diff changeset
  3251
	/*
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3252
	 * Allocate the new softstate
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3253
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3254
	wwn = pmcs_barray2wwn(phyp->sas_address);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3255
	(void) scsi_wwn_to_wwnstr(wwn, ua_form, unit_address);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3256
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3257
	if (ddi_soft_state_bystr_zalloc(iport->tgt_sstate, unit_address) !=
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3258
	    DDI_SUCCESS) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3259
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3260
		    "%s: Couldn't alloc softstate for device at %s",
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3261
		    __func__, unit_address);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3262
		pmcs_unlock_phy(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3263
		return (NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3264
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3265
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3266
	tgt = ddi_soft_state_bystr_get(iport->tgt_sstate, unit_address);
11693
0a223da9570a 6926075 hotplug operations on LCC cause lost of expanders
David Hollister <David.Hollister@Sun.COM>
parents: 11692
diff changeset
  3267
	ASSERT(tgt != NULL);
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3268
	STAILQ_INIT(&tgt->wq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3269
	STAILQ_INIT(&tgt->aq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3270
	STAILQ_INIT(&tgt->sq);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3271
	mutex_init(&tgt->statlock, NULL, MUTEX_DRIVER,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3272
	    DDI_INTR_PRI(pwp->intr_pri));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3273
	mutex_init(&tgt->wqlock, NULL, MUTEX_DRIVER,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3274
	    DDI_INTR_PRI(pwp->intr_pri));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3275
	mutex_init(&tgt->aqlock, NULL, MUTEX_DRIVER,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3276
	    DDI_INTR_PRI(pwp->intr_pri));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3277
	cv_init(&tgt->reset_cv, NULL, CV_DRIVER, NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3278
	cv_init(&tgt->abort_cv, NULL, CV_DRIVER, NULL);
11501
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  3279
	list_create(&tgt->lun_list, sizeof (pmcs_lun_t),
645ae1441739 6906811 assertion failed: pptr->children == NULL
David Hollister <David.Hollister@Sun.COM>
parents: 11442
diff changeset
  3280
	    offsetof(pmcs_lun_t, lun_list_next));
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3281
	tgt->qdepth = 1;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3282
	tgt->target_num = PMCS_INVALID_TARGET_NUM;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3283
	bcopy(unit_address, tgt->unit_address, PMCS_MAX_UA_SIZE);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3284
	tgt->pwp = pwp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3285
	tgt->ua = strdup(iport->ua);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3286
	tgt->phy = phyp;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3287
	ASSERT((phyp->target == NULL) || (phyp->target == tgt));
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3288
	if (phyp->target == NULL) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3289
		phyp->target = tgt;
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3290
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3291
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3292
	/*
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3293
	 * Don't allocate LUN softstate for SMP targets
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3294
	 */
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3295
	if (phyp->dtype == EXPANDER) {
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3296
		return (tgt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3297
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3298
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3299
	if (ddi_soft_state_bystr_init(&tgt->lun_sstate,
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3300
	    sizeof (pmcs_lun_t), PMCS_LUN_SSTATE_SZ) != 0) {
11048
6da57c1c6564 6895343 pmcs logging enhancements - part 1/2
dh142964 <David.Hollister@Sun.COM>
parents: 10901
diff changeset
  3301
		pmcs_prt(pwp, PMCS_PRT_DEBUG_CONFIG, phyp, tgt,
10696
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3302
		    "%s: LUN soft_state_bystr_init failed", __func__);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3303
		ddi_soft_state_bystr_free(iport->tgt_sstate, tgt_port);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3304
		pmcs_unlock_phy(phyp);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3305
		return (NULL);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3306
	}
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3307
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3308
	return (tgt);
cd0f390dd9e2 PSARC 2008/672 thebe SAS/SATA driver
dh142964 <David.Hollister@Sun.COM>
parents:
diff changeset
  3309
}