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-- |
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 |
} |