diff options
Diffstat (limited to 'uClinux-2.4.20-uc1/drivers/net/wireless/Queue.c')
-rwxr-xr-x | uClinux-2.4.20-uc1/drivers/net/wireless/Queue.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/uClinux-2.4.20-uc1/drivers/net/wireless/Queue.c b/uClinux-2.4.20-uc1/drivers/net/wireless/Queue.c new file mode 100755 index 0000000..3df0044 --- /dev/null +++ b/uClinux-2.4.20-uc1/drivers/net/wireless/Queue.c @@ -0,0 +1,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; +} |