xref: /openbsd-src/gnu/usr.bin/binutils/gdb/rdi-share/devsw.h (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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 #ifndef angsd_devsw_h
16b725ae77Skettenis #define angsd_devsw_h
17b725ae77Skettenis 
18b725ae77Skettenis #include "devclnt.h"
19b725ae77Skettenis #include "adperr.h"
20b725ae77Skettenis #include "drivers.h"
21b725ae77Skettenis 
22b725ae77Skettenis #ifndef __cplusplus
23b725ae77Skettenis typedef struct Packet Packet;
24b725ae77Skettenis typedef struct DevSWState DevSWState;
25b725ae77Skettenis #endif
26b725ae77Skettenis 
27b725ae77Skettenis /*
28b725ae77Skettenis  * the basic structure used for passing packets around
29b725ae77Skettenis  */
30b725ae77Skettenis struct Packet
31b725ae77Skettenis {
32b725ae77Skettenis     struct Packet *pk_next;             /* XXX first field in struct */
33b725ae77Skettenis     unsigned int   pk_length;
34b725ae77Skettenis     unsigned char *pk_buffer;
35b725ae77Skettenis };
36b725ae77Skettenis 
37b725ae77Skettenis /*
38b725ae77Skettenis  * control structure, used for maintaining device switcher state
39b725ae77Skettenis  */
40b725ae77Skettenis struct DevSWState
41b725ae77Skettenis {
42b725ae77Skettenis     unsigned int  ds_opendevchans;      /* bitmap of open device channels */
43b725ae77Skettenis 
44b725ae77Skettenis     /*
45b725ae77Skettenis      * queue of packets read for the various device channels
46b725ae77Skettenis      */
47b725ae77Skettenis     Packet       *ds_readqueue[DC_NUM_CHANNELS];
48b725ae77Skettenis 
49b725ae77Skettenis     /*
50b725ae77Skettenis      * structures for managing active read and write operations
51b725ae77Skettenis      */
52b725ae77Skettenis     Packet       *ds_nextreadpacket;
53b725ae77Skettenis     DriverCall    ds_activeread;
54b725ae77Skettenis     DriverCall    ds_activewrite;
55b725ae77Skettenis };
56b725ae77Skettenis 
57b725ae77Skettenis #ifdef __cplusplus
58b725ae77Skettenis     extern "C" {
59b725ae77Skettenis #endif
60b725ae77Skettenis 
61b725ae77Skettenis /*
62b725ae77Skettenis  *  Function: DevSW_AllocatePacket
63b725ae77Skettenis  *   Purpose: Claim some memory to hold a struct Packet, and the buffer for
64b725ae77Skettenis  *              that packet.
65b725ae77Skettenis  *
66b725ae77Skettenis  *    Params:
67b725ae77Skettenis  *       Input: length  Size of the buffer in struct Packet.
68b725ae77Skettenis  *
69b725ae77Skettenis  *   Returns:
70b725ae77Skettenis  *          OK: Pointer to the newly malloc()ed Packet.
71b725ae77Skettenis  *       Error: NULL
72b725ae77Skettenis  */
73b725ae77Skettenis Packet *DevSW_AllocatePacket(const unsigned int length);
74b725ae77Skettenis 
75b725ae77Skettenis /*
76b725ae77Skettenis  *  Function: DevSW_FreePacket
77b725ae77Skettenis  *   Purpose: Free the memory associated with a struct Packet.
78b725ae77Skettenis  *
79b725ae77Skettenis  *  Pre-conditions The structure must have been originally claimed
80b725ae77Skettenis  *                      via DevSW_AllocatePacket.
81b725ae77Skettenis  *
82b725ae77Skettenis  *    Params:
83b725ae77Skettenis  *       Input: pk      The packet to be freed.
84b725ae77Skettenis  *
85b725ae77Skettenis  *   Returns: Nothing
86b725ae77Skettenis  */
87b725ae77Skettenis void DevSW_FreePacket(Packet *pk);
88b725ae77Skettenis 
89b725ae77Skettenis /*
90b725ae77Skettenis  *  Function: DevSW_Open
91b725ae77Skettenis  *   Purpose: Open the specified device driver
92b725ae77Skettenis  *
93b725ae77Skettenis  *    Params:
94b725ae77Skettenis  *       Input: name    Identifies which device to open.  This can either be
95b725ae77Skettenis  *                      a host specific identifier (e.g. "/dev/ttya",
96b725ae77Skettenis  *                      "COM1:"), or a number which is used to refer to
97b725ae77Skettenis  *                      `standard' interfaces, so "1" would be the first host
98b725ae77Skettenis  *                      interface, "2" the second, and so on.
99b725ae77Skettenis  *
100b725ae77Skettenis  *              arg     Driver specific arguments.  For example, some serial
101b725ae77Skettenis  *                      drivers accept speed and control arguments such as
102b725ae77Skettenis  *                      "9600" or "19200/NO_BREAK".  These arguments are
103b725ae77Skettenis  *                      completely free-form: it is the individual drivers
104b725ae77Skettenis  *                      which do the necessary interpretation.
105b725ae77Skettenis  *
106b725ae77Skettenis  *              type    The type of packet the caller is interested in.  Only
107b725ae77Skettenis  *                      one open is allowed for each type of packet.
108b725ae77Skettenis  *
109b725ae77Skettenis  *      In/Out: device  The device driver to open
110b725ae77Skettenis  *
111b725ae77Skettenis  *   Returns:
112b725ae77Skettenis  *          OK: adp_ok
113b725ae77Skettenis  *       Error: adp_device_open_failed
114b725ae77Skettenis  *              adp_device_already_open
115b725ae77Skettenis  *              adp_malloc_failure
116b725ae77Skettenis  */
117b725ae77Skettenis AdpErrs DevSW_Open(DeviceDescr *device, const char *name, const char *arg,
118b725ae77Skettenis                    const DevChanID type);
119b725ae77Skettenis 
120b725ae77Skettenis /*
121b725ae77Skettenis  *  Function: DevSW_Match
122b725ae77Skettenis  *   Purpose: Minimal veneer for DeviceMatch
123b725ae77Skettenis  *
124b725ae77Skettenis  *    Params:
125b725ae77Skettenis  *       Input: device  The device driver to match.
126b725ae77Skettenis  *
127b725ae77Skettenis  *              name    Identifies which device to open.  This can either be
128b725ae77Skettenis  *                      a host specific identifier (e.g. "/dev/ttya",
129b725ae77Skettenis  *                      "COM1:"), or a number which is used to refer to
130b725ae77Skettenis  *                      `standard' interfaces, so "1" would be the first host
131b725ae77Skettenis  *                      interface, "2" the second, and so on.
132b725ae77Skettenis  *
133b725ae77Skettenis  *              arg     Driver specific arguments.  For example, some serial
134b725ae77Skettenis  *                      drivers accept speed and control arguments such as
135b725ae77Skettenis  *                      "9600" or "19200/NO_BREAK".  These arguments are
136b725ae77Skettenis  *                      completely free-form: it is the individual drivers
137b725ae77Skettenis  *                      which do the necessary interpretation.
138b725ae77Skettenis  *
139b725ae77Skettenis  *   Returns:
140b725ae77Skettenis  *          OK: adp_ok
141b725ae77Skettenis  *       Error: adp_failed
142b725ae77Skettenis  */
143b725ae77Skettenis AdpErrs DevSW_Match(const DeviceDescr *device, const char *name,
144b725ae77Skettenis                     const char *arg);
145b725ae77Skettenis 
146b725ae77Skettenis /*
147b725ae77Skettenis  *  Function: DevSW_Close
148b725ae77Skettenis  *   Purpose: Close the specified device driver. All packets of the type
149b725ae77Skettenis  *              used by the caller held within the switching layer will
150b725ae77Skettenis  *              be discarded.
151b725ae77Skettenis  *
152b725ae77Skettenis  *  Pre-conditions: Device must have been previously opened.
153b725ae77Skettenis  *
154b725ae77Skettenis  *    Params:
155b725ae77Skettenis  *       Input: device  The device driver to close
156b725ae77Skettenis  *
157b725ae77Skettenis  *              type    The type of packet the caller was interested in.
158b725ae77Skettenis  *
159b725ae77Skettenis  *   Returns:
160b725ae77Skettenis  *          OK: adp_ok
161b725ae77Skettenis  *       Error: adp_device_not_open
162b725ae77Skettenis  */
163b725ae77Skettenis AdpErrs DevSW_Close(DeviceDescr *device, const DevChanID type);
164b725ae77Skettenis 
165b725ae77Skettenis /*
166b725ae77Skettenis  *  Function: DevSW_Read
167b725ae77Skettenis  *   Purpose: Read a packet of appropriate type from the device driver
168b725ae77Skettenis  *
169b725ae77Skettenis  *    Params:
170b725ae77Skettenis  *       Input: device  The device driver to read packet from.
171b725ae77Skettenis  *
172b725ae77Skettenis  *              type    The type of packet the caller is interested in.
173b725ae77Skettenis  *
174b725ae77Skettenis  *      Output: packet  Pointer to new packet (if one is available)
175b725ae77Skettenis  *              NULL (if no complete packet is available)
176b725ae77Skettenis  *
177b725ae77Skettenis  *       Input: block   If TRUE, read may safely block for a short period
178b725ae77Skettenis  *                      of time (say up to 20ms), to avoid high CPU load
179b725ae77Skettenis  *                      whilst waiting for a reply.
180b725ae77Skettenis  *                      If FALSE, read MUST NOT block.
181b725ae77Skettenis  *
182b725ae77Skettenis  *   Returns:
183b725ae77Skettenis  *          OK: adp_ok
184b725ae77Skettenis  *       Error: adp_bad_packet
185b725ae77Skettenis  *
186b725ae77Skettenis  * Post-conditions: The calling function is responsible for freeing the
187b725ae77Skettenis  *                      resources used by the packet when it is no longer
188b725ae77Skettenis  *                      needed.
189b725ae77Skettenis  */
190b725ae77Skettenis AdpErrs DevSW_Read(const DeviceDescr *device, const DevChanID type,
191b725ae77Skettenis                    Packet **packet, bool block);
192b725ae77Skettenis 
193b725ae77Skettenis /*
194b725ae77Skettenis  *  Function: DevSW_Write
195b725ae77Skettenis  *   Purpose: Try to write a packet to the device driver.  The write will
196b725ae77Skettenis  *              be bounced if another write is still in progress.
197b725ae77Skettenis  *
198b725ae77Skettenis  *    Params:
199b725ae77Skettenis  *       Input: device  The device driver to write a packet to.
200b725ae77Skettenis  *
201b725ae77Skettenis  *              packet  The packet to be written.
202b725ae77Skettenis  *
203b725ae77Skettenis  *              type    The type to be assigned to the packet.
204b725ae77Skettenis  *
205b725ae77Skettenis  *   Returns:
206b725ae77Skettenis  *          OK: adp_ok
207b725ae77Skettenis  *       Error: adp_illegal_args
208b725ae77Skettenis  *              adp_write_busy
209b725ae77Skettenis  *
210b725ae77Skettenis  * Post-conditions: The calling function retains "ownership" of the packet,
211b725ae77Skettenis  *                      i.e. it is responsible for freeing the resources used
212b725ae77Skettenis  *                      by the packet when it is no longer needed.
213b725ae77Skettenis  */
214b725ae77Skettenis AdpErrs DevSW_Write(const DeviceDescr *device, Packet *packet, DevChanID type);
215b725ae77Skettenis 
216b725ae77Skettenis /*
217b725ae77Skettenis  *  Function: DevSW_FlushPendingWrite
218b725ae77Skettenis  *   Purpose: If a write is in progress, give it a chance to finish.
219b725ae77Skettenis  *
220b725ae77Skettenis  *    Params:
221b725ae77Skettenis  *       Input: device  The device driver to flush.
222b725ae77Skettenis  *
223b725ae77Skettenis  *   Returns:
224b725ae77Skettenis  *              adp_ok           no pending write, or write flushed completely
225b725ae77Skettenis  *              adp_write_busy   pending write not flushed completely
226b725ae77Skettenis  */
227b725ae77Skettenis AdpErrs DevSW_FlushPendingWrite(const DeviceDescr *device);
228b725ae77Skettenis 
229b725ae77Skettenis /*
230b725ae77Skettenis  *  Function: DevSW_Ioctl
231b725ae77Skettenis  *   Purpose: Perform miscellaneous control operations.  This is a minimal
232b725ae77Skettenis  *              veneer to DeviceIoctl.
233b725ae77Skettenis  *
234b725ae77Skettenis  *    Params:
235b725ae77Skettenis  *       Input: device  The device driver to control.
236b725ae77Skettenis  *
237b725ae77Skettenis  *              opcode  Reason code indicating the operation to perform.
238b725ae77Skettenis  *
239b725ae77Skettenis  *      In/Out: args    Pointer to opcode-sensitive arguments/result space.
240b725ae77Skettenis  *
241b725ae77Skettenis  *   Returns:
242b725ae77Skettenis  *          OK: adp_ok
243b725ae77Skettenis  *       Error: adp_failed
244b725ae77Skettenis  */
245b725ae77Skettenis AdpErrs DevSW_Ioctl(const DeviceDescr *device, const int opcode, void *args);
246b725ae77Skettenis 
247b725ae77Skettenis /*
248b725ae77Skettenis  *  Function: DevSW_WriteFinished
249b725ae77Skettenis  *   Purpose: Return TRUE if the active device has finished writing
250b725ae77Skettenis  *              the last packet to be sent, or FALSE if a packet is still
251b725ae77Skettenis  *              being transmitted.
252b725ae77Skettenis  *
253b725ae77Skettenis  *    Params:
254b725ae77Skettenis  *       Input: device  The device driver to check.
255b725ae77Skettenis  *
256b725ae77Skettenis  *   Returns:
257b725ae77Skettenis  *        TRUE: write finished or inactive
258b725ae77Skettenis  *       FALSE: write in progress
259b725ae77Skettenis  */
260b725ae77Skettenis bool DevSW_WriteFinished(const DeviceDescr *device);
261b725ae77Skettenis 
262b725ae77Skettenis 
263b725ae77Skettenis /*
264b725ae77Skettenis  * set filename and enable/disable logginf of ADP packets
265b725ae77Skettenis  */
266b725ae77Skettenis void DevSW_SetLogfile(const char *filename);
267b725ae77Skettenis void DevSW_SetLogEnable(int logEnableFlag);
268b725ae77Skettenis 
269b725ae77Skettenis #ifdef __cplusplus
270b725ae77Skettenis     }
271b725ae77Skettenis #endif
272b725ae77Skettenis 
273b725ae77Skettenis #endif /* ndef angsd_devsw_h */
274b725ae77Skettenis 
275b725ae77Skettenis /* EOF devsw.h */
276