25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * CDDL HEADER START
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * The contents of this file are subject to the terms of the
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Common Development and Distribution License (the "License").
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * You may not use this file except in compliance with the License.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * or http://www.opensolaris.org/os/licensing.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * See the License for the specific language governing permissions
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * and limitations under the License.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * When distributing Covered Code, include this CDDL HEADER in each
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * If applicable, add the following below this CDDL HEADER, with the
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * fields enclosed by brackets "[]" replaced with your own identifying
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * information: Portions Copyright [yyyy] [name of copyright owner]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * CDDL HEADER END
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/errno.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/modctl.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/stat.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/kmem.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/ksynch.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/stream.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/stropts.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/termio.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/ddi.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/file.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/disp.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/sunddi.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/sunldi.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/sunndi.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/prom_plat.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/oplmsu/oplmsu.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/oplmsu/oplmsu_proto.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * LOWER READ SERVICE PROCEDURE
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/* termios ioctl response received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_lrioctl_termios(queue_t *lrq, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath, *altn_upath = NULL, *stp_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath, *altn_lpath = NULL, *stp_lpath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp, *temp_iocp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *hndl_mp, *nmp = NULL, *fmp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *dst_queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int term_ioctl, term_stat, sts;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int ack_flag, termio_flag, chkflag;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t trad_sts;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_READER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)lrq->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl hndl_mp = lpath->hndl_mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_search_upath_info(lpath->path_no);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl trad_sts = upath->traditional_status;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (((iocp->ioc_cmd == TCSETS) && (trad_sts == MSU_WTCS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TCSETSW) && (trad_sts == MSU_WTCS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TCSETSF) && (trad_sts == MSU_WTCS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCMSET) && (trad_sts == MSU_WTMS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCSPPS) && (trad_sts == MSU_WPPS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCSWINSZ) && (trad_sts == MSU_WWSZ_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCSSOFTCAR) && (trad_sts == MSU_WCAR_ACK))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_datap->db_type == M_IOCACK) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ack_flag = ACK_RES;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ack_flag = NAK_RES;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "oplmsu: lr-termios: "
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Status of path is improper");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (trad_sts) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WTCS_ACK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag = MSU_TIOS_TCSETS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WTMS_ACK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag = MSU_TIOS_MSET;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WPPS_ACK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag = MSU_TIOS_PPS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WWSZ_ACK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag = MSU_TIOS_WINSZP;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WCAR_ACK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag = MSU_TIOS_SOFTCAR;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl default :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag = MSU_TIOS_END;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (hndl_mp == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (trad_sts) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WTCS_ACK : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WTMS_ACK : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WPPS_ACK : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WWSZ_ACK : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_WCAR_ACK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl chkflag = MSU_CMD_STOP;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl default :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl chkflag = FAILURE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* xoff/xon received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (hndl_mp->b_datap->db_type == M_DATA) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl chkflag = MSU_CMD_ACTIVE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* Normal termios */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl temp_iocp = (struct iocblk *)hndl_mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl chkflag = temp_iocp->ioc_cmd;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((chkflag == MSU_CMD_ACTIVE) || (chkflag == MSU_CMD_STOP)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ack_flag == ACK_RES) { /* M_IOCACK received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_prechg_termio(lrq, mp, MSU_READ_SIDE,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl termio_flag, &nmp, &term_stat) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (term_stat != MSU_WPTH_CHG) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = term_stat;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(RD(lrq), nmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Continue sending termios ioctls */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(RD(lrq), nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change status of new active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_ACTIVE,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->status, MSU_ACTIVE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->uinst = oplmsu_uinst;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = lpath->hndl_uqueue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = oplmsu_uinst->user_ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((chkflag == MSU_CMD_ACTIVE) && (hndl_mp != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Put a message(M_DATA) on a queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(RD(ctrl->queue), hndl_mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_upath = lpath->src_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Notify of the active path changing */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) prom_opl_switch_console(upath->ser_devcb.lsb);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XON to notify active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void) oplmsu_cmn_put_xoffxon(WR(lrq), MSU_XON_4);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath = stp_upath->lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->uinst = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(stp_lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change status of stopped or old-active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (chkflag == MSU_CMD_STOP) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sts = MSU_PSTAT_STOP;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl trad_sts = MSU_STOP;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* == MSU_CMD_ACTIVE */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sts = MSU_PSTAT_STANDBY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl trad_sts = MSU_STANDBY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(stp_upath, sts,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_upath->status, trad_sts);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XOFF to notify all standby paths */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_putxoff_standby();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->lower_queue = lrq;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->inst_status = oplmsu_get_inst_status();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change active path of user node */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *temp_queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl temp_queue = WR(ctrl->queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Reschedule a queue for service */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl enableok(temp_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wcmn_high_qenable(temp_queue, RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (nmp != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Wake up oplmsu_config_stop */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (stp_lpath->sw_flag) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->sw_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cv_signal(&stp_lpath->sw_cv);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* M_IOCNAK received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((chkflag == MSU_CMD_ACTIVE) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->hndl_uqueue == NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_upath = lpath->src_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl MSU_PSTAT_STANDBY, upath->status,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl MSU_STANDBY);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (hndl_mp != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(hndl_mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->inst_status =
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_get_inst_status();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((chkflag == MSU_CMD_STOP) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->src_upath != NULL) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->src_upath->lpath->sw_flag)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* MSU_CMD_STOP for active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(lpath->hndl_uqueue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_upath = lpath->src_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Search alternate path from standby paths */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_upath = oplmsu_search_standby();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (altn_upath == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_upath = upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_allocmb(lrq, mp, &fmp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sizeof (char), MSU_READ_SIDE) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_prechg(lrq, mp, MSU_READ_SIDE,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl &nmp, &term_ioctl, &term_stat) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freeb(fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_upath->traditional_status = term_stat;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath = altn_upath->lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->hndl_mp = hndl_mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->hndl_uqueue = dst_queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->src_upath = stp_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->status = MSU_EXT_VOID;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(altn_lpath->lower_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_FAIL,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->status, MSU_FAIL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->inst_status =
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_get_inst_status();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_mflush(fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(dst_queue, fmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(dst_queue, fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(dst_queue, nmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(dst_queue, nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((chkflag == TCSETS) || (chkflag == TCSETSW) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (chkflag == TCSETSF) || (chkflag == TIOCMSET) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (chkflag == TIOCSPPS) || (chkflag == TIOCSWINSZ) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (chkflag == TIOCSSOFTCAR)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((ack_flag == ACK_RES) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->hndl_uqueue != NULL)) { /* M_IOCACK received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(lrq, mp, &nmp, hndl_mp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl MSU_READ_SIDE) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (chkflag) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TCSETS : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TCSETSW : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TCSETSF :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tcsets_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(oplmsu_uinst->tcsets_p);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tcsets_p = nmp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCMSET :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tiocmset_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(oplmsu_uinst->tiocmset_p);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocmset_p = nmp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCSPPS :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tiocspps_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(oplmsu_uinst->tiocspps_p);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocspps_p = nmp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCSWINSZ :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tiocswinsz_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(oplmsu_uinst->tiocswinsz_p);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocswinsz_p = nmp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCSSOFTCAR :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tiocssoftcar_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(oplmsu_uinst->tiocssoftcar_p);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocssoftcar_p = nmp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = lpath->status;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl nmp = lpath->hndl_mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl nmp->b_datap->db_type = M_IOCACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(lpath->hndl_uqueue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl bcopy(mp->b_rptr, nmp->b_rptr, sizeof (struct iocblk));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Check sleep flag and wake up thread */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_wakeup(dst_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((ack_flag == NAK_RES) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->hndl_uqueue != NULL)) { /* M_IOCNAK received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = lpath->status;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl nmp = lpath->hndl_mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl nmp->b_datap->db_type = M_IOCNAK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(lpath->hndl_uqueue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Check sleep flag and wake up thread */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_wakeup(dst_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (upath->status) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_PSTAT_FAIL :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = MSU_FAIL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_PSTAT_STOP :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = MSU_STOP;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_PSTAT_STANDBY :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = MSU_STANDBY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_PSTAT_ACTIVE :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = MSU_ACTIVE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/* M_ERROR or M_HANGUP response received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_lrmsg_error(queue_t *lrq, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath, *altn_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath, *altn_lpath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *nmp = NULL, *fmp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *dst_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int term_stat, term_ioctl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_READER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = oplmsu_uinst->user_ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(ctrl->queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)lrq->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_search_upath_info(lpath->path_no);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
c2c6897e1a5682452b38f92bc27270708f1e033craghuram if (upath == NULL) {
c2c6897e1a5682452b38f92bc27270708f1e033craghuram mutex_exit(&oplmsu_uinst->l_lock);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram mutex_exit(&oplmsu_uinst->u_lock);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram rw_exit(&oplmsu_uinst->lock);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram freemsg(mp);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram return (SUCCESS);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram }
c2c6897e1a5682452b38f92bc27270708f1e033craghuram
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((lpath->status == MSU_LINK_NU) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->status == MSU_SETID_NU) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WSTR_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WTCS_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WTMS_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WPPS_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WWSZ_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WCAR_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WSTP_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WPTH_CHG)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((upath->traditional_status == MSU_MAKE_INST) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_STOP) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_STANDBY) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_SETID) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_LINK)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_FAIL, upath->status,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl MSU_FAIL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (upath->traditional_status == MSU_FAIL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (upath->traditional_status == MSU_ACTIVE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_upath = oplmsu_search_standby();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (altn_upath == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_FAIL,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->status, MSU_FAIL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->uinst = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->lower_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_allocmb(lrq, mp, &fmp, sizeof (char),
25cf1a301a396c38e8adf52c15f537b80d2483f7jl MSU_READ_SIDE) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_prechg(lrq, mp, MSU_READ_SIDE, &nmp, &term_ioctl,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl &term_stat) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freeb(fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_FAIL,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->status, MSU_FAIL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->uinst = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_upath->traditional_status = term_stat;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath = altn_upath->lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->hndl_mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->hndl_uqueue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->src_upath = upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_lpath->status = MSU_EXT_VOID;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(altn_lpath->lower_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->lower_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_mflush(fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl noenable(WR(ctrl->queue));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(dst_queue, fmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(dst_queue, fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(dst_queue, nmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(dst_queue, nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/* M_DATA[xoff/xon] was received from serial port */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_lrdata_xoffxon(queue_t *lrq, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath, *stp_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath, *stp_lpath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *nmp = NULL, *fmp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int term_stat, term_ioctl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_READER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->lower_queue != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Get lower path of active status */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath = (lpath_t *)oplmsu_uinst->lower_queue->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (stp_lpath != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_upath =
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_search_upath_info(stp_lpath->path_no);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)lrq->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_search_upath_info(lpath->path_no);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
c2c6897e1a5682452b38f92bc27270708f1e033craghuram if (upath == NULL) {
c2c6897e1a5682452b38f92bc27270708f1e033craghuram mutex_exit(&oplmsu_uinst->l_lock);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram mutex_exit(&oplmsu_uinst->u_lock);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram rw_exit(&oplmsu_uinst->lock);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram freemsg(mp);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram return (SUCCESS);
c2c6897e1a5682452b38f92bc27270708f1e033craghuram }
c2c6897e1a5682452b38f92bc27270708f1e033craghuram
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((stp_upath != NULL) && (stp_upath != upath)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((stp_upath->status != MSU_PSTAT_ACTIVE) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (stp_upath->traditional_status != MSU_ACTIVE)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putbq(lrq, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((upath->status == MSU_PSTAT_ACTIVE) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((upath->traditional_status == MSU_ACTIVE) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WTCS_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WTMS_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WPPS_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WWSZ_ACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_WCAR_ACK))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) oplmsu_rcmn_through_hndl(lrq, mp, MSU_NORM);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((upath->status != MSU_PSTAT_STANDBY) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status != MSU_STANDBY)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "oplmsu: lr-xoffxon: "
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Can't change to specified path");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_allocmb(lrq, mp, &fmp, sizeof (char), MSU_READ_SIDE) ==
25cf1a301a396c38e8adf52c15f537b80d2483f7jl FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_prechg(lrq, mp, MSU_READ_SIDE, &nmp, &term_ioctl,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl &term_stat) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freeb(fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_mflush(fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = term_stat;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_mp = mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_uqueue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = stp_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_VOID;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = oplmsu_uinst->user_ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (term_stat != MSU_WPTH_CHG) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Send termios to new active path and wait response
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl noenable(WR(ctrl->queue));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(RD(lrq), fmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(RD(lrq), fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(RD(lrq), nmp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(RD(lrq), nmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * No termios messages are received. Change active path.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_ACTIVE, upath->status,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl MSU_ACTIVE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->uinst = oplmsu_uinst;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Notify of the active path changing */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) prom_opl_switch_console(upath->ser_devcb.lsb);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(WR(lrq), fmp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XON to notify active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void) oplmsu_cmn_put_xoffxon(WR(lrq), MSU_XON_4);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->hndl_mp != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Put a message(M_DATA) on a queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(RD(ctrl->queue), lpath->hndl_mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl noenable(WR(ctrl->queue));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((stp_upath != NULL) && (stp_lpath != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change the status of stop path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(stp_upath, MSU_PSTAT_STANDBY,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_upath->status, MSU_STANDBY);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_clear_ioctl_path(stp_lpath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->uinst = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl stp_lpath->status = MSU_EXT_NOTUSED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#ifdef DEBUG
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_prt_pathname(upath->ser_devcb.dip);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#endif
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XOFF to notify all standby paths */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_putxoff_standby();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_RWLOCK_UPGRADE();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->lower_queue = lrq;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->inst_status = oplmsu_get_inst_status();
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->u_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *temp_queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl temp_queue = WR(ctrl->queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Reschedule a queue for service */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl enableok(temp_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wcmn_high_qenable(temp_queue, RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}