1b725ae77Skettenis /* 2b725ae77Skettenis * Copyright (C) 1995 Advanced RISC Machines Limited. All rights reserved. 3b725ae77Skettenis * 4b725ae77Skettenis * This software may be freely used, copied, modified, and distributed 5b725ae77Skettenis * provided that the above copyright notice is preserved in all copies of the 6b725ae77Skettenis * software. 7b725ae77Skettenis */ 8b725ae77Skettenis 9b725ae77Skettenis /* -*-C-*- 10b725ae77Skettenis * 11*63addd46Skettenis * $Revision: 1.3 $ 12*63addd46Skettenis * $Date: 2004/12/27 14:00:54 $ 13b725ae77Skettenis * 14b725ae77Skettenis * 15b725ae77Skettenis * Project: ANGEL 16b725ae77Skettenis * 17b725ae77Skettenis * Title: User interface to the channels layer 18b725ae77Skettenis */ 19b725ae77Skettenis 20b725ae77Skettenis #ifndef angel_channels_h 21b725ae77Skettenis #define angel_channels_h 22b725ae77Skettenis 23b725ae77Skettenis /* 24b725ae77Skettenis * This provides the public interface to the channels layer read and write 25b725ae77Skettenis * routines, and buffer management routines. 26b725ae77Skettenis */ 27b725ae77Skettenis 28b725ae77Skettenis /* Nested header files, if required */ 29b725ae77Skettenis 30b725ae77Skettenis #include "devices.h" 31b725ae77Skettenis #include "chandefs.h" 32b725ae77Skettenis #include "adperr.h" 33b725ae77Skettenis 34b725ae77Skettenis /* General purpose constants, macros, enums, typedefs */ 35b725ae77Skettenis 36b725ae77Skettenis /* use the default device */ 37b725ae77Skettenis #define CH_DEFAULT_DEV ((DeviceID)-1) 38b725ae77Skettenis 39b725ae77Skettenis /* return codes */ 40b725ae77Skettenis typedef enum ChanError { 41b725ae77Skettenis CE_OKAY, /* no error */ 42b725ae77Skettenis CE_ABANDONED, /* abandoned due to device switch */ 43b725ae77Skettenis CE_DEV_ERROR, /* unexpected error from device driver */ 44b725ae77Skettenis CE_BUSY, /* channel in use */ 45b725ae77Skettenis CE_BUFF_ERROR, /* unable to get buffer */ 46b725ae77Skettenis CE_PRIVATE /* start of internal error codes */ 47b725ae77Skettenis } ChanError; 48b725ae77Skettenis 49b725ae77Skettenis 50b725ae77Skettenis /* Publically-accessible globals */ 51b725ae77Skettenis 52b725ae77Skettenis /* 53b725ae77Skettenis * The following two globals are only valid after angel_InitialiseChannels() 54b725ae77Skettenis * has been called. 55b725ae77Skettenis */ 56b725ae77Skettenis 57b725ae77Skettenis /* the default size of a channel buffer, for global use */ 58b725ae77Skettenis extern unsigned Angel_ChanBuffSize; 59b725ae77Skettenis 60b725ae77Skettenis /* the size of a long buffer, for global use */ 61b725ae77Skettenis extern unsigned Angel_ChanLongSize; 62b725ae77Skettenis 63b725ae77Skettenis #ifdef TARGET 64b725ae77Skettenis AdpErrs send_resend_msg(DeviceID devid); 65b725ae77Skettenis #endif 66b725ae77Skettenis 67b725ae77Skettenis /* 68b725ae77Skettenis * Function: angel_InitialiseChannels 69b725ae77Skettenis * Purpose: initialise the channels layer 70b725ae77Skettenis * 71b725ae77Skettenis * Params: 72b725ae77Skettenis * Input: - 73b725ae77Skettenis * Output: - 74b725ae77Skettenis * In/Out: - 75b725ae77Skettenis * 76b725ae77Skettenis * Returns: - 77b725ae77Skettenis * 78b725ae77Skettenis * Reads globals: - 79b725ae77Skettenis * Modifies globals: - 80b725ae77Skettenis * 81b725ae77Skettenis * Other side effects: - 82b725ae77Skettenis */ 83b725ae77Skettenis 84b725ae77Skettenis void angel_InitialiseChannels( void ); 85b725ae77Skettenis 86b725ae77Skettenis /* 87b725ae77Skettenis * Function: adp_init_seq 88b725ae77Skettenis * Purpose: initialise sequence numbers and free anyt leftover buffers 89b725ae77Skettenis * 90b725ae77Skettenis * Params: 91b725ae77Skettenis * Input: - 92b725ae77Skettenis * Output: - 93b725ae77Skettenis * In/Out: - 94b725ae77Skettenis * 95b725ae77Skettenis * Returns: - adp_ok if things went ok else an error code 96b725ae77Skettenis * 97b725ae77Skettenis * Reads globals: - 98b725ae77Skettenis * Modifies globals: - 99b725ae77Skettenis * 100b725ae77Skettenis * Other side effects: - 101b725ae77Skettenis */ 102b725ae77Skettenis 103b725ae77Skettenis AdpErrs adp_init_seq(void); 104b725ae77Skettenis 105b725ae77Skettenis /* 106b725ae77Skettenis * Function: angel_ChannelAllocBuffer 107b725ae77Skettenis * Purpose: allocate a buffer that is at least req_size bytes long 108b725ae77Skettenis * 109b725ae77Skettenis * Params: 110b725ae77Skettenis * Input: req_size the minimum size required 111b725ae77Skettenis * Output: - 112b725ae77Skettenis * In/Out: - 113b725ae77Skettenis * 114b725ae77Skettenis * Returns: pointer to allocated buffer, or 115b725ae77Skettenis * NULL if unable to allocate suitable buffer 116b725ae77Skettenis * 117b725ae77Skettenis * Reads globals: - 118b725ae77Skettenis * Modifies globals: - 119b725ae77Skettenis * 120b725ae77Skettenis * Other side effects: - 121b725ae77Skettenis */ 122b725ae77Skettenis 123b725ae77Skettenis p_Buffer angel_ChannelAllocBuffer(unsigned req_size); 124b725ae77Skettenis 125b725ae77Skettenis 126b725ae77Skettenis /* 127b725ae77Skettenis * Function: angel_ChannelReleaseBuffer 128b725ae77Skettenis * Purpose: release a buffer back to the free pool 129b725ae77Skettenis * 130b725ae77Skettenis * Params: 131b725ae77Skettenis * Input: buffer the buffer to release 132b725ae77Skettenis * Output: - 133b725ae77Skettenis * In/Out: - 134b725ae77Skettenis * 135b725ae77Skettenis * Returns: - 136b725ae77Skettenis * 137b725ae77Skettenis * Reads globals: - 138b725ae77Skettenis * Modifies globals: - 139b725ae77Skettenis * 140b725ae77Skettenis * Other side effects: - 141b725ae77Skettenis */ 142b725ae77Skettenis 143b725ae77Skettenis void angel_ChannelReleaseBuffer(p_Buffer buffer); 144b725ae77Skettenis 145b725ae77Skettenis 146b725ae77Skettenis /* 147b725ae77Skettenis * Function: angel_ChannelSend 148b725ae77Skettenis * Purpose: blocking send of a packet via a channel 149b725ae77Skettenis * 150b725ae77Skettenis * Params: 151b725ae77Skettenis * Input: devid Device to use, or CH_DEFAULT_DEV 152b725ae77Skettenis * chanid Channel to use for tx 153b725ae77Skettenis * buffer Pointer to data to send 154b725ae77Skettenis * len Length of data to send 155b725ae77Skettenis * Output: - 156b725ae77Skettenis * In/Out: - 157b725ae77Skettenis * 158b725ae77Skettenis * Returns: CE_OKAY Transmission completed 159b725ae77Skettenis * CE_BAD_CHAN Channel id invalid 160b725ae77Skettenis * CE_ABANDONED Tx abandoned due to device switch 161b725ae77Skettenis * 162b725ae77Skettenis * Reads globals: - 163b725ae77Skettenis * Modifies globals: - 164b725ae77Skettenis * 165b725ae77Skettenis * Other side effects: - 166b725ae77Skettenis */ 167b725ae77Skettenis 168b725ae77Skettenis ChanError angel_ChannelSend(DeviceID devid, ChannelID chanid, 169b725ae77Skettenis const p_Buffer buffer, unsigned len); 170b725ae77Skettenis 171b725ae77Skettenis 172b725ae77Skettenis /* 173b725ae77Skettenis * Function: angel_ChannelSendAsync 174b725ae77Skettenis * Purpose: asynchronous send of a packet via a channel 175b725ae77Skettenis * 176b725ae77Skettenis * Params: 177b725ae77Skettenis * Input: devid Device to use, or CH_DEFAULT_DEV 178b725ae77Skettenis * chanid Channel to use for tx 179b725ae77Skettenis * buffer Pointer to data to send 180b725ae77Skettenis * len Length of data to send 181b725ae77Skettenis * callback Function to call on completion 182b725ae77Skettenis * callback_data Pointer to pass to callback 183b725ae77Skettenis * Output: - 184b725ae77Skettenis * In/Out: - 185b725ae77Skettenis * 186b725ae77Skettenis * Returns: CE_OKAY Transmission underway 187b725ae77Skettenis * CE_BAD_CHAN Channel id invalid 188b725ae77Skettenis * CE_ABANDONED Tx abandoned due to device switch 189b725ae77Skettenis * 190b725ae77Skettenis * Reads globals: - 191b725ae77Skettenis * Modifies globals: - 192b725ae77Skettenis * 193b725ae77Skettenis * Other side effects: - 194b725ae77Skettenis * 195b725ae77Skettenis * register an asynchronous send on the given channel 196b725ae77Skettenis * (blocks until send can be commenced) 197b725ae77Skettenis */ 198b725ae77Skettenis 199b725ae77Skettenis typedef void (*ChanTx_CB_Fn)(ChannelID chanid, /* which channel */ 200b725ae77Skettenis void *callback_data); /* as supplied... */ 201b725ae77Skettenis 202b725ae77Skettenis 203b725ae77Skettenis ChanError angel_ChannelSendAsync( DeviceID devid, 204b725ae77Skettenis ChannelID chanid, 205b725ae77Skettenis const p_Buffer buffer, 206b725ae77Skettenis unsigned len, 207b725ae77Skettenis ChanTx_CB_Fn callback, 208b725ae77Skettenis void *callback_data); 209b725ae77Skettenis 210b725ae77Skettenis 211b725ae77Skettenis /* 212b725ae77Skettenis * Function: angel_ChannelRead 213b725ae77Skettenis * Purpose: blocking read of a packet from a channel 214b725ae77Skettenis * 215b725ae77Skettenis * Params: 216b725ae77Skettenis * Input: devid Device to use, or CH_DEFAULT_DEV 217b725ae77Skettenis * chanid Channel to use for rx 218b725ae77Skettenis * Output: buffer The buffer, supplied and filled 219b725ae77Skettenis * len How many bytes there are in the buffer 220b725ae77Skettenis * In/Out: - 221b725ae77Skettenis * 222b725ae77Skettenis * Returns: CE_OKAY Reception successful 223b725ae77Skettenis * CE_BAD_CHAN Channel id invalid 224b725ae77Skettenis * CE_ABANDONED Tx abandoned due to device switch 225b725ae77Skettenis * 226b725ae77Skettenis * Reads globals: - 227b725ae77Skettenis * Modifies globals: - 228b725ae77Skettenis * 229b725ae77Skettenis * Other side effects: - 230b725ae77Skettenis * 231b725ae77Skettenis * Note that in the present version, if an asynchronous read has been 232b725ae77Skettenis * registered, a blocking read will be refused with CE_BUSY. 233b725ae77Skettenis */ 234b725ae77Skettenis ChanError angel_ChannelRead(DeviceID devid, 235b725ae77Skettenis ChannelID chanid, 236b725ae77Skettenis p_Buffer *buffer, 237b725ae77Skettenis unsigned *len); 238b725ae77Skettenis 239b725ae77Skettenis 240b725ae77Skettenis /* 241b725ae77Skettenis * Function: angel_ChannelReadAsync 242b725ae77Skettenis * Purpose: asynchronous read of a packet via a channel 243b725ae77Skettenis * 244b725ae77Skettenis * Params: 245b725ae77Skettenis * Input: devid Device to use, or CH_DEFAULT_DEV 246b725ae77Skettenis * chanid Channel to wait on 247b725ae77Skettenis * callback Function to call on completion, or NULL 248b725ae77Skettenis * callback_data Pointer to pass to callback 249b725ae77Skettenis * Output: - 250b725ae77Skettenis * In/Out: - 251b725ae77Skettenis * 252b725ae77Skettenis * Returns: CE_OKAY Read request registered 253b725ae77Skettenis * CE_BAD_CHAN Channel id invalid 254b725ae77Skettenis * CE_BUSY Someone else is using the channel 255b725ae77Skettenis * (in a single threaded world) 256b725ae77Skettenis * 257b725ae77Skettenis * Reads globals: - 258b725ae77Skettenis * Modifies globals: - 259b725ae77Skettenis * 260b725ae77Skettenis * Other side effects: - 261b725ae77Skettenis * 262b725ae77Skettenis * Register an asynchronous read on the given channel. There can only be one 263b725ae77Skettenis * async. reader per channel, and blocking reads are not permitted whilst 264b725ae77Skettenis * an async. reader is registered. 265b725ae77Skettenis * 266b725ae77Skettenis * Reader can unregister by specifying NULL as the callback function. 267b725ae77Skettenis */ 268b725ae77Skettenis 269b725ae77Skettenis typedef void (*ChanRx_CB_Fn)(DeviceID devID, /* ID of receiving device */ 270b725ae77Skettenis ChannelID chanID, /* ID of receiving channel */ 271b725ae77Skettenis p_Buffer buff, /* pointer to buffer */ 272b725ae77Skettenis unsigned len, /* length of data */ 273b725ae77Skettenis void *cb_data /* callback data */ 274b725ae77Skettenis ); 275b725ae77Skettenis 276b725ae77Skettenis ChanError angel_ChannelReadAsync(DeviceID devid, 277b725ae77Skettenis ChannelID chanid, 278b725ae77Skettenis ChanRx_CB_Fn callback, 279b725ae77Skettenis void *callback_data); 280b725ae77Skettenis 281b725ae77Skettenis 282b725ae77Skettenis /* 283b725ae77Skettenis * Function: angel_ChannelReadAll 284b725ae77Skettenis * Purpose: register an asynchronous read across all devices 285b725ae77Skettenis * 286b725ae77Skettenis * Params: 287b725ae77Skettenis * Input: chanid Channel to look for (usually HBOOT) 288b725ae77Skettenis * callback Function to call on completion 289b725ae77Skettenis * callback_data Pointer to pass to callback 290b725ae77Skettenis * Output: - 291b725ae77Skettenis * In/Out: - 292b725ae77Skettenis * 293b725ae77Skettenis * Returns: CE_OKAY Read request registered 294b725ae77Skettenis * CE_BAD_CHAN Channel id invalid 295b725ae77Skettenis * CE_BUSY Someone else is reading all devices 296b725ae77Skettenis * 297b725ae77Skettenis * Reads globals: - 298b725ae77Skettenis * Modifies globals: - 299b725ae77Skettenis * 300b725ae77Skettenis * Other side effects: - 301b725ae77Skettenis * 302b725ae77Skettenis * Register an asynchronous read across all devices. This is a 'fallback', 303b725ae77Skettenis * which will be superseded (temporarily) by a registered reader or blocking 304b725ae77Skettenis * read on a specific device. 305b725ae77Skettenis */ 306b725ae77Skettenis 307b725ae77Skettenis ChanError angel_ChannelReadAll( ChannelID chanid, 308b725ae77Skettenis ChanRx_CB_Fn callback, 309b725ae77Skettenis void *callback_data); 310b725ae77Skettenis 311b725ae77Skettenis 312b725ae77Skettenis 313b725ae77Skettenis /* 314b725ae77Skettenis * Function: angel_ChannelSendThenRead 315b725ae77Skettenis * Purpose: blocking write to followed by read from a channel 316b725ae77Skettenis * 317b725ae77Skettenis * Params: 318b725ae77Skettenis * Input: devid Device to use, or CH_DEFAULT_DEV 319b725ae77Skettenis * chanid Channel to use for rx 320b725ae77Skettenis * In/Out: buffer On entry: the packet to be sent 321b725ae77Skettenis * On return: the packet received 322b725ae77Skettenis * len On entry: length of packet to be sent 323b725ae77Skettenis * On return: length of packet rx'd 324b725ae77Skettenis * In/Out: - 325b725ae77Skettenis * 326b725ae77Skettenis * Returns: CE_OKAY Tx and Reception successful 327b725ae77Skettenis * CE_BAD_CHAN Channel id invalid 328b725ae77Skettenis * CE_ABANDONED Tx abandoned due to device switch 329b725ae77Skettenis * 330b725ae77Skettenis * Reads globals: - 331b725ae77Skettenis * Modifies globals: - 332b725ae77Skettenis * 333b725ae77Skettenis * Other side effects: - 334b725ae77Skettenis * 335b725ae77Skettenis * Note that in the present version, if an asynchronous read has been 336b725ae77Skettenis * registered, this will be refused with CE_BUSY. 337b725ae77Skettenis */ 338b725ae77Skettenis ChanError angel_ChannelSendThenRead(DeviceID devid, 339b725ae77Skettenis ChannelID chanid, 340b725ae77Skettenis p_Buffer *buffer, 341b725ae77Skettenis unsigned *len); 342b725ae77Skettenis 343b725ae77Skettenis 344b725ae77Skettenis /* 345b725ae77Skettenis * Function: angel_ChannelSelectDevice 346b725ae77Skettenis * Purpose: select the device to be used for all channel comms 347b725ae77Skettenis * 348b725ae77Skettenis * Params: 349b725ae77Skettenis * Input: device ID of device to use as the default 350b725ae77Skettenis * Output: - 351b725ae77Skettenis * In/Out: - 352b725ae77Skettenis * 353b725ae77Skettenis * Returns: CE_OKAY Default device selected 354b725ae77Skettenis * CE_BAD_DEV Invalid device ID 355b725ae77Skettenis * 356b725ae77Skettenis * Reads globals: - 357b725ae77Skettenis * Modifies globals: - 358b725ae77Skettenis * 359b725ae77Skettenis * Other side effects: Any channel operations in progress are 360b725ae77Skettenis * abandoned. 361b725ae77Skettenis * 362b725ae77Skettenis * select the device for all channels comms 363b725ae77Skettenis */ 364b725ae77Skettenis 365b725ae77Skettenis ChanError angel_ChannelSelectDevice(DeviceID device); 366b725ae77Skettenis 367b725ae77Skettenis 368b725ae77Skettenis /* 369b725ae77Skettenis * Function: angel_ChannelReadActiveDevice 370b725ae77Skettenis * Purpose: reads the device id of the currently active device 371b725ae77Skettenis * 372b725ae77Skettenis * Params: 373b725ae77Skettenis * Input: device address of a DeviceID variable 374b725ae77Skettenis * Output: *device ID of device currently being used 375b725ae77Skettenis * In/Out: - 376b725ae77Skettenis * 377b725ae77Skettenis * Returns: CE_OKAY Default device selected 378b725ae77Skettenis */ 379b725ae77Skettenis 380b725ae77Skettenis ChanError angel_ChannelReadActiveDevice(DeviceID *device); 381b725ae77Skettenis 382b725ae77Skettenis #endif /* ndef angel_channels_h */ 383b725ae77Skettenis 384b725ae77Skettenis /* EOF channels.h */ 385