linux/drivers/staging/rt3090/common/netif_block.c
<<
>>
Prefs
   1/*
   2 *************************************************************************
   3 * Ralink Tech Inc.
   4 * 5F., No.36, Taiyuan St., Jhubei City,
   5 * Hsinchu County 302,
   6 * Taiwan, R.O.C.
   7 *
   8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
   9 *
  10 * This program is free software; you can redistribute it and/or modify  *
  11 * it under the terms of the GNU General Public License as published by  *
  12 * the Free Software Foundation; either version 2 of the License, or     *
  13 * (at your option) any later version.                                   *
  14 *                                                                       *
  15 * This program is distributed in the hope that it will be useful,       *
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of        *
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
  18 * GNU General Public License for more details.                          *
  19 *                                                                       *
  20 * You should have received a copy of the GNU General Public License     *
  21 * along with this program; if not, write to the                         *
  22 * Free Software Foundation, Inc.,                                       *
  23 * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  24 *                                                                       *
  25 *************************************************************************
  26 */
  27#ifdef BLOCK_NET_IF
  28
  29#include "../rt_config.h"
  30#include "../netif_block.h"
  31
  32
  33static NETIF_ENTRY freeNetIfEntryPool[FREE_NETIF_POOL_SIZE];
  34static LIST_HEADER freeNetIfEntryList;
  35
  36void initblockQueueTab(
  37        IN PRTMP_ADAPTER pAd)
  38{
  39        int i;
  40
  41        initList(&freeNetIfEntryList);
  42        for (i = 0; i < FREE_NETIF_POOL_SIZE; i++)
  43                insertTailList(&freeNetIfEntryList, (PLIST_ENTRY)&freeNetIfEntryPool[i]);
  44
  45        for (i=0; i < NUM_OF_TX_RING; i++)
  46                initList(&pAd->blockQueueTab[i].NetIfList);
  47
  48        return;
  49}
  50
  51BOOLEAN blockNetIf(
  52        IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry,
  53        IN PNET_DEV pNetDev)
  54{
  55        PNETIF_ENTRY pNetIfEntry = NULL;
  56
  57        if ((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(&freeNetIfEntryList)) != NULL)
  58        {
  59                RTMP_OS_NETDEV_STOP_QUEUE(pNetDev);
  60                pNetIfEntry->pNetDev = pNetDev;
  61                insertTailList(&pBlockQueueEntry->NetIfList, (PLIST_ENTRY)pNetIfEntry);
  62
  63                pBlockQueueEntry->SwTxQueueBlockFlag = TRUE;
  64                DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_STOP_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));
  65        }
  66        else
  67                return FALSE;
  68
  69        return TRUE;
  70}
  71
  72VOID releaseNetIf(
  73        IN PBLOCK_QUEUE_ENTRY pBlockQueueEntry)
  74{
  75        PNETIF_ENTRY pNetIfEntry = NULL;
  76        PLIST_HEADER pNetIfList = &pBlockQueueEntry->NetIfList;
  77
  78        while((pNetIfEntry = (PNETIF_ENTRY)removeHeadList(pNetIfList)) !=  NULL)
  79        {
  80                PNET_DEV pNetDev = pNetIfEntry->pNetDev;
  81                RTMP_OS_NETDEV_WAKE_QUEUE(pNetDev);
  82                insertTailList(&freeNetIfEntryList, (PLIST_ENTRY)pNetIfEntry);
  83
  84                DBGPRINT(RT_DEBUG_TRACE, ("RTMP_OS_NETDEV_WAKE_QUEUE(%s)\n", RTMP_OS_NETDEV_GET_DEVNAME(pNetDev)));
  85        }
  86        pBlockQueueEntry->SwTxQueueBlockFlag = FALSE;
  87        return;
  88}
  89
  90
  91VOID StopNetIfQueue(
  92        IN PRTMP_ADAPTER pAd,
  93        IN UCHAR QueIdx,
  94        IN PNDIS_PACKET pPacket)
  95{
  96        PNET_DEV NetDev = NULL;
  97        UCHAR IfIdx = 0;
  98        BOOLEAN valid = FALSE;
  99
 100#ifdef APCLI_SUPPORT
 101        if (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_APCLI)
 102        {
 103                IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_APCLI) % MAX_APCLI_NUM;
 104                NetDev = pAd->ApCfg.ApCliTab[IfIdx].dev;
 105        }
 106        else
 107#endif // APCLI_SUPPORT //
 108#ifdef WDS_SUPPORT
 109        if (RTMP_GET_PACKET_NET_DEVICE(pPacket) >= MIN_NET_DEVICE_FOR_WDS)
 110        {
 111                IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_WDS) % MAX_WDS_ENTRY;
 112                NetDev = pAd->WdsTab.WdsEntry[IfIdx].dev;
 113        }
 114        else
 115#endif // WDS_SUPPORT //
 116        {
 117#ifdef MBSS_SUPPORT
 118                if (pAd->OpMode == OPMODE_AP)
 119                {
 120                        IfIdx = (RTMP_GET_PACKET_NET_DEVICE(pPacket) - MIN_NET_DEVICE_FOR_MBSSID) % MAX_MBSSID_NUM;
 121                        NetDev = pAd->ApCfg.MBSSID[IfIdx].MSSIDDev;
 122                }
 123                else
 124                {
 125                        IfIdx = MAIN_MBSSID;
 126                        NetDev = pAd->net_dev;
 127                }
 128#else
 129                IfIdx = MAIN_MBSSID;
 130                NetDev = pAd->net_dev;
 131#endif
 132        }
 133
 134        // WMM support 4 software queues.
 135        // One software queue full doesn't mean device have no capbility to transmit packet.
 136        // So disable block Net-If queue function while WMM enable.
 137#ifdef CONFIG_STA_SUPPORT
 138        IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
 139                valid = (pAd->CommonCfg.bWmmCapable == TRUE) ? FALSE : TRUE;
 140#endif // CONFIG_STA_SUPPORT //
 141
 142        if (valid)
 143                blockNetIf(&pAd->blockQueueTab[QueIdx], NetDev);
 144        return;
 145}
 146
 147#endif // BLOCK_NET_IF //
 148