source: rtems/cpukit/sapi/src/io.c @ 4d111157

Last change on this file since 4d111157 was 4d111157, checked in by Joel Sherrill <joel.sherrill@…>, on 08/28/07 at 14:03:52

2007-08-28 Joel Sherrill <joel.sherrill@…>

PR 1256/networking

  • ftpd/ftpd.c, sapi/src/io.c: Fix unaligned access.
  • Property mode set to 100644
File size: 9.8 KB
Line 
1/*
2 *  Input/Output Manager
3 *
4 *
5 *  COPYRIGHT (c) 1989-1999.
6 *  On-Line Applications Research Corporation (OAR).
7 *
8 *  The license and distribution terms for this file may be
9 *  found in the file LICENSE in this distribution or at
10 *  http://www.rtems.com/license/LICENSE.
11 *
12 *  $Id$
13 */
14
15#if HAVE_CONFIG_H
16#include "config.h"
17#endif
18
19#include <rtems/system.h>
20#include <rtems/io.h>
21#include <rtems/score/isr.h>
22#include <rtems/score/thread.h>
23#include <rtems/score/wkspace.h>
24
25#include <string.h>
26
27/*PAGE
28 *
29 *  _IO_Manager_initialization
30 *
31 *  The IO manager has been extended to support runtime driver
32 *  registration. The driver table is now allocated in the
33 *  workspace.
34 *
35 */
36
37void _IO_Manager_initialization(
38    rtems_driver_address_table *driver_table,
39    uint32_t                    drivers_in_table,
40    uint32_t                    number_of_drivers,
41    uint32_t                    number_of_devices
42)
43{
44  void                *tmp;
45  uint32_t             index;
46  rtems_driver_name_t *np;
47
48  if ( number_of_drivers < drivers_in_table )
49      number_of_drivers = drivers_in_table;
50
51  tmp = _Workspace_Allocate_or_fatal_error(
52    sizeof( rtems_driver_address_table ) * ( number_of_drivers )
53  );
54
55  _IO_Driver_address_table = (rtems_driver_address_table *) tmp;
56
57  memset(
58    _IO_Driver_address_table, 0,
59    sizeof( rtems_driver_address_table ) * ( number_of_drivers )
60  );
61
62  if ( drivers_in_table )
63      for ( index = 0 ; index < drivers_in_table ; index++ )
64        _IO_Driver_address_table[index] = driver_table[index];
65
66  _IO_Number_of_drivers = number_of_drivers;
67  _IO_Number_of_devices = number_of_devices;
68
69  tmp = _Workspace_Allocate_or_fatal_error(
70    sizeof( rtems_driver_name_t ) * ( number_of_devices + 1 )
71  );
72
73  _IO_Driver_name_table = (rtems_driver_name_t *) tmp;
74
75  for( index=0, np = _IO_Driver_name_table ;
76       index < _IO_Number_of_devices ;
77       index++, np++ ) {
78    np->device_name = 0;
79    np->device_name_length = 0;
80    np->major = 0;
81    np->minor = 0;
82  }
83}
84
85/*PAGE
86 *
87 *  _IO_Initialize_all_drivers
88 *
89 *  This routine initializes all device drivers
90 *
91 *  Input Paramters:   NONE
92 *
93 *  Output Parameters: NONE
94 */
95
96void _IO_Initialize_all_drivers( void )
97{
98   rtems_device_major_number major;
99
100   for ( major=0 ; major < _IO_Number_of_drivers ; major ++ )
101     (void) rtems_io_initialize( major, 0, NULL);
102}
103
104/*PAGE
105 *
106 *  rtems_io_register_driver
107 *
108 *  Register a driver into the device driver table.
109 *
110 *  Input Paramters:
111 *    major            - device major number (0 means allocate
112 *                       a number)
113 *    driver_table     - driver callout function table
114 *    registered_major - the major number which is registered
115 *
116 *  Output Parameters:
117 *    RTEMS_SUCCESSFUL - if successful
118 *    error code       - if unsuccessful
119 */
120
121rtems_status_code rtems_io_register_driver(
122    rtems_device_major_number   major,
123    rtems_driver_address_table *driver_table,
124    rtems_device_major_number  *registered_major
125)
126{
127    *registered_major = 0;
128
129    /*
130     * Test for initialise/open being present to indicate the driver slot is
131     * in use.
132     */
133
134    if ( major >= _IO_Number_of_drivers )
135      return RTEMS_INVALID_NUMBER;
136
137    if ( major == 0 )
138    {
139        bool found = FALSE;
140        for ( major = _IO_Number_of_drivers - 1 ; major ; major-- )
141            if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
142                 _IO_Driver_address_table[major].open_entry == 0 ) {
143                found = FALSE;
144                break;
145            }
146
147        if ( !found )
148          return RTEMS_TOO_MANY;
149    }
150
151    if ( _IO_Driver_address_table[major].initialization_entry == 0 &&
152         _IO_Driver_address_table[major].open_entry == 0 )
153    {
154        _IO_Driver_address_table[major] = *driver_table;
155        *registered_major               = major;
156
157        rtems_io_initialize( major, 0, NULL );
158
159        return RTEMS_SUCCESSFUL;
160    }
161
162    return RTEMS_RESOURCE_IN_USE;
163}
164
165/*PAGE
166 *
167 *  rtems_io_unregister_driver
168 *
169 *  Unregister a driver from the device driver table.
170 *
171 *  Input Paramters:
172 *    major            - device major number
173 *
174 *  Output Parameters:
175 *    RTEMS_SUCCESSFUL - if successful
176 *    error code       - if unsuccessful
177 */
178
179rtems_status_code rtems_io_unregister_driver(
180    rtems_device_major_number major
181)
182{
183    if ( major < _IO_Number_of_drivers )
184    {
185        memset(
186            &_IO_Driver_address_table[major],
187            0,
188            sizeof( rtems_driver_address_table )
189        );
190        return RTEMS_SUCCESSFUL;
191    }
192    return RTEMS_UNSATISFIED;
193}
194
195/*PAGE
196 *
197 *  rtems_io_register_name
198 *
199 *  Associate a name with a driver
200 *
201 *  Input Paramters:
202 *    device_name - pointer to name string to associate with device
203 *    major       - device major number to receive name
204 *    minor       - device minor number to receive name
205 *
206 *  Output Parameters:
207 *    RTEMS_SUCCESSFUL - if successful
208 *    error code       - if unsuccessful
209 */
210
211#if 0
212rtems_status_code rtems_io_register_name(
213    const char *device_name,
214    rtems_device_major_number major,
215    rtems_device_minor_number minor
216  )
217{
218    rtems_driver_name_t *np;
219    uint32_t   level;
220    uint32_t   index;
221
222    /* find an empty slot */
223    for( index=0, np = _IO_Driver_name_table ;
224         index < _IO_Number_of_devices ;
225         index++, np++ )
226    {
227
228        _ISR_Disable(level);
229        if (np->device_name == 0)
230        {
231            np->device_name = device_name;
232            np->device_name_length = strlen(device_name);
233            np->major = major;
234            np->minor = minor;
235            _ISR_Enable(level);
236
237            return RTEMS_SUCCESSFUL;
238        }
239        _ISR_Enable(level);
240    }
241
242    return RTEMS_TOO_MANY;
243}
244#endif
245
246/*PAGE
247 *
248 *  rtems_io_initialize
249 *
250 *  This routine is the initialization directive of the IO manager.
251 *
252 *  Input Paramters:
253 *    major        - device driver number
254 *    minor        - device number
255 *    argument     - pointer to argument(s)
256 *
257 *  Output Parameters:
258 *    returns       - return code
259 */
260
261rtems_status_code rtems_io_initialize(
262  rtems_device_major_number  major,
263  rtems_device_minor_number  minor,
264  void                      *argument
265)
266{
267    rtems_device_driver_entry callout;
268
269    if ( major >= _IO_Number_of_drivers )
270        return RTEMS_INVALID_NUMBER;
271
272    callout = _IO_Driver_address_table[major].initialization_entry;
273    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
274}
275
276/*PAGE
277 *
278 *  rtems_io_open
279 *
280 *  This routine is the open directive of the IO manager.
281 *
282 *  Input Paramters:
283 *    major        - device driver number
284 *    minor        - device number
285 *    argument     - pointer to argument(s)
286 *
287 *  Output Parameters:
288 *    returns       - return code
289 */
290
291rtems_status_code rtems_io_open(
292  rtems_device_major_number  major,
293  rtems_device_minor_number  minor,
294  void                      *argument
295)
296{
297    rtems_device_driver_entry callout;
298
299    if ( major >= _IO_Number_of_drivers )
300        return RTEMS_INVALID_NUMBER;
301
302    callout = _IO_Driver_address_table[major].open_entry;
303    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
304}
305
306/*PAGE
307 *
308 *  rtems_io_close
309 *
310 *  This routine is the close directive of the IO manager.
311 *
312 *  Input Paramters:
313 *    major        - device driver number
314 *    minor        - device number
315 *    argument     - pointer to argument(s)
316 *
317 *  Output Parameters:
318 *    returns       - return code
319 */
320
321rtems_status_code rtems_io_close(
322  rtems_device_major_number  major,
323  rtems_device_minor_number  minor,
324  void                      *argument
325)
326{
327    rtems_device_driver_entry callout;
328
329    if ( major >= _IO_Number_of_drivers )
330        return RTEMS_INVALID_NUMBER;
331
332    callout = _IO_Driver_address_table[major].close_entry;
333    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
334}
335
336/*PAGE
337 *
338 *  rtems_io_read
339 *
340 *  This routine is the read directive of the IO manager.
341 *
342 *  Input Paramters:
343 *    major        - device driver number
344 *    minor        - device number
345 *    argument     - pointer to argument(s)
346 *
347 *  Output Parameters:
348 *    returns       - return code
349 */
350
351rtems_status_code rtems_io_read(
352  rtems_device_major_number  major,
353  rtems_device_minor_number  minor,
354  void                      *argument
355)
356{
357    rtems_device_driver_entry callout;
358
359    if ( major >= _IO_Number_of_drivers )
360        return RTEMS_INVALID_NUMBER;
361
362    callout = _IO_Driver_address_table[major].read_entry;
363    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
364}
365
366/*PAGE
367 *
368 *  rtems_io_write
369 *
370 *  This routine is the write directive of the IO manager.
371 *
372 *  Input Paramters:
373 *    major        - device driver number
374 *    minor        - device number
375 *    argument     - pointer to argument(s)
376 *
377 *  Output Parameters:
378 *    returns       - return code
379 */
380
381rtems_status_code rtems_io_write(
382  rtems_device_major_number  major,
383  rtems_device_minor_number  minor,
384  void                      *argument
385)
386{
387    rtems_device_driver_entry callout;
388
389    if ( major >= _IO_Number_of_drivers )
390        return RTEMS_INVALID_NUMBER;
391
392    callout = _IO_Driver_address_table[major].write_entry;
393    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
394}
395
396/*PAGE
397 *
398 *  rtems_io_control
399 *
400 *  This routine is the control directive of the IO manager.
401 *
402 *  Input Paramters:
403 *    major        - device driver number
404 *    minor        - device number
405 *    argument     - pointer to argument(s)
406 *
407 *  Output Parameters:
408 *    returns       - return code
409 */
410
411rtems_status_code rtems_io_control(
412  rtems_device_major_number  major,
413  rtems_device_minor_number  minor,
414  void                      *argument
415)
416{
417    rtems_device_driver_entry callout;
418
419    if ( major >= _IO_Number_of_drivers )
420        return RTEMS_INVALID_NUMBER;
421
422    callout = _IO_Driver_address_table[major].control_entry;
423    return callout ? callout(major, minor, argument) : RTEMS_SUCCESSFUL;
424}
Note: See TracBrowser for help on using the repository browser.