1/* 2 * Copyright 2001 Mike Corrigan IBM Corp 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 */ 9#include <linux/stddef.h> 10#include <linux/kernel.h> 11#include <asm/system.h> 12#include <asm/iSeries/HvLpEvent.h> 13#include <asm/iSeries/HvCallEvent.h> 14#include <asm/iSeries/LparData.h> 15 16/* Array of LpEvent handler functions */ 17LpEventHandler lpEventHandler[HvLpEvent_Type_NumTypes]; 18unsigned lpEventHandlerPaths[HvLpEvent_Type_NumTypes]; 19 20/* Register a handler for an LpEvent type */ 21 22int HvLpEvent_registerHandler( HvLpEvent_Type eventType, LpEventHandler handler ) 23{ 24 int rc = 1; 25 if ( eventType < HvLpEvent_Type_NumTypes ) { 26 lpEventHandler[eventType] = handler; 27 rc = 0; 28 } 29 return rc; 30 31} 32 33int HvLpEvent_unregisterHandler( HvLpEvent_Type eventType ) 34{ 35 int rc = 1; 36 if ( eventType < HvLpEvent_Type_NumTypes ) { 37 if ( !lpEventHandlerPaths[eventType] ) { 38 lpEventHandler[eventType] = NULL; 39 rc = 0; 40 } 41 } 42 return rc; 43} 44 45/* (lpIndex is the partition index of the target partition. 46 * needed only for VirtualIo, VirtualLan and SessionMgr. Zero 47 * indicates to use our partition index - for the other types) 48 */ 49int HvLpEvent_openPath( HvLpEvent_Type eventType, HvLpIndex lpIndex ) 50{ 51 int rc = 1; 52 if ( eventType < HvLpEvent_Type_NumTypes && 53 lpEventHandler[eventType] ) { 54 if ( lpIndex == 0 ) 55 lpIndex = itLpNaca.xLpIndex; 56 HvCallEvent_openLpEventPath( lpIndex, eventType ); 57 ++lpEventHandlerPaths[eventType]; 58 rc = 0; 59 } 60 return rc; 61} 62 63int HvLpEvent_closePath( HvLpEvent_Type eventType, HvLpIndex lpIndex ) 64{ 65 int rc = 1; 66 if ( eventType < HvLpEvent_Type_NumTypes && 67 lpEventHandler[eventType] && 68 lpEventHandlerPaths[eventType] ) { 69 if ( lpIndex == 0 ) 70 lpIndex = itLpNaca.xLpIndex; 71 HvCallEvent_closeLpEventPath( lpIndex, eventType ); 72 --lpEventHandlerPaths[eventType]; 73 rc = 0; 74 } 75 return rc; 76} 77 78