summaryrefslogtreecommitdiffstats
path: root/uClinux-2.4.20-uc1/drivers/net/wireless/Queue.c
blob: 3df00442fad0154bb8d8aa4696460bfe39a5766a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "W90N745Prism.h"
#include "Queue.h"


extern Queue_txfid TxQueueObj;
/* private txfid queue function, for interval use */
INT16 Init_Queue()
{
	INT16 i;
	INT16 result = 0;
	INT16 retry = 0;
	
	memset(&TxQueueObj, 0, sizeof(Queue_txfid));
	for (i = 0; i < PRISM2_TX_FIDSTACKLEN_MAX; i++)
    {
retryalloc:
    	result = prism_cmd_allocate(PRISM2_TXBUF_MAX, &(TxQueueObj.cells[i].fid));
    	if (result != 0) {
            printk("Allocate(tx) command failed\n");
            result = -1;
            if(retry < 4) {
            	retry++;
            	goto retryalloc;
            }
            goto out;
        }
      	retry = 0;
        TxQueueObj.cells[i].flag |=0x1;
    }
out:
	TxQueueObj.capability = i;
	return i;
}

/* Dump for debuging queue */
void Queue_dump()
{
#ifdef WDEBUG
	int i;
	
	printk("Number of Cells in Queue: %d\n", TxQueueObj.capability);
	for(i = 0; i < TxQueueObj.capability; i++)
	{
		printk("%dth: txfid: %x, flag: %d\n", i, (TxQueueObj.cells[i].fid), TxQueueObj.cells[i].flag);
	}
#endif
}

/* public txfid queue function, for geting a tx fid */
INT16 Get_txfid()
{
	int i;
	
	if(GetAvailableCellNum(TxQueueObj) <= 0) {
		printk("No available cell for tx\n");
		return -1;
	}
	
	for(i = 0; (i < PRISM2_TX_FIDSTACKLEN_MAX)&&(!TxQueueObj.cells[i].flag); i++);
	if(i >= PRISM2_TX_FIDSTACKLEN_MAX) {
		printk("Erro:No available cell for tx\n");
		return -1;
	}
	TxQueueObj.cells[i].flag = 0;
	ReduceAvailableCellNum(TxQueueObj);
	return TxQueueObj.cells[i].fid;
}

/* public txfid queue function, for puting a tx fid */
INT16 Put_txfid(UINT16 val)
{
	INT16 result = 0;
	int i;
	
	if(GetAvailableCellNum(TxQueueObj) >= PRISM2_TX_FIDSTACKLEN_MAX) {
		//printk("queue have full\n");
		return -1;
	}
	
	for(i = 0; (i < PRISM2_TX_FIDSTACKLEN_MAX)&&(TxQueueObj.cells[i].fid != val); i++);
	if(i >= PRISM2_TX_FIDSTACKLEN_MAX) {
		printk("Illegal txfid for tx: %d \n", val);
		return -1;
	}
	if(!TxQueueObj.cells[i].flag) {
		TxQueueObj.cells[i].flag = 1;
		AddAvailableCellNum(TxQueueObj);
	}
	return result;
}