1/* 2 * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. 3 * 4 * @APPLE_LICENSE_HEADER_START@ 5 * 6 * The contents of this file constitute Original Code as defined in and 7 * are subject to the Apple Public Source License Version 1.1 (the 8 * "License"). You may not use this file except in compliance with the 9 * License. Please obtain a copy of the License at 10 * http://www.apple.com/publicsource and read it before using this file. 11 * 12 * This Original Code and all software distributed under the License are 13 * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17 * License for the specific language governing rights and limitations 18 * under the License. 19 * 20 * @APPLE_LICENSE_HEADER_END@ 21 */ 22 23#ifndef _IOKIT_IOFIREWIRESBP2USERCLIENT_H 24#define _IOKIT_IOFIREWIRESBP2USERCLIENT_H 25 26#include <IOKit/IOUserClient.h> 27 28#define FIREWIREPRIVATE 29#include <IOKit/firewire/IOFireWireController.h> 30#undef FIREWIREPRIVATE 31 32#include <IOKit/firewire/IOFWUserObjectExporter.h> 33 34#include <IOKit/sbp2/IOFireWireSBP2UserClientCommon.h> 35#include <IOKit/sbp2/IOFireWireSBP2LUN.h> 36 37class IOFireWireSBP2UserClient : public IOUserClient 38{ 39 OSDeclareDefaultStructors(IOFireWireSBP2UserClient) 40 41protected: 42 43 bool fOpened; 44 bool fStarted; 45 IOFireWireSBP2Login * fLogin; 46 task_t fTask; 47 48 IOFireWireSBP2LUN * fProviderLUN; 49 OSAsyncReference64 fMessageCallbackAsyncRef; 50 OSAsyncReference64 fLoginCallbackAsyncRef; 51 OSAsyncReference64 fLogoutCallbackAsyncRef; 52 OSAsyncReference64 fUnsolicitedStatusNotifyAsyncRef; 53 OSAsyncReference64 fStatusNotifyAsyncRef; 54 OSAsyncReference64 fFetchAgentResetAsyncRef; 55 OSAsyncReference64 fFetchAgentWriteAsyncRef; 56 57 IOFWUserObjectExporter * fExporter; 58 59 IOFireWireLib::UserObjectHandle fSessionRef; 60 61 virtual IOReturn externalMethod( uint32_t selector, 62 IOExternalMethodArguments * args, 63 IOExternalMethodDispatch * dispatch, 64 OSObject * target, 65 void * reference ); 66public: 67 68 virtual bool initWithTask( task_t owningTask, void * securityToken, UInt32 type, OSDictionary * properties ); 69 virtual void free (); 70 71 virtual bool start( IOService * provider ); 72 73 virtual IOReturn clientClose( void ); 74 virtual IOReturn clientDied( void ); 75 76 // IOFireWireSBP2ManagementORB friend class wrappers 77 virtual void flushAllManagementORBs( void ); 78 79 ///////////////////////////////////////////////// 80 // IOFireWireSBP2LUN 81 82 IOReturn open( IOExternalMethodArguments * arguments ); 83 IOReturn openWithSessionRef( IOExternalMethodArguments * arguments ); 84 IOReturn getSessionRef( IOExternalMethodArguments * arguments ); 85 IOReturn close( IOExternalMethodArguments * arguments ); 86 87 // callbacks 88 IOReturn setMessageCallback( IOExternalMethodArguments * arguments ); 89 virtual IOReturn message( UInt32 type, IOService * provider, void * arg ); 90 91 ///////////////////////////////////////////////// 92 // IOFireWireSBP2Login 93 94 IOReturn setLoginCallback( IOExternalMethodArguments * arguments ); 95 IOReturn setLogoutCallback( IOExternalMethodArguments * arguments ); 96 IOReturn setUnsolicitedStatusNotify( IOExternalMethodArguments * arguments ); 97 IOReturn setStatusNotify( IOExternalMethodArguments * arguments ); 98 IOReturn createLogin( IOExternalMethodArguments * arguments ); 99 IOReturn releaseLogin( IOExternalMethodArguments * arguments ); 100 IOReturn submitLogin( IOExternalMethodArguments * arguments ); 101 IOReturn submitLogout( IOExternalMethodArguments * arguments ); 102 IOReturn setLoginFlags( IOExternalMethodArguments * arguments ); 103 IOReturn getMaxCommandBlockSize( IOExternalMethodArguments * arguments ); 104 IOReturn getLoginID( IOExternalMethodArguments * arguments ); 105 IOReturn setReconnectTime( IOExternalMethodArguments * arguments ); 106 IOReturn setMaxPayloadSize( IOExternalMethodArguments * arguments ); 107 108 IOReturn submitFetchAgentReset( IOExternalMethodArguments * arguments ); 109 IOReturn setFetchAgentWriteCompletion( IOExternalMethodArguments * arguments ); 110 IOReturn ringDoorbell( IOExternalMethodArguments * arguments ); 111 IOReturn enableUnsolicitedStatus( IOExternalMethodArguments * arguments ); 112 IOReturn setBusyTimeoutRegisterValue( IOExternalMethodArguments * arguments ); 113 IOReturn setPassword( IOExternalMethodArguments * arguments ); 114 115 // callbacks 116 117 static void staticLoginCallback( void * refCon, FWSBP2LoginCompleteParamsPtr params ); 118 virtual void loginCallback( FWSBP2LoginCompleteParamsPtr params ); 119 120 static void staticLogoutCallback( void * refCon, FWSBP2LogoutCompleteParamsPtr params ); 121 virtual void logoutCallback( FWSBP2LogoutCompleteParamsPtr params ); 122 123 static void staticStatusNotify( void * refCon, FWSBP2NotifyParams * params ); 124 virtual void statusNotify( FWSBP2NotifyParams * params ); 125 126 static void staticUnsolicitedNotify( void * refCon, FWSBP2NotifyParams * params ); 127 virtual void unsolicitedNotify( FWSBP2NotifyParams * params ); 128 129 static void staticFetchAgentWriteComplete( void * refCon, IOReturn status, IOFireWireSBP2ORB * orb ); 130 virtual void fetchAgentWriteComplete( IOReturn status, IOFireWireSBP2ORB * orb ); 131 132 static void staticFetchAgentResetComplete( void * refCon, IOReturn status ); 133 virtual void fetchAgentResetComplete( IOReturn status ); 134 135 ///////////////////////////////////////////////// 136 // IOFireWireSBP2ORB 137 138 IOReturn createORB( IOExternalMethodArguments * arguments ); 139 IOReturn releaseORB( IOExternalMethodArguments * arguments ); 140 IOReturn submitORB( IOExternalMethodArguments * arguments ); 141 IOReturn setCommandFlags( IOExternalMethodArguments * arguments ); 142 IOReturn setORBRefCon( IOExternalMethodArguments * arguments ); 143 IOReturn setMaxORBPayloadSize( IOExternalMethodArguments * arguments ); 144 IOReturn setCommandTimeout( IOExternalMethodArguments * arguments ); 145 IOReturn setCommandGeneration( IOExternalMethodArguments * arguments ); 146 IOReturn setToDummy( IOExternalMethodArguments * arguments ); 147 IOReturn setCommandBuffersAsRanges( IOExternalMethodArguments * arguments ); 148 IOReturn releaseCommandBuffers( IOExternalMethodArguments * arguments ); 149 IOReturn setCommandBlock( IOExternalMethodArguments * arguments ); 150 151 // LSI workaround 152 IOReturn LSIWorkaroundSetCommandBuffersAsRanges( IOExternalMethodArguments * arguments ); 153 IOReturn LSIWorkaroundSyncBuffersForOutput( IOExternalMethodArguments * arguments ); 154 IOReturn LSIWorkaroundSyncBuffersForInput( IOExternalMethodArguments * arguments ); 155 156 ///////////////////////////////////////////////// 157 // IOFireWireSBP2MgmtORB 158 159 IOReturn createMgmtORB( IOExternalMethodArguments * arguments ); 160 IOReturn releaseMgmtORB( IOExternalMethodArguments * arguments ); 161 IOReturn setMgmtORBCallback( IOExternalMethodArguments * arguments ); 162 IOReturn submitMgmtORB( IOExternalMethodArguments * arguments ); 163 IOReturn setMgmtORBCommandFunction( IOExternalMethodArguments * arguments ); 164 IOReturn setMgmtORBManageeORB( IOExternalMethodArguments * arguments ); 165 IOReturn setMgmtORBManageeLogin( IOExternalMethodArguments * arguments ); 166 IOReturn setMgmtORBResponseBuffer( IOExternalMethodArguments * arguments ); 167 168 // callbacks 169 static void staticMgmtORBCallback( void * refCon, IOReturn status, IOFireWireSBP2ManagementORB * orb ); 170 virtual void mgmtORBCallback( IOReturn status, IOFireWireSBP2ManagementORB * orb ); 171 172 // IOFireWireSBP2MgmtORB friend class wrappers 173 virtual void setMgmtORBAsyncCallbackReference( IOFireWireSBP2ManagementORB * orb, void * asyncRef ); 174 virtual void getMgmtORBAsyncCallbackReference( IOFireWireSBP2ManagementORB * orb, void * asyncRef ); 175 176 uint32_t checkScalarInputCount; 177 uint32_t checkStructureInputSize; 178 uint32_t checkScalarOutputCount; 179 uint32_t checkStructureOutputSize; 180 181 IOReturn checkArguments( IOExternalMethodArguments * args, uint32_t scalarInCount, uint32_t structInCount, 182 uint32_t scalarOutCount, uint32_t structOutCount ); 183 184}; 185 186#endif