summaryrefslogtreecommitdiffstats
path: root/bsps/shared/shmdr/shmdr-send.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsps/shared/shmdr/shmdr-send.c')
-rw-r--r--bsps/shared/shmdr/shmdr-send.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/bsps/shared/shmdr/shmdr-send.c b/bsps/shared/shmdr/shmdr-send.c
new file mode 100644
index 0000000000..c3ac7d51c2
--- /dev/null
+++ b/bsps/shared/shmdr/shmdr-send.c
@@ -0,0 +1,64 @@
+/**
+ * @file
+ */
+
+/*
+ * COPYRIGHT (c) 1989-1999, 2016.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#include <rtems.h>
+#include "shm_driver.h"
+
+struct pkt_cpy {
+ uint32_t packet[MAX_PACKET_SIZE/4];
+};
+
+/**
+ * This routine is the shared memory driver locked queue write
+ * MPCI driver routine. This routine sends the specified packet
+ * to the destination specified by "node". A "node" value of
+ * zero designates that this packet is to be broadcasted.
+ *
+ * @param node is the destination of this packet (0 = broadcast)
+ * @param packet is the address of packet
+ *
+ * @return NONE
+ */
+rtems_mpci_entry Shm_Send_packet(
+ uint32_t node,
+ rtems_packet_prefix *packet
+)
+{
+ Shm_Envelope_control *ecb, *tmp_ecb;
+ uint32_t nnum;
+
+ ecb = Shm_Packet_prefix_to_envelope_control_pointer( packet );
+ if ( node ) {
+ Shm_Build_preamble( ecb, node );
+ Shm_Build_postamble( ecb );
+ Shm_Append_to_receive_queue( node, ecb );
+ (*Shm_Configuration->cause_intr)( node );
+ }
+ else {
+ for( nnum = SHM_FIRST_NODE ; nnum <= SHM_MAXIMUM_NODES ; nnum++ )
+ if ( _Configuration_MP_table->node != nnum ) {
+ struct pkt_cpy *pkt;
+
+ tmp_ecb = Shm_Allocate_envelope();
+ if ( !tmp_ecb )
+ rtems_fatal_error_occurred( SHM_NO_FREE_PKTS );
+ Shm_Build_preamble( tmp_ecb, nnum );
+ pkt = (struct pkt_cpy *)tmp_ecb->packet;
+ *pkt = *((struct pkt_cpy *)packet);
+ Shm_Build_postamble( tmp_ecb );
+ Shm_Append_to_receive_queue( nnum, tmp_ecb );
+ (*Shm_Configuration->cause_intr)( nnum );
+ }
+ Shm_Free_envelope( ecb );
+ }
+}