scsi_vhci_tpgs.c revision d91393a8e4d666dd6b6588c980c59cec667835f4
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/conf.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/file.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/ddi.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/sunddi.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/scsi/scsi.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/scsi/adapters/scsi_vhci.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/scsi/adapters/scsi_vhci_tpgs.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * External function definitions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void vhci_mpapi_update_tpg_data(struct scsi_address *, char *);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic int vhci_tpgs_inquiry(struct scsi_address *ap, struct buf *bp,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int *mode);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic int vhci_tpgs_page83(struct scsi_address *ap, struct buf *bp,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int *rel_tgt_port, int *tgt_port, int *lu);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic void print_buf(char *buf, int buf_size);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic int vhci_tpgs_report_target_groups(struct scsi_address *ap,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct buf *bp, int rel_tgt_port, int tgt_port, int *pstate,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int *preferred);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvhci_tpgs_set_target_groups(struct scsi_address *ap, int set_state,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int tpg_id)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_pkt *pkt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct buf *bp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int len, rval, ss = SCSI_SENSE_UNKNOWN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis char *bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_extended_sense *sns;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis len = 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp = getrbuf(KM_NOSLEEP);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (bp == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL, "!vhci_tpgs_set_target_groups: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " failed getrbuf"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bufp = kmem_zalloc(len, KM_NOSLEEP);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (bufp == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL, "!vhci_tpgs_set_target_groups: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "request packet allocation for %d failed....", len));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis freerbuf(bp);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_un.b_addr = bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_flags = B_READ;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_bcount = len;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_resid = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bufp[4] = (0x0f & set_state);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bufp[6] = (0xff00 & tpg_id) >> 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bufp[7] = (0x00ff & tpg_id);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt = scsi_init_pkt(ap, NULL, bp, CDB_GROUP5,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sizeof (struct scsi_arq_status), 0, 0, NULL, NULL);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (pkt == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_set_target_groups: scsi_init_pkt error\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis freerbuf(bp);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Sends 1 TPG descriptor only. Hence Parameter list length pkt_cdbp[9]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * is set to 8 bytes - Refer SPC3 for details.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[0] = SCMD_MAINTENANCE_OUT;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[1] = SSVC_ACTION_SET_TARGET_PORT_GROUPS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[9] = 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_time = 90;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_set_target_groups: sending set target port group:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " cdb[0/1/6/7/8/9]: %x/%x/%x/%x/%x/%x\n", pkt->pkt_cdbp[0],
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[1], pkt->pkt_cdbp[6], pkt->pkt_cdbp[7],
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[8], pkt->pkt_cdbp[9]));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef DEBUG
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis print_buf(bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rval = vhci_do_scsi_cmd(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (rval == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_set_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " vhci_do_scsi_cmd failed\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis freerbuf(bp);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (-1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((pkt->pkt_reason == CMD_CMPLT) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (SCBP_C(pkt) == STATUS_CHECK) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (pkt->pkt_state & STATE_ARQ_DONE)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sns = &(((struct scsi_arq_status *)(uintptr_t)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (pkt->pkt_scbp))->sts_sensedata);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((sns->es_key == KEY_UNIT_ATTENTION) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (sns->es_add_code == STD_SCSI_ASC_STATE_CHG) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (sns->es_qual_code == STD_SCSI_ASCQ_STATE_CHG_SUCC)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ss = SCSI_SENSE_STATE_CHANGED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_set_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense:%x, add_code: %x, qual_code:%x"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense:%x\n", sns->es_key, sns->es_add_code,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sns->es_qual_code, ss));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((sns->es_key == KEY_ILLEGAL_REQUEST) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (sns->es_add_code == STD_SCSI_ASC_INVAL_PARAM_LIST)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ss = SCSI_SENSE_NOFAILOVER;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_set_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense:%x, add_code: %x, qual_code:%x"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense:%x\n", sns->es_key, sns->es_add_code,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sns->es_qual_code, ss));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((sns->es_key == KEY_ILLEGAL_REQUEST) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (sns->es_add_code == STD_SCSI_ASC_INVAL_CMD_OPCODE)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ss = SCSI_SENSE_NOFAILOVER;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_set_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense_key:%x, add_code: %x, qual_code:%x"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense:%x\n", sns->es_key, sns->es_add_code,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sns->es_qual_code, rval));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * At this point sns data may be for power-on-reset
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * UNIT ATTN hardware errors, vendor unqiue sense etc.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * For all these cases, sense is unknown.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ss = SCSI_SENSE_NOFAILOVER;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_set_target_groups: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " sense UNKNOWN: sense key:%x, ASC:%x, ASCQ:%x\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sns->es_key, sns->es_add_code, sns->es_qual_code));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (ss == SCSI_SENSE_STATE_CHANGED) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis freerbuf(bp);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis freerbuf(bp);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * get the failover mode, ownership and if it has extended failover
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * capability. The mode(bits5-4/byte5) is defined as implicit, explicit, or
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * both. The state is defined as online-optimized(0h),
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * online-nonoptimized(1h), standby(2h), offline(3h),
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and transitioning(fh). Currently, there is online,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * standby, and offline(defined in sunmdi.h).
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Online-nonoptimized will be a mode of secondary
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and an ownership of online. Thought about using a different mode but
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * it appears the states are really for the states for secondary mode.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * We currently have IS_ONLINING, IS_OFFLINING - should we have TRANSITIONING
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * to mean from online-optimized to online-nonoptimized or does onlining
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * cover this?
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* ARGSUSED */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisint
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvhci_tpgs_get_target_fo_mode(struct scsi_device *sd, int *mode,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int *state, int *xlf_capable, int *preferred)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int retval = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct buf *bp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_address *ap;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int lu = 0, rel_tgt_port = 0, tgt_port = 0x0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(6, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_get_target_fo_mode: enter\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *mode = *state = *xlf_capable = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp = getrbuf(KM_NOSLEEP);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (bp == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_get_target_fo_mode: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " failed getrbuf\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ap = &sd->sd_address;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (vhci_tpgs_inquiry(ap, bp, mode)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_get_target_fo_mode: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " failed vhci_tpgs_inquiry\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retval = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (vhci_tpgs_page83(ap, bp, &rel_tgt_port, &tgt_port, &lu)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_get_target_fo_mode: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " failed vhci_tpgs_page83\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retval = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (vhci_tpgs_report_target_groups(ap, bp, rel_tgt_port,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis tgt_port, state, preferred)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_get_target_fo_mode: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " failed vhci_tpgs_report_target_groups\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retval = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis freerbuf(bp);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (retval == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(6, (CE_NOTE, NULL, "!vhci_tpgs_get_target_fo_mode: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "SUCCESS\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvhci_tpgs_inquiry(struct scsi_address *ap, struct buf *bp, int *mode)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_pkt *pkt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_inquiry inq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int retval;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *mode = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_un.b_addr = (caddr_t)&inq;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_flags = B_READ;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_bcount = sizeof (inq);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_resid = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt = scsi_init_pkt(ap, NULL, bp, CDB_GROUP0,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sizeof (struct scsi_arq_status), 0, 0, SLEEP_FUNC, NULL);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[0] = SCMD_INQUIRY;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[4] = sizeof (inq);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_time = 60;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retval = vhci_do_scsi_cmd(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (retval == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL, "!vhci_tpgs_inquiry: Failure"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " returned from vhci_do_scsi_cmd"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inq.inq_tpgs == TPGS_FAILOVER_NONE) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_inquiry: zero tpgs_bits"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retval = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (inq.inq_tpgs == TPGS_FAILOVER_IMPLICIT) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *mode = SCSI_IMPLICIT_FAILOVER;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inq.inq_tpgs == TPGS_FAILOVER_EXPLICIT) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *mode = SCSI_EXPLICIT_FAILOVER;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (inq.inq_tpgs == TPGS_FAILOVER_BOTH) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *mode = SCSI_BOTH_FAILOVER;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_inquiry: Illegal mode returned: %x mode: %x",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis inq.inq_tpgs, *mode));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis retval = 1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (retval);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvhci_tpgs_page83(struct scsi_address *ap, struct buf *bp,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int *rel_tgt_port, int *tgt_port, int *lu)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis char *ptr, *end;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_pkt *pkt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis char *bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int buf_len, rx_bsize;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * lets start the buf size with 512 bytes. If this
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * if found to be insufficient, we can allocate
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * appropriate size in the next iteration.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buf_len = 512;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisonce_again:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bufp = kmem_zalloc(buf_len, KM_NOSLEEP);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (bufp == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL, "!vhci_tpgs_page83: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "request packet allocation for %d failed....",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buf_len));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_un.b_addr = bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_flags = B_READ;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_bcount = buf_len;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_resid = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt = scsi_init_pkt(ap, NULL, bp, CDB_GROUP0,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sizeof (struct scsi_arq_status), 0, 0, NULL, NULL);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (pkt == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_page83: Failure returned from scsi_init_pkt"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, buf_len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[0] = SCMD_INQUIRY;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[1] = 0x1;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[2] = 0x83;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[3] = (unsigned char)((buf_len >> 8) & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[4] = (unsigned char)(buf_len & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_time = 90;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (vhci_do_scsi_cmd(pkt) == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_page83: vhci_do_scsi_cmd failed\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, buf_len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Now lets check if the size that was provided was
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * sufficient. If not, allocate the appropriate size
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and retry the command again.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rx_bsize = (((bufp[2] & 0xff) << 8) | (bufp[3] & 0xff));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rx_bsize += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (rx_bsize > buf_len) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Need to allocate more buf and retry again
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_page83: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "bufsize: %d greater than allocated buf: %d\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rx_bsize, buf_len));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "Retrying for size %d\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rx_bsize));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, buf_len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buf_len = (unsigned int)(rx_bsize);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto once_again;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr = bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr += 4; /* identification descriptor 0 */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis end = bufp + rx_bsize;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis while (ptr < end) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "vhci_tpgs_page83: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "desc[1/4/5/6/7]:%x %x %x %x %x\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr[1], ptr[4], ptr[5], ptr[6], ptr[7]));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((ptr[1] & 0x0f) == 0x04) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *rel_tgt_port = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *rel_tgt_port |= ((ptr[6] & 0xff) << 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *rel_tgt_port |= (ptr[7] & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_page83: relative target port: %x\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *rel_tgt_port));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((ptr[1] & 0x0f) == 0x05) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *tgt_port = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *tgt_port = ((ptr[6] & 0xff) << 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *tgt_port |= (ptr[7] & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_page83: target port: %x\n", *tgt_port));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if ((ptr[1] & 0x0f) == 0x06) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *lu = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *lu |= ((ptr[6] & 0xff)<< 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *lu |= (ptr[7] & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_page83: logical unit: %x\n", *lu));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr += ptr[3] + 4; /* next identification descriptor */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, buf_len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef DEBUG
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic void
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisprint_buf(char *buf, int buf_size)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i = 0, j;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int loop, left;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis loop = buf_size / 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis left = buf_size % 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL, "!buf_size: %x loop: %x left: %x",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buf_size, loop, left));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (j = 0; j < loop; j++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!buf[%d-%d]: %x %x %x %x %x %x %x %x",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i, i + 7, buf[i], buf[i+1], buf[i+2], buf[i+3],
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis buf[i+4], buf[i+5], buf[i+6], buf[i+7]));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis i += 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (left) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_CONT, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "NOTICE: buf[%d-%d]:", i, i + left));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (j = 0; j < left; j++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_CONT, NULL, " %x", buf[i + j]));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_CONT, NULL, "\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisstatic int
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisvhci_tpgs_report_target_groups(struct scsi_address *ap, struct buf *bp,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int rel_tgt_port, int tgt_port, int *pstate, int *preferred)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis{
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct scsi_pkt *pkt;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis char *ptr, *end, *bufp, *mpapi_ptr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int rtpg_len = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int l_tgt_port = 0, tpgs_state = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned int tgt_port_cnt = 0, lr_tgt_port = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i, len;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Start with buffer size of 512.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If this is found to be insufficient, required size
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * will be allocated and the command will be retried.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis len = 512;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistry_again:
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bufp = kmem_zalloc(len, KM_NOSLEEP);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (bufp == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_WARN, NULL, "!vhci_tpgs_report_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " request packet allocation for %d failed....", len));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_un.b_addr = bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_flags = B_READ;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_bcount = len;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis bp->b_resid = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt = scsi_init_pkt(ap, NULL, bp, CDB_GROUP5,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis sizeof (struct scsi_arq_status), 0, 0, NULL, NULL);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (pkt == NULL) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_report_target_groups: scsi_init_pkt error\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[0] = SCMD_MAINTENANCE_IN;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[1] = SSVC_ACTION_GET_TARGET_PORT_GROUPS;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[6] = ((len >> 24) & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[7] = ((len >> 16) & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[8] = ((len >> 8) & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[9] = len & 0xff;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_time = 90;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(6, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_report_target_groups: sending target port group:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " cdb[6/7/8/9]: %x/%x/%x/%x\n", pkt->pkt_cdbp[6],
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis pkt->pkt_cdbp[7], pkt->pkt_cdbp[8], pkt->pkt_cdbp[9]));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (vhci_do_scsi_cmd(pkt) == 0) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL, "!vhci_tpgs_report_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " vhci_do_scsi_cmd failed\n"));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr = bufp;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(6, (CE_NOTE, NULL, "!vhci_tpgs_report_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " returned from target"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " port group: buf[0/1/2/3]: %x/%x/%x/%x\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr[0], ptr[1], ptr[2], ptr[3]));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len = (unsigned int)((0xff & ptr[0]) << 24);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len |= (unsigned int)((0xff & ptr[1]) << 16);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len |= (unsigned int)((0xff & ptr[2]) << 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len |= (unsigned int)(0xff & ptr[3]);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (rtpg_len > len) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL, "!vhci_tpgs_report_target_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " bufsize: %d greater than allocated buf: %d\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len, len));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL, "Retrying for size %d\n",
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rtpg_len));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis len = (unsigned int)(rtpg_len + 1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis goto try_again;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef DEBUG
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis print_buf(bufp, rtpg_len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis end = ptr + rtpg_len;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis while (ptr < end) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis mpapi_ptr = ptr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l_tgt_port = ((ptr[2] & 0xff) << 8) + (ptr[3] & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis tpgs_state = ptr[0] & 0x0f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis tgt_port_cnt = (ptr[7] & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL, "!vhci_tpgs_report_tgt_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " tpgs state: %x"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " tgt_group: %x count: %x\n", tpgs_state,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis l_tgt_port, tgt_port_cnt));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr += 8;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis for (i = 0; i < tgt_port_cnt; i++) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis lr_tgt_port = 0;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis lr_tgt_port |= ((ptr[2] & 0Xff) << 8);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis lr_tgt_port |= (ptr[3] & 0xff);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if ((lr_tgt_port == rel_tgt_port) &&
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (l_tgt_port == tgt_port)) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_report_tgt_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " found tgt_port: %x rel_tgt_port:%x"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " tpgs_state: %x\n", tgt_port, rel_tgt_port,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis tpgs_state));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis /*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * once we have the preferred flag
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and a non-optimized state flag
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * we will get preferred flag from the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * report target groups
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis if (tpgs_state == STD_ACTIVE_OPTIMIZED) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *pstate = STD_ACTIVE_OPTIMIZED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *preferred = PCLASS_PREFERRED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (tpgs_state ==
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis STD_ACTIVE_NONOPTIMIZED) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *pstate = STD_ACTIVE_NONOPTIMIZED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *preferred = PCLASS_NONPREFERRED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else if (tpgs_state == STD_STANDBY) {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *pstate = STD_STANDBY;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *preferred = PCLASS_NONPREFERRED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } else {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *pstate = STD_UNAVAILABLE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *preferred = PCLASS_NONPREFERRED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis vhci_mpapi_update_tpg_data(ap, mpapi_ptr);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (0);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(4, (CE_NOTE, NULL,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "!vhci_tpgs_report_tgt_groups:"
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis " tgt_port: %x rel_tgt_port:%x\n", tgt_port,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis rel_tgt_port));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis ptr += 4;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis }
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *pstate = SCSI_PATH_INACTIVE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *preferred = PCLASS_NONPREFERRED;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis VHCI_DEBUG(1, (CE_NOTE, NULL, "!vhci_tpgs_report_tgt_groups: "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "NO rel_TGTPRT MATCH!!! Assigning Default: state: %x "
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis "preferred: %d\n", *pstate, *preferred));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis kmem_free((void *)bufp, len);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis scsi_destroy_pkt(pkt);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis return (1);
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis