oplmsu_ioctl_lrp.c revision 07d06da50d310a325b457d6330165aebab1e0064
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * See the License for the specific language governing permissions
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * and limitations under the License.
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 * CDDL HEADER END
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * All Rights Reserved, Copyright (c) FUJITSU LIMITED 2006
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * LOWER READ SERVICE PROCEDURE
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/* termios ioctl response received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (((iocp->ioc_cmd == TCSETS) && (trad_sts == MSU_WTCS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TCSETSW) && (trad_sts == MSU_WTCS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TCSETSF) && (trad_sts == MSU_WTCS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCMSET) && (trad_sts == MSU_WTMS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCSPPS) && (trad_sts == MSU_WPPS_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCSWINSZ) && (trad_sts == MSU_WWSZ_ACK)) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl ((iocp->ioc_cmd == TIOCSSOFTCAR) && (trad_sts == MSU_WCAR_ACK))) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Status of path is improper");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* xoff/xon received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* Normal termios */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if ((chkflag == MSU_CMD_ACTIVE) || (chkflag == MSU_CMD_STOP)) {
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Continue sending termios ioctls */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change status of new active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Put a message(M_DATA) on a queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Notify of the active path changing */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) prom_opl_switch_console(upath->ser_devcb.lsb);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XON to notify active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change status of stopped or old-active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* == MSU_CMD_ACTIVE */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XOFF to notify all standby paths */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change active path of user node */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Reschedule a queue for service */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Wake up oplmsu_config_stop */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else { /* M_IOCNAK received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* MSU_CMD_STOP for active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Search alternate path from standby paths */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((chkflag == TCSETS) || (chkflag == TCSETSW) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Check sleep flag and wake up thread */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Check sleep flag and wake up thread */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/* M_ERROR or M_HANGUP response received */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl } else if ((upath->traditional_status == MSU_MAKE_INST) ||
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_FAIL, upath->status,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_prechg(lrq, mp, MSU_READ_SIDE, &nmp, &term_ioctl,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl/* M_DATA[xoff/xon] was received from serial port */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Get lower path of active status */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) oplmsu_rcmn_through_hndl(lrq, mp, MSU_NORM);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl "Can't change to specified path");
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_allocmb(lrq, mp, &fmp, sizeof (char), MSU_READ_SIDE) ==
25cf1a301a396c38e8adf52c15f537b80d2483f7jl if (oplmsu_cmn_prechg(lrq, mp, MSU_READ_SIDE, &nmp, &term_ioctl,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * Send termios to new active path and wait response
25cf1a301a396c38e8adf52c15f537b80d2483f7jl * No termios messages are received. Change active path.
25cf1a301a396c38e8adf52c15f537b80d2483f7jl oplmsu_cmn_set_upath_sts(upath, MSU_PSTAT_ACTIVE, upath->status,
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Notify of the active path changing */
07d06da50d310a325b457d6330165aebab1e0064Surya Prakki (void) prom_opl_switch_console(upath->ser_devcb.lsb);
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XON to notify active path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Put a message(M_DATA) on a queue */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Change the status of stop path */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Send XOFF to notify all standby paths */
25cf1a301a396c38e8adf52c15f537b80d2483f7jl /* Reschedule a queue for service */