88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
#ifdef BLOCK_NET_IF
|
|
|
|
#include "rt_config.h"
|
|
#include "netif_block.h"
|
|
|
|
static NETIF_ENTRY freeNetIfEntryPool[FREE_NETIF_POOL_SIZE];
|
|
static LIST_HEADER freeNetIfEntryList;
|
|
|
|
|
|
void initblockQueueTab(RTMP_ADAPTER *pAd)
|
|
{
|
|
int i;
|
|
|
|
initList(&freeNetIfEntryList);
|
|
for (i = 0; i < FREE_NETIF_POOL_SIZE; i++)
|
|
insertTailList(&freeNetIfEntryList, (RT_LIST_ENTRY *)&freeNetIfEntryPool[i]);
|
|
|
|
for (i=0; i < NUM_OF_TX_RING; i++)
|
|
initList(&pAd->blockQueueTab[i].NetIfList);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
BOOLEAN blockNetIf(BLOCK_QUEUE_ENTRY *pBlockQueueEntry, PNET_DEV pNetDev)
|
|
{
|
|
NETIF_ENTRY *pNetIfEntry = NULL;
|
|
|
|
if ((pNetIfEntry = (NETIF_ENTRY *)removeHeadList(&freeNetIfEntryList)) != NULL)
|
|
{
|
|
RTMP_OS_NETDEV_STOP_QUEUE(pNetDev);
|
|
pNetIfEntry->pNetDev = pNetDev;
|
|
insertTailList(&pBlockQueueEntry->NetIfList, (RT_LIST_ENTRY *)pNetIfEntry);
|
|
|
|
pBlockQueueEntry->SwTxQueueBlockFlag = TRUE;
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_STOP_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));
|
|
}
|
|
else
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
VOID releaseNetIf(BLOCK_QUEUE_ENTRY *pBlockQueueEntry)
|
|
{
|
|
NETIF_ENTRY *pNetIfEntry = NULL;
|
|
LIST_HEADER *pNetIfList = &pBlockQueueEntry->NetIfList;
|
|
|
|
while((pNetIfEntry = (NETIF_ENTRY *)removeHeadList(pNetIfList)) != NULL)
|
|
{
|
|
PNET_DEV pNetDev = pNetIfEntry->pNetDev;
|
|
|
|
if (pNetDev) {
|
|
RTMP_OS_NETDEV_WAKE_QUEUE(pNetDev);
|
|
DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_WAKE_QUEUE(%s)\n",
|
|
RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));
|
|
}
|
|
insertTailList(&freeNetIfEntryList, (RT_LIST_ENTRY *)pNetIfEntry);
|
|
}
|
|
pBlockQueueEntry->SwTxQueueBlockFlag = FALSE;
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
VOID StopNetIfQueue(RTMP_ADAPTER *pAd, UCHAR QueIdx, PNDIS_PACKET pPacket)
|
|
{
|
|
UCHAR wdev_idx;
|
|
struct wifi_dev *wdev;
|
|
|
|
wdev_idx = RTMP_GET_PACKET_WDEV(pPacket);
|
|
if ((wdev_idx < WDEV_NUM_MAX) && (pAd->wdev_list[wdev_idx] != NULL))
|
|
{
|
|
wdev = pAd->wdev_list[wdev_idx];
|
|
|
|
/* WMM support 4 software queues.*/
|
|
/* One software queue full doesn't mean device have no capbility to transmit packet.*/
|
|
/* So disable block Net-If queue function while WMM enable.*/
|
|
if ((wdev->bWmmCapable == FALSE) && (wdev->if_dev))
|
|
blockNetIf(&pAd->blockQueueTab[QueIdx], wdev->if_dev);
|
|
}
|
|
return;
|
|
}
|
|
|
|
#endif /* BLOCK_NET_IF */
|
|
|