4 * DSP-BIOS Bridge driver support functions for TI OMAP processors.
6 * Implementation of Bridge Bridge driver device operations.
8 * Copyright (C) 2005-2006 Texas Instruments, Inc.
10 * This package is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
14 * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18 #include <linux/types.h>
19 #include <linux/list.h>
21 /* ----------------------------------- Host OS */
22 #include <dspbridge/host_os.h>
24 /* ----------------------------------- DSP/BIOS Bridge */
25 #include <dspbridge/dbdefs.h>
27 /* ----------------------------------- Platform Manager */
28 #include <dspbridge/cod.h>
29 #include <dspbridge/drv.h>
30 #include <dspbridge/proc.h>
31 #include <dspbridge/dmm.h>
33 /* ----------------------------------- Resource Manager */
34 #include <dspbridge/mgr.h>
35 #include <dspbridge/node.h>
37 /* ----------------------------------- Others */
38 #include <dspbridge/dspapi.h> /* DSP API version info. */
40 #include <dspbridge/chnl.h>
41 #include <dspbridge/io.h>
42 #include <dspbridge/msg.h>
43 #include <dspbridge/cmm.h>
44 #include <dspbridge/dspdeh.h>
46 /* ----------------------------------- This */
47 #include <dspbridge/dev.h>
49 /* ----------------------------------- Defines, Data Structures, Typedefs */
51 #define MAKEVERSION(major, minor) (major * 10 + minor)
52 #define BRD_API_VERSION MAKEVERSION(BRD_API_MAJOR_VERSION, \
53 BRD_API_MINOR_VERSION)
55 /* The Bridge device object: */
57 struct list_head link
; /* Link to next dev_object. */
58 u8 dev_type
; /* Device Type */
59 struct cfg_devnode
*dev_node_obj
; /* Platform specific dev id */
60 /* Bridge Context Handle */
61 struct bridge_dev_context
*bridge_context
;
62 /* Function interface to Bridge driver. */
63 struct bridge_drv_interface bridge_interface
;
64 struct brd_object
*lock_owner
; /* Client with exclusive access. */
65 struct cod_manager
*cod_mgr
; /* Code manager handle. */
66 struct chnl_mgr
*chnl_mgr
; /* Channel manager. */
67 struct deh_mgr
*deh_mgr
; /* DEH manager. */
68 struct msg_mgr
*msg_mgr
; /* Message manager. */
69 struct io_mgr
*iomgr
; /* IO manager (CHNL, msg_ctrl) */
70 struct cmm_object
*cmm_mgr
; /* SM memory manager. */
71 struct dmm_object
*dmm_mgr
; /* Dynamic memory manager. */
72 u32 word_size
; /* DSP word size: quick access. */
73 struct drv_object
*drv_obj
; /* Driver Object */
74 /* List of Processors attached to this device */
75 struct list_head proc_list
;
76 struct node_mgr
*node_mgr
;
80 struct list_head link
;
81 char sz_string
[MAXREGPATHLENGTH
];
84 /* ----------------------------------- Globals */
85 static u32 refs
; /* Module reference count */
87 /* ----------------------------------- Function Prototypes */
88 static int fxn_not_implemented(int arg
, ...);
89 static int init_cod_mgr(struct dev_object
*dev_obj
);
90 static void store_interface_fxns(struct bridge_drv_interface
*drv_fxns
,
91 struct bridge_drv_interface
*intf_fxns
);
93 * ======== dev_brd_write_fxn ========
95 * Exported function to be used as the COD write function. This function
96 * is passed a handle to a DEV_hObject, then calls the
97 * device's bridge_brd_write() function.
99 u32
dev_brd_write_fxn(void *arb
, u32 dsp_add
, void *host_buf
,
100 u32 ul_num_bytes
, u32 mem_space
)
102 struct dev_object
*dev_obj
= (struct dev_object
*)arb
;
107 /* Require of BrdWrite() */
108 status
= (*dev_obj
->bridge_interface
.brd_write
) (
109 dev_obj
->bridge_context
, host_buf
,
110 dsp_add
, ul_num_bytes
, mem_space
);
111 /* Special case of getting the address only */
112 if (ul_num_bytes
== 0)
115 ul_written
= ul_num_bytes
;
122 * ======== dev_create_device ========
124 * Called by the operating system to load the PM Bridge Driver for a
127 int dev_create_device(struct dev_object
**device_obj
,
128 const char *driver_file_name
,
129 struct cfg_devnode
*dev_node_obj
)
131 struct cfg_hostres
*host_res
;
132 struct bridge_drv_interface
*drv_fxns
= NULL
;
133 struct dev_object
*dev_obj
= NULL
;
134 struct chnl_mgrattrs mgr_attrs
;
135 struct io_attrs io_mgr_attrs
;
137 struct drv_object
*hdrv_obj
= NULL
;
138 struct drv_data
*drv_datap
= dev_get_drvdata(bridge
);
141 status
= drv_request_bridge_res_dsp((void *)&host_res
);
144 dev_dbg(bridge
, "%s: Failed to reserve bridge resources\n",
149 /* Get the Bridge driver interface functions */
150 bridge_drv_entry(&drv_fxns
, driver_file_name
);
152 /* Retrieve the Object handle from the driver data */
153 if (drv_datap
&& drv_datap
->drv_object
) {
154 hdrv_obj
= drv_datap
->drv_object
;
157 pr_err("%s: Failed to retrieve the object handle\n", __func__
);
160 /* Create the device object, and pass a handle to the Bridge driver for
163 dev_obj
= kzalloc(sizeof(struct dev_object
), GFP_KERNEL
);
165 /* Fill out the rest of the Dev Object structure: */
166 dev_obj
->dev_node_obj
= dev_node_obj
;
167 dev_obj
->cod_mgr
= NULL
;
168 dev_obj
->chnl_mgr
= NULL
;
169 dev_obj
->deh_mgr
= NULL
;
170 dev_obj
->lock_owner
= NULL
;
171 dev_obj
->word_size
= DSPWORDSIZE
;
172 dev_obj
->drv_obj
= hdrv_obj
;
173 dev_obj
->dev_type
= DSP_UNIT
;
174 /* Store this Bridge's interface functions, based on its
176 store_interface_fxns(drv_fxns
,
177 &dev_obj
->bridge_interface
);
179 /* Call fxn_dev_create() to get the Bridge's device
181 status
= (dev_obj
->bridge_interface
.dev_create
)
182 (&dev_obj
->bridge_context
, dev_obj
,
188 /* Attempt to create the COD manager for this device: */
190 status
= init_cod_mgr(dev_obj
);
192 /* Attempt to create the channel manager for this device: */
194 mgr_attrs
.max_channels
= CHNL_MAXCHANNELS
;
195 io_mgr_attrs
.birq
= host_res
->birq_registers
;
196 io_mgr_attrs
.irq_shared
=
197 (host_res
->birq_attrib
& CFG_IRQSHARED
);
198 io_mgr_attrs
.word_size
= DSPWORDSIZE
;
199 mgr_attrs
.word_size
= DSPWORDSIZE
;
200 num_windows
= host_res
->num_mem_windows
;
202 /* Assume last memory window is for CHNL */
203 io_mgr_attrs
.shm_base
= host_res
->mem_base
[1] +
204 host_res
->offset_for_monitor
;
205 io_mgr_attrs
.sm_length
=
206 host_res
->mem_length
[1] -
207 host_res
->offset_for_monitor
;
209 io_mgr_attrs
.shm_base
= 0;
210 io_mgr_attrs
.sm_length
= 0;
211 pr_err("%s: No memory reserved for shared structures\n",
214 status
= chnl_create(&dev_obj
->chnl_mgr
, dev_obj
, &mgr_attrs
);
215 if (status
== -ENOSYS
) {
216 /* It's OK for a device not to have a channel
220 /* Create CMM mgr even if Msg Mgr not impl. */
221 status
= cmm_create(&dev_obj
->cmm_mgr
,
222 (struct dev_object
*)dev_obj
, NULL
);
223 /* Only create IO manager if we have a channel manager */
224 if (!status
&& dev_obj
->chnl_mgr
) {
225 status
= io_create(&dev_obj
->iomgr
, dev_obj
,
228 /* Only create DEH manager if we have an IO manager */
230 /* Instantiate the DEH module */
231 status
= bridge_deh_create(&dev_obj
->deh_mgr
, dev_obj
);
233 /* Create DMM mgr . */
234 status
= dmm_create(&dev_obj
->dmm_mgr
,
235 (struct dev_object
*)dev_obj
, NULL
);
237 /* Add the new DEV_Object to the global list: */
239 status
= drv_insert_dev_object(hdrv_obj
, dev_obj
);
241 /* Create the Processor List */
243 INIT_LIST_HEAD(&dev_obj
->proc_list
);
245 /* If all went well, return a handle to the dev object;
246 * else, cleanup and return NULL in the OUT parameter. */
248 *device_obj
= dev_obj
;
251 if (dev_obj
->cod_mgr
)
252 cod_delete(dev_obj
->cod_mgr
);
253 if (dev_obj
->dmm_mgr
)
254 dmm_destroy(dev_obj
->dmm_mgr
);
265 * ======== dev_create2 ========
267 * After successful loading of the image from api_init_complete2
268 * (PROC Auto_Start) or proc_load this fxn is called. This creates
269 * the Node Manager and updates the DEV Object.
271 int dev_create2(struct dev_object
*hdev_obj
)
274 struct dev_object
*dev_obj
= hdev_obj
;
276 /* There can be only one Node Manager per DEV object */
277 status
= node_create_mgr(&dev_obj
->node_mgr
, hdev_obj
);
279 dev_obj
->node_mgr
= NULL
;
285 * ======== dev_destroy2 ========
287 * Destroys the Node manager for this device.
289 int dev_destroy2(struct dev_object
*hdev_obj
)
292 struct dev_object
*dev_obj
= hdev_obj
;
294 if (dev_obj
->node_mgr
) {
295 if (node_delete_mgr(dev_obj
->node_mgr
))
298 dev_obj
->node_mgr
= NULL
;
306 * ======== dev_destroy_device ========
308 * Destroys the channel manager for this device, if any, calls
309 * bridge_dev_destroy(), and then attempts to unload the Bridge module.
311 int dev_destroy_device(struct dev_object
*hdev_obj
)
314 struct dev_object
*dev_obj
= hdev_obj
;
317 if (dev_obj
->cod_mgr
) {
318 cod_delete(dev_obj
->cod_mgr
);
319 dev_obj
->cod_mgr
= NULL
;
322 if (dev_obj
->node_mgr
) {
323 node_delete_mgr(dev_obj
->node_mgr
);
324 dev_obj
->node_mgr
= NULL
;
327 /* Free the io, channel, and message managers for this board: */
328 if (dev_obj
->iomgr
) {
329 io_destroy(dev_obj
->iomgr
);
330 dev_obj
->iomgr
= NULL
;
332 if (dev_obj
->chnl_mgr
) {
333 chnl_destroy(dev_obj
->chnl_mgr
);
334 dev_obj
->chnl_mgr
= NULL
;
336 if (dev_obj
->msg_mgr
) {
337 msg_delete(dev_obj
->msg_mgr
);
338 dev_obj
->msg_mgr
= NULL
;
341 if (dev_obj
->deh_mgr
) {
342 /* Uninitialize DEH module. */
343 bridge_deh_destroy(dev_obj
->deh_mgr
);
344 dev_obj
->deh_mgr
= NULL
;
346 if (dev_obj
->cmm_mgr
) {
347 cmm_destroy(dev_obj
->cmm_mgr
, true);
348 dev_obj
->cmm_mgr
= NULL
;
351 if (dev_obj
->dmm_mgr
) {
352 dmm_destroy(dev_obj
->dmm_mgr
);
353 dev_obj
->dmm_mgr
= NULL
;
356 /* Call the driver's bridge_dev_destroy() function: */
357 /* Require of DevDestroy */
358 if (dev_obj
->bridge_context
) {
359 status
= (*dev_obj
->bridge_interface
.dev_destroy
)
360 (dev_obj
->bridge_context
);
361 dev_obj
->bridge_context
= NULL
;
365 /* Remove this DEV_Object from the global list: */
366 drv_remove_dev_object(dev_obj
->drv_obj
, dev_obj
);
367 /* Free The library * LDR_FreeModule
368 * (dev_obj->module_obj); */
369 /* Free this dev object: */
381 * ======== dev_get_chnl_mgr ========
383 * Retrieve the handle to the channel manager handle created for this
386 int dev_get_chnl_mgr(struct dev_object
*hdev_obj
,
387 struct chnl_mgr
**mgr
)
390 struct dev_object
*dev_obj
= hdev_obj
;
393 *mgr
= dev_obj
->chnl_mgr
;
403 * ======== dev_get_cmm_mgr ========
405 * Retrieve the handle to the shared memory manager created for this
408 int dev_get_cmm_mgr(struct dev_object
*hdev_obj
,
409 struct cmm_object
**mgr
)
412 struct dev_object
*dev_obj
= hdev_obj
;
415 *mgr
= dev_obj
->cmm_mgr
;
425 * ======== dev_get_dmm_mgr ========
427 * Retrieve the handle to the dynamic memory manager created for this
430 int dev_get_dmm_mgr(struct dev_object
*hdev_obj
,
431 struct dmm_object
**mgr
)
434 struct dev_object
*dev_obj
= hdev_obj
;
437 *mgr
= dev_obj
->dmm_mgr
;
447 * ======== dev_get_cod_mgr ========
449 * Retrieve the COD manager create for this device.
451 int dev_get_cod_mgr(struct dev_object
*hdev_obj
,
452 struct cod_manager
**cod_mgr
)
455 struct dev_object
*dev_obj
= hdev_obj
;
458 *cod_mgr
= dev_obj
->cod_mgr
;
468 * ========= dev_get_deh_mgr ========
470 int dev_get_deh_mgr(struct dev_object
*hdev_obj
,
471 struct deh_mgr
**deh_manager
)
476 *deh_manager
= hdev_obj
->deh_mgr
;
485 * ======== dev_get_dev_node ========
487 * Retrieve the platform specific device ID for this device.
489 int dev_get_dev_node(struct dev_object
*hdev_obj
,
490 struct cfg_devnode
**dev_nde
)
493 struct dev_object
*dev_obj
= hdev_obj
;
496 *dev_nde
= dev_obj
->dev_node_obj
;
506 * ======== dev_get_first ========
508 * Retrieve the first Device Object handle from an internal linked list
509 * DEV_OBJECTs maintained by DEV.
511 struct dev_object
*dev_get_first(void)
513 struct dev_object
*dev_obj
= NULL
;
515 dev_obj
= (struct dev_object
*)drv_get_first_dev_object();
521 * ======== dev_get_intf_fxns ========
523 * Retrieve the Bridge interface function structure for the loaded driver.
526 int dev_get_intf_fxns(struct dev_object
*hdev_obj
,
527 struct bridge_drv_interface
**if_fxns
)
530 struct dev_object
*dev_obj
= hdev_obj
;
533 *if_fxns
= &dev_obj
->bridge_interface
;
543 * ========= dev_get_io_mgr ========
545 int dev_get_io_mgr(struct dev_object
*hdev_obj
,
546 struct io_mgr
**io_man
)
551 *io_man
= hdev_obj
->iomgr
;
561 * ======== dev_get_next ========
563 * Retrieve the next Device Object handle from an internal linked list
564 * of DEV_OBJECTs maintained by DEV, after having previously called
565 * dev_get_first() and zero or more dev_get_next
567 struct dev_object
*dev_get_next(struct dev_object
*hdev_obj
)
569 struct dev_object
*next_dev_object
= NULL
;
572 next_dev_object
= (struct dev_object
*)
573 drv_get_next_dev_object((u32
) hdev_obj
);
576 return next_dev_object
;
580 * ========= dev_get_msg_mgr ========
582 void dev_get_msg_mgr(struct dev_object
*hdev_obj
, struct msg_mgr
**msg_man
)
584 *msg_man
= hdev_obj
->msg_mgr
;
588 * ======== dev_get_node_manager ========
590 * Retrieve the Node Manager Handle
592 int dev_get_node_manager(struct dev_object
*hdev_obj
,
593 struct node_mgr
**node_man
)
596 struct dev_object
*dev_obj
= hdev_obj
;
599 *node_man
= dev_obj
->node_mgr
;
609 * ======== dev_get_symbol ========
611 int dev_get_symbol(struct dev_object
*hdev_obj
,
612 const char *str_sym
, u32
* pul_value
)
615 struct cod_manager
*cod_mgr
;
618 status
= dev_get_cod_mgr(hdev_obj
, &cod_mgr
);
620 status
= cod_get_sym_value(cod_mgr
, (char *)str_sym
,
630 * ======== dev_get_bridge_context ========
632 * Retrieve the Bridge Context handle, as returned by the
633 * bridge_dev_create fxn.
635 int dev_get_bridge_context(struct dev_object
*hdev_obj
,
636 struct bridge_dev_context
**phbridge_context
)
639 struct dev_object
*dev_obj
= hdev_obj
;
642 *phbridge_context
= dev_obj
->bridge_context
;
644 *phbridge_context
= NULL
;
652 * ======== dev_exit ========
654 * Decrement reference count, and free resources when reference count is
663 * ======== dev_init ========
665 * Initialize DEV's private state, keeping a reference count on each call.
678 * ======== dev_notify_clients ========
680 * Notify all clients of this device of a change in device status.
682 int dev_notify_clients(struct dev_object
*dev_obj
, u32 ret
)
684 struct list_head
*curr
;
687 * FIXME: this code needs struct proc_object to have a list_head
688 * at the beginning. If not, this can go horribly wrong.
690 list_for_each(curr
, &dev_obj
->proc_list
)
691 proc_notify_clients((void *)curr
, ret
);
697 * ======== dev_remove_device ========
699 int dev_remove_device(struct cfg_devnode
*dev_node_obj
)
701 struct dev_object
*hdev_obj
; /* handle to device object */
703 struct drv_data
*drv_datap
= dev_get_drvdata(bridge
);
711 /* Retrieve the device object handle originally stored with
714 /* check the device string and then store dev object */
715 if (!strcmp((char *)((struct drv_ext
*)dev_node_obj
)->sz_string
,
717 hdev_obj
= drv_datap
->dev_object
;
718 /* Destroy the device object. */
719 status
= dev_destroy_device(hdev_obj
);
726 pr_err("%s: Failed, status 0x%x\n", __func__
, status
);
732 * ======== dev_set_chnl_mgr ========
734 * Set the channel manager for this device.
736 int dev_set_chnl_mgr(struct dev_object
*hdev_obj
,
737 struct chnl_mgr
*hmgr
)
740 struct dev_object
*dev_obj
= hdev_obj
;
743 dev_obj
->chnl_mgr
= hmgr
;
751 * ======== dev_set_msg_mgr ========
753 * Set the message manager for this device.
755 void dev_set_msg_mgr(struct dev_object
*hdev_obj
, struct msg_mgr
*hmgr
)
757 hdev_obj
->msg_mgr
= hmgr
;
761 * ======== dev_start_device ========
763 * Initializes the new device with the BRIDGE environment.
765 int dev_start_device(struct cfg_devnode
*dev_node_obj
)
767 struct dev_object
*hdev_obj
= NULL
; /* handle to 'Bridge Device */
768 /* Bridge driver filename */
769 char *bridge_file_name
= "UMA";
771 struct mgr_object
*hmgr_obj
= NULL
;
772 struct drv_data
*drv_datap
= dev_get_drvdata(bridge
);
774 /* Given all resources, create a device object. */
775 status
= dev_create_device(&hdev_obj
, bridge_file_name
,
778 /* Store away the hdev_obj with the DEVNODE */
779 if (!drv_datap
|| !dev_node_obj
) {
781 pr_err("%s: Failed, status 0x%x\n", __func__
, status
);
782 } else if (!(strcmp((char *)dev_node_obj
, "TIOMAP1510"))) {
783 drv_datap
->dev_object
= (void *) hdev_obj
;
786 /* Create the Manager Object */
787 status
= mgr_create(&hmgr_obj
, dev_node_obj
);
788 if (status
&& !(strcmp((char *)dev_node_obj
,
790 /* Ensure the device extension is NULL */
791 drv_datap
->dev_object
= NULL
;
796 dev_destroy_device(hdev_obj
);
805 * ======== fxn_not_implemented ========
807 * Takes the place of a Bridge Null Function.
809 * Multiple, optional.
813 static int fxn_not_implemented(int arg
, ...)
819 * ======== init_cod_mgr ========
821 * Create a COD manager for this device.
823 * dev_obj: Pointer to device object created with
824 * dev_create_device()
827 * -EFAULT: Invalid hdev_obj.
829 * Should only be called once by dev_create_device() for a given DevObject.
832 static int init_cod_mgr(struct dev_object
*dev_obj
)
835 char *sz_dummy_file
= "dummy";
837 status
= cod_create(&dev_obj
->cod_mgr
, sz_dummy_file
);
843 * ======== dev_insert_proc_object ========
845 * Insert a ProcObject into the list maintained by DEV.
847 * p_proc_object: Ptr to ProcObject to insert.
848 * dev_obj: Ptr to Dev Object where the list is.
849 * already_attached: Ptr to return the bool
854 * hdev_obj is Valid handle
856 * already_attached != NULL
859 * 0 and List is not Empty.
861 int dev_insert_proc_object(struct dev_object
*hdev_obj
,
862 u32 proc_obj
, bool *already_attached
)
864 struct dev_object
*dev_obj
= (struct dev_object
*)hdev_obj
;
866 if (!list_empty(&dev_obj
->proc_list
))
867 *already_attached
= true;
869 /* Add DevObject to tail. */
871 * FIXME: this code needs struct proc_object to have a list_head
872 * at the beginning. If not, this can go horribly wrong.
874 list_add_tail((struct list_head
*)proc_obj
, &dev_obj
->proc_list
);
880 * ======== dev_remove_proc_object ========
882 * Search for and remove a Proc object from the given list maintained
885 * p_proc_object: Ptr to ProcObject to insert.
886 * dev_obj Ptr to Dev Object where the list is.
890 * List exists and is not empty
892 * hdev_obj is a valid Dev handle.
895 * List will be deleted when the DEV is destroyed.
897 int dev_remove_proc_object(struct dev_object
*hdev_obj
, u32 proc_obj
)
900 struct list_head
*cur_elem
;
901 struct dev_object
*dev_obj
= (struct dev_object
*)hdev_obj
;
903 /* Search list for dev_obj: */
904 list_for_each(cur_elem
, &dev_obj
->proc_list
) {
905 if ((u32
) cur_elem
== proc_obj
) {
915 int dev_get_dev_type(struct dev_object
*dev_obj
, u8
*dev_type
)
917 *dev_type
= dev_obj
->dev_type
;
922 * ======== store_interface_fxns ========
924 * Copy the Bridge's interface functions into the device object,
925 * ensuring that fxn_not_implemented() is set for:
927 * 1. All Bridge function pointers which are NULL; and
928 * 2. All function slots in the struct dev_object structure which have no
929 * corresponding slots in the the Bridge's interface, because the Bridge
930 * is of an *older* version.
932 * intf_fxns: Interface fxn Structure of the Bridge's Dev Object.
933 * drv_fxns: Interface Fxns offered by the Bridge during DEV_Create().
936 * Input pointers are valid.
937 * Bridge driver is *not* written for a newer DSP API.
939 * All function pointers in the dev object's fxn interface are not NULL.
941 static void store_interface_fxns(struct bridge_drv_interface
*drv_fxns
,
942 struct bridge_drv_interface
*intf_fxns
)
946 /* Local helper macro: */
947 #define STORE_FXN(cast, pfn) \
948 (intf_fxns->pfn = ((drv_fxns->pfn != NULL) ? drv_fxns->pfn : \
949 (cast)fxn_not_implemented))
951 bridge_version
= MAKEVERSION(drv_fxns
->brd_api_major_version
,
952 drv_fxns
->brd_api_minor_version
);
953 intf_fxns
->brd_api_major_version
= drv_fxns
->brd_api_major_version
;
954 intf_fxns
->brd_api_minor_version
= drv_fxns
->brd_api_minor_version
;
955 /* Install functions up to DSP API version .80 (first alpha): */
956 if (bridge_version
> 0) {
957 STORE_FXN(fxn_dev_create
, dev_create
);
958 STORE_FXN(fxn_dev_destroy
, dev_destroy
);
959 STORE_FXN(fxn_dev_ctrl
, dev_cntrl
);
960 STORE_FXN(fxn_brd_monitor
, brd_monitor
);
961 STORE_FXN(fxn_brd_start
, brd_start
);
962 STORE_FXN(fxn_brd_stop
, brd_stop
);
963 STORE_FXN(fxn_brd_status
, brd_status
);
964 STORE_FXN(fxn_brd_read
, brd_read
);
965 STORE_FXN(fxn_brd_write
, brd_write
);
966 STORE_FXN(fxn_brd_setstate
, brd_set_state
);
967 STORE_FXN(fxn_brd_memcopy
, brd_mem_copy
);
968 STORE_FXN(fxn_brd_memwrite
, brd_mem_write
);
969 STORE_FXN(fxn_brd_memmap
, brd_mem_map
);
970 STORE_FXN(fxn_brd_memunmap
, brd_mem_un_map
);
971 STORE_FXN(fxn_chnl_create
, chnl_create
);
972 STORE_FXN(fxn_chnl_destroy
, chnl_destroy
);
973 STORE_FXN(fxn_chnl_open
, chnl_open
);
974 STORE_FXN(fxn_chnl_close
, chnl_close
);
975 STORE_FXN(fxn_chnl_addioreq
, chnl_add_io_req
);
976 STORE_FXN(fxn_chnl_getioc
, chnl_get_ioc
);
977 STORE_FXN(fxn_chnl_cancelio
, chnl_cancel_io
);
978 STORE_FXN(fxn_chnl_flushio
, chnl_flush_io
);
979 STORE_FXN(fxn_chnl_getinfo
, chnl_get_info
);
980 STORE_FXN(fxn_chnl_getmgrinfo
, chnl_get_mgr_info
);
981 STORE_FXN(fxn_chnl_idle
, chnl_idle
);
982 STORE_FXN(fxn_chnl_registernotify
, chnl_register_notify
);
983 STORE_FXN(fxn_io_create
, io_create
);
984 STORE_FXN(fxn_io_destroy
, io_destroy
);
985 STORE_FXN(fxn_io_onloaded
, io_on_loaded
);
986 STORE_FXN(fxn_io_getprocload
, io_get_proc_load
);
987 STORE_FXN(fxn_msg_create
, msg_create
);
988 STORE_FXN(fxn_msg_createqueue
, msg_create_queue
);
989 STORE_FXN(fxn_msg_delete
, msg_delete
);
990 STORE_FXN(fxn_msg_deletequeue
, msg_delete_queue
);
991 STORE_FXN(fxn_msg_get
, msg_get
);
992 STORE_FXN(fxn_msg_put
, msg_put
);
993 STORE_FXN(fxn_msg_registernotify
, msg_register_notify
);
994 STORE_FXN(fxn_msg_setqueueid
, msg_set_queue_id
);
996 /* Add code for any additional functions in newerBridge versions here */