OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [armnommu/] [drivers/] [scsi/] [msgqueue.c] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1622 jcastillo
#include <stdarg.h>
2
#include <linux/stddef.h>
3
 
4
#include "msgqueue.h"
5
 
6
/*
7
 * Function: struct msgqueue_entry *mqe_alloc(MsgQueue_t *msgq)
8
 * Purpose : Allocate a message queue entry
9
 * Params  : msgq - message queue to claim entry for
10
 * Returns : message queue entry or NULL.
11
 */
12
static struct msgqueue_entry *mqe_alloc(MsgQueue_t *msgq)
13
{
14
        struct msgqueue_entry *mq;
15
 
16
        if ((mq = msgq->free) != NULL)
17
                msgq->free = mq->next;
18
 
19
        return mq;
20
}
21
 
22
/*
23
 * Function: void mqe_free(MsgQueue_t *msgq, struct msgqueue_entry *mq)
24
 * Purpose : free a message queue entry
25
 * Params  : msgq - message queue to free entry from
26
 *           mq   - message queue entry to free
27
 */
28
static void mqe_free(MsgQueue_t *msgq, struct msgqueue_entry *mq)
29
{
30
        if (mq) {
31
                mq->next = msgq->free;
32
                msgq->free = mq;
33
        }
34
}
35
 
36
/*
37
 * Function: void msgqueue_initialise(MsgQueue_t *msgq)
38
 * Purpose : initialise a message queue
39
 * Params  : msgq - queue to initialise
40
 */
41
void msgqueue_initialise(MsgQueue_t *msgq)
42
{
43
        int i;
44
 
45
        msgq->qe = NULL;
46
        msgq->free = &msgq->entries[0];
47
 
48
        for (i = 0; i < NR_MESSAGES; i++)
49
                msgq->entries[i].next = &msgq->entries[i + 1];
50
 
51
        msgq->entries[NR_MESSAGES - 1].next = NULL;
52
}
53
 
54
 
55
/*
56
 * Function: void msgqueue_free(MsgQueue_t *msgq)
57
 * Purpose : free a queue
58
 * Params  : msgq - queue to free
59
 */
60
void msgqueue_free(MsgQueue_t *msgq)
61
{
62
}
63
 
64
/*
65
 * Function: int msgqueue_msglength(MsgQueue_t *msgq)
66
 * Purpose : calculate the total length of all messages on the message queue
67
 * Params  : msgq - queue to examine
68
 * Returns : number of bytes of messages in queue
69
 */
70
int msgqueue_msglength(MsgQueue_t *msgq)
71
{
72
        struct msgqueue_entry *mq = msgq->qe;
73
        int length = 0;
74
 
75
        for (mq = msgq->qe; mq; mq = mq->next)
76
                length += mq->msg.length;
77
 
78
        return length;
79
}
80
 
81
/*
82
 * Function: char *msgqueue_getmsg(MsgQueue_t *msgq, int msgno)
83
 * Purpose : return a message
84
 * Params  : msgq   - queue to obtain message from
85
 *         : msgno  - message number
86
 * Returns : pointer to message string, or NULL
87
 */
88
struct message *msgqueue_getmsg(MsgQueue_t *msgq, int msgno)
89
{
90
        struct msgqueue_entry *mq;
91
 
92
        for (mq = msgq->qe; mq && msgno; mq = mq->next, msgno--);
93
 
94
        return mq ? &mq->msg : NULL;
95
}
96
 
97
/*
98
 * Function: int msgqueue_addmsg(MsgQueue_t *msgq, int length, ...)
99
 * Purpose : add a message onto a message queue
100
 * Params  : msgq   - queue to add message on
101
 *           length - length of message
102
 *           ...    - message bytes
103
 * Returns : != 0 if successful
104
 */
105
int msgqueue_addmsg(MsgQueue_t *msgq, int length, ...)
106
{
107
        struct msgqueue_entry *mq = mqe_alloc(msgq);
108
        va_list ap;
109
 
110
        if (mq) {
111
                struct msgqueue_entry **mqp;
112
                int i;
113
 
114
                va_start(ap, length);
115
                for (i = 0; i < length; i++)
116
                        mq->msg.msg[i] = va_arg(ap, unsigned char);
117
                va_end(ap);
118
 
119
                mq->msg.length = length;
120
                mq->msg.fifo = 0;
121
                mq->next = NULL;
122
 
123
                mqp = &msgq->qe;
124
                while (*mqp)
125
                        mqp = &(*mqp)->next;
126
 
127
                *mqp = mq;
128
        }
129
 
130
        return mq != NULL;
131
}
132
 
133
/*
134
 * Function: void msgqueue_flush(MsgQueue_t *msgq)
135
 * Purpose : flush all messages from message queue
136
 * Params  : msgq - queue to flush
137
 */
138
void msgqueue_flush(MsgQueue_t *msgq)
139
{
140
        struct msgqueue_entry *mq, *mqnext;
141
 
142
        for (mq = msgq->qe; mq; mq = mqnext) {
143
                mqnext = mq->next;
144
                mqe_free(msgq, mq);
145
        }
146
        msgq->qe = NULL;
147
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.