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 */
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/strsun.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/oplmsu/oplmsu.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#include <sys/oplmsu/oplmsu_proto.h>
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Link upper_path_table structure
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_link_upath(upath_t *add_upath)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(add_upath != NULL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->first_upath == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->first_upath = add_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_upath->u_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *last_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl last_upath = oplmsu_uinst->last_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl last_upath->u_next = add_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_upath->u_prev = last_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->last_upath = add_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_upath->u_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Unlink upper_path_table structure
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_unlink_upath(upath_t *del_upath)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t **first, **last;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl first = &oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl last = &oplmsu_uinst->last_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*first != del_upath) && (*last != del_upath)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_upath->u_prev->u_next = del_upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_upath->u_next->u_prev = del_upath->u_prev;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*first == del_upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *first = (*first)->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*first) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*first)->u_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*last == del_upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *last = (*last)->u_prev;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*last) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*last)->u_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_upath->u_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_upath->u_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Link lower_path_table structure
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_link_lpath(lpath_t *add_lpath)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(add_lpath != NULL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->first_lpath == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->first_lpath = add_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_lpath->l_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *last_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl last_lpath = oplmsu_uinst->last_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl last_lpath->l_next = add_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_lpath->l_prev = last_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->last_lpath = add_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_lpath->l_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Unlink lower_path_table structure
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_unlink_lpath(lpath_t *del_lpath)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t **first, **last;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl first = &oplmsu_uinst->first_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl last = &oplmsu_uinst->last_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*first != del_lpath) && (*last != del_lpath)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_lpath->l_prev->l_next = del_lpath->l_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_lpath->l_next->l_prev = del_lpath->l_prev;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*first == del_lpath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *first = (*first)->l_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*first) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*first)->l_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*last == del_lpath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *last = (*last)->l_prev;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*last) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*last)->l_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_lpath->l_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl del_lpath->l_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Link msgb structure of high priority
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A [It depends on caller]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A [It depends on caller]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_link_high_primsg(mblk_t **first, mblk_t **last, mblk_t *add_msg)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(add_msg != NULL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*first == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *first = add_msg;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_msg->b_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*last)->b_next = add_msg;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_msg->b_prev = *last;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *last = add_msg;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl add_msg->b_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Check whether lower path is usable by lower path info table address
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_check_lpath_usable(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->l_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = oplmsu_uinst->first_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (lpath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((lpath->hndl_uqueue != NULL) || (lpath->hndl_mp != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = BUSY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = lpath->l_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (rval);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Search upath_t by path number
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlupath_t *
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_search_upath_info(int path_no)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (upath->path_no == path_no) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (upath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Send M_IOCACK(or M_IOCNAK) message to stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_iocack(queue_t *q, mblk_t *mp, int errno)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(mp != NULL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp->ioc_error = errno;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (errno) { /* Error */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_datap->db_type = M_IOCNAK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp->ioc_rval = FAILURE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(q, mp, MSU_TRC_UO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* Good */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_datap->db_type = M_IOCACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp->ioc_rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(q, mp, MSU_TRC_UO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Delete all upath_t
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_delete_upath_info(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath, *next_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->first_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->last_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl next_upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl kmem_free(upath, sizeof (upath_t));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = next_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Set queue and ioctl to lpath_t
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_set_ioctl_path(lpath_t *lpath, queue_t *hndl_queue, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->l_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((lpath->hndl_uqueue == NULL) && (lpath->hndl_mp == NULL) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->sw_flag == 0)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((lpath->status == MSU_EXT_NOTUSED) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->status == MSU_EXT_ACTIVE_CANDIDATE) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath->status == MSU_SETID_NU)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (hndl_queue == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_uqueue = hndl_queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_uqueue = WR(hndl_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_mp = mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = BUSY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = BUSY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (rval);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Clear queue and ioctl to lpath_t
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_clear_ioctl_path(lpath_t *lpath)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->l_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_uqueue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->hndl_mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Get instanse status from status of upath_t
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_get_inst_status(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int sts, pre_sts = INST_STAT_UNCONFIGURED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (((upath->status == MSU_PSTAT_ACTIVE) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_ACTIVE)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((upath->status == MSU_PSTAT_STANDBY) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_STANDBY))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sts = INST_STAT_ONLINE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (((upath->status == MSU_PSTAT_STOP) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_STOP)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((upath->status == MSU_PSTAT_FAIL) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_FAIL))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sts = INST_STAT_OFFLINE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (((upath->status == MSU_PSTAT_DISCON) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_DISCON)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((upath->status == MSU_PSTAT_EMPTY) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_EMPTY))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sts = INST_STAT_UNCONFIGURED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl sts = INST_STAT_BUSY;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (pre_sts > sts) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl pre_sts = sts;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (pre_sts);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Search path of "online:standby" status
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlupath_t *
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_search_standby(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath, *altn_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int max_pathnum = UNDEFINED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((upath->status == MSU_PSTAT_STANDBY) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_STANDBY) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->lpath != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((max_pathnum == UNDEFINED) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (max_pathnum > upath->path_no)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl max_pathnum = upath->path_no;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl altn_upath = upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (altn_upath);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Search path of "offline:stop" status, and minimum path number
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_search_min_stop_path(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath, *min_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int min_no = UNDEFINED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int active_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((upath->status == MSU_PSTAT_ACTIVE) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_ACTIVE)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl active_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((upath->status == MSU_PSTAT_STOP) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->traditional_status == MSU_STOP)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (upath->lpath != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((min_no == UNDEFINED) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (upath->path_no < min_no)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = upath->lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->status == MSU_EXT_NOTUSED) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl min_upath = upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl min_no = upath->path_no;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (active_flag == 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = min_upath->lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->src_upath = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->status = MSU_EXT_ACTIVE_CANDIDATE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Get the total number of serial paths
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_get_pathnum(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int total_num = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->first_upath != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl total_num++;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (total_num);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Put XOFF/ XON message on write queue
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_put_xoffxon(queue_t *queue, int data)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send M_START */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((mp = allocb(0, BPRI_LO)) != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_datap->db_type = M_START;
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send M_DATA(XOFF, XON) */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((mp = allocb(sizeof (int), BPRI_LO)) != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *(uint_t *)mp->b_rptr = data;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_wptr = mp->b_rptr + sizeof (int);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = FAILURE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = FAILURE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (rval);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Put XOFF message on write queue for all standby paths
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_putxoff_standby(void)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath_t *upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->l_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = oplmsu_uinst->first_upath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (upath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = upath->lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((upath->status != MSU_PSTAT_STANDBY) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (lpath == NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl continue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void) oplmsu_cmn_put_xoffxon(
25cf1a301a396c38e8adf52c15f537b80d2483f7jl WR(lpath->lower_queue), MSU_XOFF_4);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath = upath->u_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Set M_FLUSH message
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : A [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_set_mflush(mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_datap->db_type = M_FLUSH;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *mp->b_rptr = FLUSHW;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_wptr = mp->b_rptr + sizeof (char);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Set status informations of upath_t
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_set_upath_sts(upath_t *upath, int sts, int prev_sts,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t trad_sts)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->u_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->status = sts;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->prev_status = prev_sts;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl upath->traditional_status = trad_sts;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Allocate a message block
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_allocmb(queue_t *q, mblk_t *mp, mblk_t **nmp, size_t size,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rw_flag)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*nmp = (mblk_t *)allocb(size, BPRI_LO)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_bufcall(q, mp, size, rw_flag);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = FAILURE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (*nmp)->b_wptr = (*nmp)->b_rptr + size;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (rval);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Copy a message
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_copymb(queue_t *q, mblk_t *mp, mblk_t **nmp, mblk_t *cmp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rw_flag)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*nmp = copymsg(cmp)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_bufcall(q, mp, msgsize(cmp), rw_flag);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = FAILURE;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (rval);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * bufcall request
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_bufcall(queue_t *q, mblk_t *mp, size_t size, int rw_flag)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (rw_flag == MSU_WRITE_SIDE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putbq(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = (ctrl_t *)q->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl->wbuf_id != 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wbuftbl->q = q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wbuftbl->rw_flag = rw_flag;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wbuf_id = bufcall(size, BPRI_LO, oplmsu_cmn_bufcb,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void *)ctrl->wbuftbl);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl->wbuf_id == 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl->wtout_id != 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wtout_id = timeout(oplmsu_cmn_bufcb,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void *)ctrl->wbuftbl, drv_usectohz(MSU_TM_500MS));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (rw_flag == MSU_READ_SIDE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *wrk_msg;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)q->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_datap->db_type >= QPCTL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->first_lpri_hi == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->last_lpri_hi = mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl wrk_msg = lpath->first_lpri_hi;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl wrk_msg->b_prev = mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_next = wrk_msg;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->first_lpri_hi = mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putbq(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->rbuf_id != 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rbuftbl->q = q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rbuftbl->rw_flag = rw_flag;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rbuf_id = bufcall(size, BPRI_LO, oplmsu_cmn_bufcb,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void *)lpath->rbuftbl);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->rbuf_id == 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->rtout_id != 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rtout_id = timeout(oplmsu_cmn_bufcb,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (void *)lpath->rbuftbl, drv_usectohz(MSU_TM_500MS));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Previous sequence for active path change
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_prechg(queue_t *q, mblk_t *mp, int rw_flag, mblk_t **term_mp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int *term_ioctl, int *term_stat)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tcsets_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp, oplmsu_uinst->tcsets_p,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_flag) == -1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)(*term_mp)->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = iocp->ioc_cmd;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WTCS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocmset_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp, oplmsu_uinst->tiocmset_p,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_flag) == -1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCMSET;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WTMS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocspps_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp, oplmsu_uinst->tiocspps_p,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_flag) == -1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCSPPS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WPPS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocswinsz_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocswinsz_p, rw_flag) == -1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCSWINSZ;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WWSZ_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocssoftcar_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocssoftcar_p, rw_flag) == -1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCSSOFTCAR;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WCAR_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WPTH_CHG;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Pick up termios to re-set
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_stop_prechg(mblk_t **term_mp, int *term_ioctl, int *term_stat)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->tcsets_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*term_mp = copymsg(oplmsu_uinst->tcsets_p)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)(*term_mp)->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = iocp->ioc_cmd;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WTCS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocmset_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*term_mp = copymsg(oplmsu_uinst->tiocmset_p)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCMSET;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WTMS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocspps_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*term_mp = copymsg(oplmsu_uinst->tiocspps_p)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCSPPS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WPPS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocswinsz_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*term_mp = copymsg(oplmsu_uinst->tiocswinsz_p)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCSWINSZ;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WWSZ_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (oplmsu_uinst->tiocssoftcar_p != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((*term_mp = copymsg(oplmsu_uinst->tiocssoftcar_p))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_ioctl = TIOCSSOFTCAR;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WCAR_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WPTH_CHG;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Previous sequence for active path change termio
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_prechg_termio(queue_t *q, mblk_t *mp, int rw_flag, int prev_flag,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t **term_mp, int *term_stat)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((prev_flag == MSU_TIOS_TCSETS) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (oplmsu_uinst->tiocmset_p != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp, oplmsu_uinst->tiocmset_p,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_flag) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WTMS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((prev_flag <= MSU_TIOS_MSET) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (oplmsu_uinst->tiocspps_p != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp, oplmsu_uinst->tiocspps_p,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_flag) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WPPS_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((prev_flag <= MSU_TIOS_PPS) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (oplmsu_uinst->tiocswinsz_p != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocswinsz_p, rw_flag) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WWSZ_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((prev_flag <= MSU_TIOS_WINSZP) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (oplmsu_uinst->tiocssoftcar_p != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_copymb(q, mp, term_mp,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_uinst->tiocssoftcar_p, rw_flag) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WCAR_ACK;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if (prev_flag <= MSU_TIOS_SOFTCAR) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *term_stat = MSU_WPTH_CHG;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Pull up messages
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_pullup_msg(queue_t *q, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *nmp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((mp != NULL) && (mp->b_cont != NULL) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (mp->b_cont->b_cont != NULL)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((nmp = msgpullup(mp->b_cont, -1)) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_iocack(q, mp, ENOSR);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp->b_cont);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_cont = nmp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Wake up flow control
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_wakeup(queue_t *q)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = (ctrl_t *)q->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl->sleep_flag == CV_SLEEP) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->sleep_flag = CV_WAKEUP;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cv_signal(&ctrl->cvp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * bufcall() and timeout() callback entry for read/write stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_bufcb(void *arg)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct buf_tbl *buftbl = arg;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int lq_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = oplmsu_uinst->first_lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (lpath) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((buftbl == lpath->rbuftbl) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (buftbl->rw_flag == MSU_READ_SIDE)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((lpath->rbuf_id == 0) && (lpath->rtout_id == 0)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl q = lpath->rbuftbl->q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rbuftbl->q = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rbuftbl->rw_flag = UNDEFINED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->rbuf_id) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rbuf_id = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->rtout_id = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_queue_flag == 1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lq_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_rcmn_high_qenable(q);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lq_flag == 1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = lpath->l_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((ctrl = oplmsu_uinst->user_ctrl) != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((buftbl == ctrl->wbuftbl) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (buftbl->rw_flag == MSU_WRITE_SIDE)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wbufcb_posthndl(ctrl);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((ctrl = oplmsu_uinst->meta_ctrl) != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((buftbl == ctrl->wbuftbl) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (buftbl->rw_flag == MSU_WRITE_SIDE)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wbufcb_posthndl(ctrl);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * bufcall() or timeout() callback post handling for write stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : M
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wbufcb_posthndl(ctrl_t *ctrl)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int lq_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_WRITE_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(MUTEX_HELD(&oplmsu_uinst->c_lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((ctrl->wbuf_id == 0) && (ctrl->wtout_id == 0)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl q = ctrl->wbuftbl->q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wbuftbl->q = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wbuftbl->rw_flag = UNDEFINED;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (ctrl->wbuf_id) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wbuf_id = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->wtout_id = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_queue_flag == 1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lq_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wcmn_high_qenable(q, RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lq_flag == 1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_queue_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * COMMON FUNCTIONS FOR WRITE STREAM
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Check control node and driver privilege
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wcmn_chknode(queue_t *q, int node, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (((ctrl_t *)q->q_ptr)->node_type != node) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "oplmsu: chk-node: ctrl node type = %d", node);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (EINVAL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Check super-user by oplmsu.conf */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_check_su != 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (drv_priv(iocp->ioc_cr) != 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "oplmsu: chk-node: Permission denied");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (EPERM);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Flush handle for write side stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wcmn_flush_hndl(queue_t *q, mblk_t *mp, krw_t rw)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *dst_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*mp->b_rptr & FLUSHW) { /* Write side */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl flushq(q, FLUSHDATA);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = oplmsu_uinst->lower_queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (dst_queue == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*mp->b_rptr & FLUSHR) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl flushq(RD(q), FLUSHDATA);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *mp->b_rptr &= ~FLUSHW;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(q, mp, MSU_TRC_UO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, rw);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(WR(dst_queue), mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Through message handle for write side stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wcmn_through_hndl(queue_t *q, mblk_t *mp, int pri_flag, krw_t rw)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *usr_queue = NULL, *dst_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((ctrl = oplmsu_uinst->user_ctrl) != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl usr_queue = ctrl->queue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_datap->db_type == M_IOCTL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_iocack(q, mp, ENODEV);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, rw);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_uinst->lower_queue != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = WR(oplmsu_uinst->lower_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "!oplmsu: through-lwq: "
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Active path doesn't exist");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_datap->db_type == M_IOCTL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_iocack(q, mp, ENODEV);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, rw);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((usr_queue == WR(q)) || (usr_queue == RD(q))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (pri_flag == MSU_HIGH) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (canput(dst_queue)) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wcmn_norm_putbq(WR(q), mp, dst_queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_WARN, "oplmsu: through-lwq: "
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Inappropriate message for this node");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_datap->db_type == M_IOCTL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_iocack(q, mp, ENODEV);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, rw);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Get high priority message from buffer for upper write stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlmblk_t *
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wcmn_high_getq(queue_t *uwq)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = (ctrl_t *)uwq->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp = ctrl->first_upri_hi;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_next == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->first_upri_hi = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->last_upri_hi = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->first_upri_hi = mp->b_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_next->b_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * putbq() function for normal priority message of write stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wcmn_norm_putbq(queue_t *uwq, mblk_t *mp, queue_t *dq)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(mp != NULL);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)dq->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->uwq_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->uwq_queue = uwq;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putbq(uwq, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Restart queuing for high priority message of write stream when flow control
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * failed
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER or RW_WRITER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_wcmn_high_qenable(queue_t *q, krw_t rw)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_LOCK_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_queue_flag == 1) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Handle high priority message */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl while (mp = oplmsu_wcmn_high_getq(WR(q))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_datap->db_type & M_FLUSH) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_wcmn_flush_hndl(q, mp, rw);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl continue;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_wcmn_through_hndl(q, mp, MSU_HIGH, rw) == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qenable(WR(q)); /* enable upper write queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * COMMON FUNCTIONS FOR READ STREAM
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Flush handle for read side stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires lock ( M: mandatory P: prohibited A: allowed
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_rcmn_flush_hndl(queue_t *q, mblk_t *mp)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *dst_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*mp->b_rptr & FLUSHR) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Remove only data messages from read queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl flushq(q, FLUSHDATA);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((ctrl = oplmsu_uinst->user_ctrl) != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(ctrl->queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (dst_queue != NULL) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*mp->b_rptr & FLUSHW) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl flushq(WR(q), FLUSHDATA);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *mp->b_rptr &= ~FLUSHR;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(q, mp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_READER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (*mp->b_rptr & FLUSHW) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl flushq(WR(q), FLUSHDATA);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *mp->b_rptr &= ~FLUSHR;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl OPLMSU_TRACE(q, mp, MSU_TRC_LO);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qreply(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_READER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Through message handle for read side stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : M [RW_READER]
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : A
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlint
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_rcmn_through_hndl(queue_t *q, mblk_t *mp, int pri_flag)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl_t *ctrl;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl queue_t *dst_queue = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int act_flag;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ASSERT(RW_READ_HELD(&oplmsu_uinst->lock));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)q->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (lpath->uinst != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl act_flag = ACTIVE_RES;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl act_flag = NOT_ACTIVE_RES;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (((ctrl = oplmsu_uinst->user_ctrl) != NULL) &&
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (((mp->b_datap->db_type == M_IOCACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (mp->b_datap->db_type == M_IOCNAK)) || (act_flag == ACTIVE_RES))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl dst_queue = RD(ctrl->queue);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl freemsg(mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (pri_flag == MSU_HIGH) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (canput(dst_queue)) {
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putq(dst_queue, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Place a normal priority message at the head of
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * read queue
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl = (ctrl_t *)dst_queue->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->lrq_flag = 1;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ctrl->lrq_queue = q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) putbq(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (FAILURE);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->c_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return (SUCCESS);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Restart queuing for high priority message of read stream
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * when flow control failed
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_rcmn_high_qenable(queue_t *q)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath_t *lpath;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl int rval;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_READER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl for (;;) { /* Handle high priority message */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath = (lpath_t *)q->q_ptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((mp = lpath->first_lpri_hi) == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_next == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->first_lpri_hi = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->last_lpri_hi = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl lpath->first_lpri_hi = mp->b_next;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_next->b_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_next = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mp->b_prev = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = SUCCESS;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (mp->b_datap->db_type) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case M_IOCACK : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case M_IOCNAK :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (iocp->ioc_cmd) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TCSETS : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TCSETSW : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TCSETSF : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCMSET : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCSPPS : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCSWINSZ : /* FALLTHRU */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case TIOCSSOFTCAR :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = oplmsu_lrioctl_termios(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl default :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = oplmsu_rcmn_through_hndl(
25cf1a301a396c38e8adf52c15f537b80d2483f7jl q, mp, MSU_HIGH);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (rval == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case M_ERROR :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = oplmsu_lrmsg_error(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_enter(&oplmsu_uinst->lock, RW_WRITER);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case M_FLUSH :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_rcmn_flush_hndl(q, mp);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl default :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rval = oplmsu_rcmn_through_hndl(q, mp, MSU_HIGH);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (rval == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (rval == FAILURE) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl rw_exit(&oplmsu_uinst->lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl qenable(q); /* Enable lower read queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#ifdef DEBUG
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Online trace
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_trace(queue_t *q, mblk_t *mp, int op)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl struct iocblk *iocp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((op < MSU_TRC_UI) || (op > MSU_TRC_CLS)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_ltrc_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_debug_mode & MSU_DPRINT_ON) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_msglog(mp, op);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Trace current counter */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) drv_getparm(LBOLT, (void *)&oplmsu_ltrc_ccnt);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_ltrc_cur == oplmsu_ltrc_tail) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur = oplmsu_ltrc_top;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur++;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->q = q;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->mp = mp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (op) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_TRC_UI :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[0] = 'u';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[1] = 'i';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_TRC_UO :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[0] = 'u';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[1] = 'o';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_TRC_LI :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[0] = 'l';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[1] = 'i';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_TRC_LO :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[0] = 'l';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[1] = 'o';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_TRC_OPN :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[0] = 'o';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[1] = 'p';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_TRC_CLS :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[0] = 'c';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->op[1] = 'l';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((op == MSU_TRC_LI) || (op == MSU_TRC_LO)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_enter(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->pathno = ((lpath_t *)q->q_ptr)->path_no;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_uinst->l_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->pathno = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((op == MSU_TRC_OPN) || (op == MSU_TRC_CLS)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->msg_type = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->msg_cmd = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch ((ulong_t)mp) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_NODE_USER :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data = MSU_TRC_USER;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case MSU_NODE_META :
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data = MSU_TRC_META;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->msg_type = mp->b_datap->db_type;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl iocp = (struct iocblk *)mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->msg_cmd = iocp->ioc_cmd;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((mp->b_datap->db_type == M_IOCTL) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (mp->b_datap->db_type == M_IOCACK) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (mp->b_datap->db_type == M_IOCNAK)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->msg_cmd = iocp->ioc_cmd;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_cont != NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data =
25cf1a301a396c38e8adf52c15f537b80d2483f7jl (ulong_t)mp->b_cont->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->msg_cmd = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp->b_rptr == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_ltrc_cur->data = *(ulong_t *)mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mutex_exit(&oplmsu_ltrc_lock);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/*
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Display message log to console
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Requires Lock (( M: Mandatory, P: Prohibited, A: Allowed ))
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->u_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->l_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * -. uinst_t->c_lock : P
25cf1a301a396c38e8adf52c15f537b80d2483f7jl */
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_msglog(mblk_t *mp, int direction)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl uchar_t *cur = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl mblk_t *tmp_mp = NULL;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t len;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t line;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t col;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t row;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ulong_t count;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char buffer[70];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char *bufp;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (mp == NULL) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl switch (direction) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case 0:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_NOTE, "!---------- Upper in --------");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case 1:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_NOTE, "!---------- Upper out -------");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case 2:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_NOTE, "!---------- Lower in --------");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl case 3:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_NOTE, "!---------- Lower out -------");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl default:
25cf1a301a396c38e8adf52c15f537b80d2483f7jl return;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl for (tmp_mp = mp; tmp_mp; tmp_mp = tmp_mp->b_cont) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_NOTE, "!db_type = 0x%02x", tmp_mp->b_datap->db_type);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl len = tmp_mp->b_wptr - tmp_mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl line = (len + 31) / 32;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cur = (uchar_t *)tmp_mp->b_rptr;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl count = 0;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl for (col = 0; col < line; col++) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl bufp = buffer;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl for (row = 0; row < 32; row++) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (row != 0 && (row % 8) == 0) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *bufp = ' ';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl bufp++;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) sprintf(bufp, "%02x", *cur);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl bufp += 2;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cur++;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl count++;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (count >= len) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *bufp = '\0';
25cf1a301a396c38e8adf52c15f537b80d2483f7jl cmn_err(CE_NOTE, "!%s", buffer);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (count >= len) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl break;
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl }
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jlvoid
25cf1a301a396c38e8adf52c15f537b80d2483f7jloplmsu_cmn_prt_pathname(dev_info_t *dip)
25cf1a301a396c38e8adf52c15f537b80d2483f7jl{
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char pathname[128];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl char wrkbuf[128];
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) ddi_pathname(dip, wrkbuf);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl *(wrkbuf + strlen(wrkbuf)) = '\0';
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) sprintf(pathname, "/devices%s:%c", wrkbuf,
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki 'a'+ ddi_get_instance(dip));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl
25cf1a301a396c38e8adf52c15f537b80d2483f7jl DBG_PRINT((CE_NOTE, "oplmsu: debug-info: "
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Active path change to path => %s", pathname));
25cf1a301a396c38e8adf52c15f537b80d2483f7jl}
25cf1a301a396c38e8adf52c15f537b80d2483f7jl#endif