⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txproc.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 5 页
字号:
/******************* ?Marvell Semiconductor, Inc., 2001-2004 ***************** * *  Purpose:    This module has the implementation of TX functions * *  $Author: schiu $ * *  $Date: 2004/11/03 $ * *  $Revision: #7 $ * *****************************************************************************/#include "precomp.h"// compilation error if this file is not included#ifdef UNDER_CE#include "pkfuncs.h"#endif#ifdef IF_SDIO#include "SDCardDDK.h"#endif // IF_SDIO#ifdef WMMextern UCHAR  wmm_tos2ac[16][8];#endif       /****************************************************************************** * *  Name: MrvDrvSend() * *  Description: NDIS miniport serialized send packet routine * *  Conditions for Use: Protocol driver will call this routine to pass Tx NDIS_PACKET * *  Arguments:            *      IN  NDIS_HANDLE   MiniportAdapterContext *      IN  PPNDIS_PACKET Packet *      IN  UINT          Flags *     *  Return Value: NDIS_STATUS_RESOURCES or NDIS_STATUS_PENDING *  *  Notes:                * *****************************************************************************/NDIS_STATUSMrvDrvSend(    IN NDIS_HANDLE MiniportAdapterContext,    IN PNDIS_PACKET Packet,    IN UINT Flags){    PMRVDRV_ADAPTER Adapter;    NDIS_STATUS Status;    #if 0    NDIS_STATUS  iStatus;     #endif ///0    PNDIS_PACKET pPacket;     //DWORD waitStatus;    // wait status      PTXQ_KEEPER  pTxQKeeper;    PTXQ_NODE    pTQNode;    //int pri;      #ifdef RETQ_TIMER    BOOLEAN  timerStatus;    #else    SDIO_TX_PKT DnldPacket;    #endif#ifdef MRVL_CHECK_TXPACKET       PNDIS_BUFFER  pBuffer;       UINT            BufferCount;    UINT           Length;       UINT           TotalPacketLength = 0;          PVOID           pVirtualAddr;    PTxCtrlNode      pTxNode;    PUCHAR            pHeader = NULL;#endif //MRVL_CHECK_TXPACKET      Status = NDIS_STATUS_SUCCESS;      Adapter = (PMRVDRV_ADAPTER)MiniportAdapterContext;    DBGPRINT(DBG_TXDATA, ("+MrvDrvSend()\n"));   //  printf ("+MrvDrvSend()\n");        #ifdef DEEP_SLEEP    // In Deep Sleep Mode no packet can be sent out     if (Adapter->IsDeepSleep)    {      Status = NDIS_STATUS_NO_CABLE;    }    #endif      //      Check device removal status    if( Adapter->SurpriseRemoved == TRUE )        {           RETAILMSG(1,(TEXT("\n\r[MrvSend]: NDIS_STATUS_FAILURE")));        return NDIS_STATUS_FAILURE;    }    if ( Adapter->bIsPendingReset == TRUE )    {                               RETAILMSG(1,(TEXT("\n\r[MrvSend]: NDIS_STATUS_FAILURE")));      return NDIS_STATUS_FAILURE;    }    if ( Adapter->MediaConnectStatus == NdisMediaStateDisconnected )    {        DBGPRINT(DBG_WARNING, ("***WARNING: OS attempted to send packet while disconnected!\n"));        RETAILMSG(1,(TEXT("[Marvell]MrvDrvSend:***1WARNING: OS attempted to send packet while disconnected!")));          DraleeMsg((L"[MrvSend]:disconnected"));        NdisMIndicateStatus(                            Adapter->MrvDrvAdapterHdl,                            NDIS_STATUS_MEDIA_DISCONNECT,                            (PVOID)NULL,                            0);           NdisMIndicateStatusComplete(Adapter->MrvDrvAdapterHdl);      //RETAILMSG(1,(TEXT("[Marvell]MrvDrvSend:***2WARNING: OS attempted to send packet while disconnected!")));          V5DbgMsg( (L"         * disconn\n") );      CleanUpSingleTxBuffer(Adapter);      ResetRxPDQ(Adapter);       return NDIS_STATUS_FAILURE;    }                           //Plus     if( Adapter->bIsScanInProgress == TRUE )         return NDIS_STATUS_SUCCESS;#ifdef MRVL_CHECK_TXPACKET    // check if in key absent state, if so, block all packet other than    // 802.1x    if ( (Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent )|| (Adapter->EncryptionStatus == Ndis802_11Encryption3KeyAbsent ) )      {    pTxNode = &Adapter->TxNode;            NdisQueryPacket(             Packet,            NULL,            &BufferCount,            &pBuffer,            &TotalPacketLength );      if (!pBuffer || !BufferCount || !TotalPacketLength)      {         #ifdef MRVL_PRINT_FILE_MSG           MrvPrintFileMSG("[Marvell]MrvDrvSend:NdisQueryPacket Fail!!  Return NDIS_STATUS_FAILURE!!\n");         #endif         return NDIS_STATUS_FAILURE;              }       NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length);       pHeader = (PUCHAR)pVirtualAddr;         if ( TotalPacketLength < 14 )         {            // malformed packet, blocked!            DBGPRINT(DBG_TXDATA|DBG_WARNING,("Got packet with size less than 14 bytes, reject!\n"));        #ifdef MRVL_PRINT_FILE_MSG           MrvPrintFileMSG("[Marvell]MrvDrvSend:Got packet with size less than 14 bytes, reject!!\n");         #endif                     return NDIS_STATUS_FAILURE;        }        if ( (pHeader[12] != 0x88) || (pHeader[13] != 0x8E) )        {            DBGPRINT(DBG_TXDATA|DBG_WARNING,("Still no key and packet type(0x%x 0x%x)is not 802.1x , drop!\n",                                  pHeader[12],                                  pHeader[13]));         #ifdef MRVL_PRINT_FILE_MSG                      MrvPrintFileMSG("[Marvell]MrvDrvSend:pHeader[6]=0x%x\n,pHeader[7]=0x%x\n,pHeader[8]=0x%x\n,pHeader[9]=0x%x\n,pHeader[10]=0x%x\n,pHeader[11]=0x%x\n,pHeader[12]=0x%x\n,pHeader[13]=0x%x\n,pHeader[14]=0x%x\n,pHeader[15]=0x%x\n,Adapter->TxPacketCount =%d\n",pHeader[6],pHeader[7],pHeader[8],pHeader[9],pHeader[10],pHeader[11],pHeader[12],pHeader[13],pHeader[14],pHeader[15],Adapter->TxPacketCount);                   #endif              return NDIS_STATUS_FAILURE;        }     }// if ( (Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent )|| (Adapter->EncryptionStatus == Ndis802_11Encryption3KeyAbsent ) )  #endif //MRVL_PRINT_FILE_MSG                               if(Adapter->TxPacketCount > 6)  //flow control            NdisMSleep(1000);        EnterCriticalSection(&Adapter->TxCriticalSection);        if(Adapter->TxPacketCount >= (MAX_TX_PACKETS-1) )        {                   RETAILMSG(1,(L"Enter Waiting ..:%d\n\r",Adapter->TxPacketCount));             V5DbgMsg( (L"=== MrvDrvSend, TxPacketCount=%d\n", Adapter->TxPacketCount) ); //tt ra fail             ///crlo:retqtm ++             #ifdef RETQ_TIMER             if( Adapter->RetQTimerIsSet)             {                                Adapter->RetQTimerIsSet = 0;                   NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);                  BatchIndicateRetQPkts(Adapter);               }              //#else //++dralee_20060406             //BatchIndicateRetQPkts(Adapter);             #endif //RETQ_TIMER             /// Old implementation             /*             #if 1             if( Adapter->RetQTimerIsSet)             {                                Adapter->RetQTimerIsSet = 0;                   NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);                  BatchIndicateRetQPkts(Adapter);               }              */             ///crlo:retqtm --                             LeaveCriticalSection(&Adapter->TxCriticalSection);                V5DbgMsg( (L"- return resources\n") );             //return NDIS_STATUS_RESOURCES; //dralee_1209, resource hang system,              return NDIS_STATUS_FAILURE;     //so, return fail is a little better...        }                                            //record how many tx pkt is sent.           Adapter->TxPacketSend++;              DBGPRINT(DBG_TXDATADUMP,("[Marvell:MrvDrvSend] Adapter->TxPacketSend=%d\n", Adapter->TxPacketSend));            //if( Adapter->SentPacket || (Adapter->CurCmd != NULL))        //TxLock is set when last packet indication is set in last txed packet        //so, stop tx to wait for ps_sleep event        if( Adapter->SentPacket || Adapter->CurCmd != NULL || Adapter->TxLock ==1  ) //++dralee_20060327        {             TxPacketEnQueue(Adapter, Packet);             Adapter->TxPacketCount++;              ///crlo:retqtm ++             #ifdef RETQ_TIMER                                  if( Adapter->RetQTimerIsSet)             {                                Adapter->RetQTimerIsSet = 0;                   NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);                  BatchIndicateRetQPkts(Adapter);              }             //#else //dralee_20060406             //BatchIndicateRetQPkts(Adapter);             #endif ///RETQ_TIMER             ///Old implementation             /*#if 1                                   if( Adapter->RetQTimerIsSet)             {                                Adapter->RetQTimerIsSet = 0;                   NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);                  BatchIndicateRetQPkts(Adapter);              }             #endif*/             ///crlo:retqtm --               LeaveCriticalSection(&Adapter->TxCriticalSection);             #ifdef RETQ_TIMER             return NDIS_STATUS_PENDING;              #else                        return NDIS_STATUS_SUCCESS;              #endif        }                 if( Adapter->TxPacketCount )        {                  TxPacketEnQueue(Adapter, Packet);             TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode);           pPacket = pTQNode -> pPacket;               //RETAILMSG(1,(L"Dequeue:%x, %x\n\r",(ULONG)pTQNode,(ULONG)(pTQNode->pPacket)));             #ifdef RETQ_TIMER           Status = SendSinglePacket(Adapter,pPacket);           #else           Status = SendSinglePacket(Adapter,pPacket,&(pTQNode->DnldPacket));           #endif                                                   if(Status == NDIS_STATUS_SUCCESS)           {                     PushFreeTxQNode(Adapter->TxFreeQ,pTQNode);           }             else           {              InsertTxQNodeFromHead(pTxQKeeper,pTQNode);               Adapter->TxPacketCount++;           }           #ifdef RETQ_TIMER           Status = NDIS_STATUS_PENDING;                   #else                Status = NDIS_STATUS_SUCCESS;            #endif        }        else          {           pPacket = Packet;             #ifdef RETQ_TIMER           Status = SendSinglePacket(Adapter,pPacket);           #else           Status = PrepareDownloadPacket(Adapter,Packet,&DnldPacket);           Status = SendSinglePacket(Adapter,pPacket,&DnldPacket);           #endif                                if(Status == NDIS_STATUS_SUCCESS)           {                      Adapter->bSentPacketReturned = 1;           }            else           {    #ifndef WMM_UAPSD             RETAILMSG(1,(TEXT("[MrvSend] Send packet fail\r\n")));#endif             TxPacketEnQueue(Adapter, Packet);               #ifdef RETQ_TIMER             Status = NDIS_STATUS_PENDING;             #else             Status = NDIS_STATUS_SUCCESS;              #endif              Adapter->TxPacketCount++;            }         }         ///crlo:retqtm ++        #ifdef RETQ_TIMER           if( Adapter->RetQTimerIsSet)        {                           Adapter->RetQTimerIsSet = 0;              NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);             BatchIndicateRetQPkts(Adapter);          }         //#else        //   BatchIndicateRetQPkts(Adapter);        #endif  ///RETQ_TIMER         LeaveCriticalSection(&Adapter->TxCriticalSection);           return Status;} //++dralee_20060327NDIS_STATUSSendNullPacket(IN PMRVDRV_ADAPTER Adapter,UCHAR pwmgr ){      NDIS_STATUS        sdstatus;               SDIO_TX_PKT         downloadPkt;   downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(sizeof(WCB));   downloadPkt.Type = IF_DATA_PKT;                    NdisZeroMemory(&downloadPkt.Buf.TxDataBuf.Wcb, sizeof(WCB));   downloadPkt.Buf.TxDataBuf.Wcb.PktPtr = sizeof(WCB);    downloadPkt.Buf.TxDataBuf.Wcb.PowerMgmt = pwmgr;     //RETAILMSG(1,(L"NULL pkt:%x\n\r",pwmgr));   sdstatus = If_DownloadPkt(Adapter, &downloadPkt);      if (!SD_API_SUCCESS(sdstatus))   {                        RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! ")));          return NDIS_STATUS_FAILURE;    }   return sdstatus;}   //++dralee_20060327//only for PPS enabled. when sleepperiod command is set and no queued packets & pending QUCHAR CheckLastPacketIndication(IN PMRVDRV_ADAPTER Adapter){        if( Adapter->sleepperiod != 0 &&       Adapter->TxPacketCount == 0 &&       IsQEmpty(&Adapter->CmdPendQ) )       return 1;   else        return 0;}         ///////////////////////////////////////////////////////////////****************************************************************************** * *  Name: SendSinglePacket() * *  Description: TX packet handler * *  Arguments:  PMRVDRV_ADAPTER Adapter *     *  Return Value: *  *  Notes:                * *****************************************************************************/                        #ifndef RETQ_TIMER    NDIS_STATUSSendSinglePacket(  IN PMRVDRV_ADAPTER Adapter,  IN PNDIS_PACKET Packet,   IN PSDIO_TX_PKT pDnldPacket){    //int ii; // ULONG bigTimeout = 250000;      // about 500ms drop dead timeout timing on BUS IO.  NDIS_STATUS  Status = NDIS_STATUS_SUCCESS;  //UINT BufferCount;  //UINT TotalPacketLength=0; // UINT TotalBufferLength=0; // UINT BytesCopied=0; // UINT Length, AccumLength; // PNDIS_BUFFER pBuffer, pNextBuffer; // ULONG i; //  PVOID pVirtualAddr;//  PTxCtrlNode pTxNode;      // due to fix for odd sized buffers, WepBuffer is used in both    // WEP and no-WEP scenarios  //UCHAR WepBuffer[MRVDRV_ETH_TX_PACKET_BUFFER_SIZE];  //BOOLEAN doWep = FALSE;   //BOOLEAN NotEncryption4EAPOL = FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -