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

📄 txproc.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 5 页
字号:
    Adapter->TxPacketSendComplete++;        //dralee_20051128    if ( Adapter->MediaConnectStatus == NdisMediaStateDisconnected )    {       LeaveCriticalSection(&Adapter->TxCriticalSection);      CleanUpSingleTxBuffer(Adapter);      ResetRxPDQ(Adapter);       return NDIS_STATUS_FAILURE;    }    DBGPRINT(DBG_TXDATADUMP,("[Marvell:HandleTxSingleDoneEvent] Adapter->TxPacketSendComplete=%d\n",  Adapter->TxPacketSendComplete));        #ifdef WMM_UAPSD   if( Adapter->psState != PS_STATE_SLEEP )   {            if( Adapter->TxPacketCount )       {             TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode);            //++dralee_20060327            Adapter->TxPacketCount--;            pPacket = pTQNode -> pPacket;             if(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);                      //Adapter->TxPacketCount--;  //++dralee_20060327                }                else                {                      RETAILMSG(1,(TEXT("[TxDone] Send packet fail\r\n")));                    //Error handling , push back this node                     InsertTxQNodeFromHead(pTxQKeeper,pTQNode);                    //++dralee_20060327                    Adapter->TxPacketCount++;                   }             }            else            {                RETAILMSG(1,(TEXT("severe error, Get NULL packet...\n\r")));// tt ++ wmm                PushFreeTxQNode(Adapter->TxFreeQ,pTQNode);  // tt --            }       }       else if(Adapter->WmmDesc.WmmUapsdEnabled && Adapter->psState == PS_STATE_WAKEUP ) //PS mode enabled       {              Adapter->bNullFrameSent = 1;          SendNullPacket(Adapter, MRVDRV_WCB_POWER_MGMT_NULL_PACKET|MRVDRV_WCB_POWER_MGMT_LAST_PACKET);       }   }#else                //++dralee_20060327          #ifdef PROPRIETARY_PERIODIC_PS          if( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP && Adapter->TxLock == 0 )          #else          if( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP )          #endif          {                               TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode);            //++dralee_20060327            Adapter->TxPacketCount--;             // tt ++ ps check            //       if ( pTQNode == NULL ) {                       ///crlo: queue is full. Leave now, instead of sending the packet            //           DBGPRINT(DBG_TXDATA, ("pq: 3\n") );            //           RETAILMSG(1,(L"Exit: %s, queue is full, LeaveCriticalSection \n", TEXT(__FUNCTION__)));             //           LeaveCriticalSection(&Adapter->TxCriticalSection);               //           return NDIS_STATUS_FAILURE;            //       }            // tt --              pPacket = pTQNode -> pPacket;               if(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);                        //Adapter->TxPacketCount--;  //++dralee_20060327                  }                  else                  {                        RETAILMSG(1,(TEXT("[TxDone] Send packet fail\r\n")));                                    //Error handling , push back this node                       InsertTxQNodeFromHead(pTxQKeeper,pTQNode);                      //++dralee_20060327                      Adapter->TxPacketCount++;                    }               }              else                    RETAILMSG(1,(TEXT("severe error, Get NULL packet...\n\r")));          }#ifdef PROPRIETARY_PERIODIC_PS          else if( Adapter->psState == PS_STATE_WAKEUP && (CheckLastPacketIndication(Adapter)) )           {                                   if(Adapter->TxLock == 0)              {                   SendNullPacket(Adapter, (MRVDRV_WCB_POWER_MGMT_NULL_PACKET|MRVDRV_WCB_POWER_MGMT_LAST_PACKET));                Adapter->TxLock = 1;                  }           }#endif #endif // WMM_UAPSD#ifdef CCX    }    else {        DBGPRINT(DBG_CCX, ("[HandleTxSingleDone] It is CCX packet\n"));		///crlo:slowping ++		wlan_ccx_clrCurPacket();		///crlo:slowping --    }#endif          LeaveCriticalSection(&Adapter->TxCriticalSection);   #if 1  //++dralee_20060327#ifdef NEW_PS_SCHEME           //this condiction only true when ps_confirm is enqueue, but not txed.           //It's possible when doing GetCmdFromQueueToExecute(), Adapter->SentPacket != 0          //that will stop downloading this command             if ( Adapter->psState == PS_STATE_SLEEP && Adapter->bPSConfirm==FALSE )          {                                 if( Adapter->HostPowerState == HTWK_STATE_FULL_POWER ||                 Adapter->HostPowerState == HTWK_STATE_SLEEP )            {                       //++dralee_20060327                #ifdef PROPRIETARY_PERIODIC_PS                   if (Adapter->CurCmd == NULL)                #else                if( Adapter->SentPacket == NULL &&                       Adapter->CurCmd == NULL )                  #endif                {                    //PSConfirmSleep(Adapter);                     GetCmdFromQueueToExecute (Adapter);                  }                 //RETAILMSG(1,(TEXT("PS_Confirm: in Txsingledone\n\r")));            }          }          ///crlo:added-2k60525 ++           //dralee_20060607, As command sending flow may be disrupted due to Adapter->SentPacket != null          //we add this condition to let flow started again.		  else if ( Adapter->CurCmd == NULL &&                   Adapter->SentPacket == NULL &&                   Adapter->psState != PS_STATE_SLEEP )          {				GetCmdFromQueueToExecute (Adapter);  		  }#endif  #endif     return NDIS_STATUS_SUCCESS;} /****************************************************************************** * *  Name: AllocateSingleTx() * *  Description: Allocate single Tx  * *  Arguments:  PMRVDRV_ADAPTER Adapter *     *  Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE *  *  Notes:         * *****************************************************************************/ NDIS_STATUS AllocateSingleTx(  IN PMRVDRV_ADAPTER Adapter  ){  Adapter->TxNode.BufVirtualAddr = NULL;  Adapter->TxNode.BufPhyAddr.LowPart = 0xffffffff;  Adapter->TxNode.BufPhyAddr.HighPart = 0xffffffff;  Adapter->TxNode.LocalWCB = &Adapter->Wcb;  Adapter->TxNode.Status = MRVDRV_TX_CTRL_NODE_STATUS_IDLE;  Adapter->Wcb.PktPtr = 0xffffffff;    return NDIS_STATUS_SUCCESS;}VOID FreeSingleTx(  IN PMRVDRV_ADAPTER Adapter  ){    return;}                    #ifdef TX_PRY_QVOID InitializeTxNodeQ(IN PMRVDRV_ADAPTER Adapter ){      int i;                                 Adapter->TxFreeQ = (PTXQ_NODE)&Adapter->FreeTxQNode[0];   for(i=0; i<MAX_TX_PACKETS-1; i++)      Adapter->FreeTxQNode[i].next = (PTXQ_NODE)&Adapter->FreeTxQNode[i+1];   Adapter->FreeTxQNode[MAX_TX_PACKETS-1].next = NULL; }#endif/****************************************************************************** * *  Name: CleanUpSingleTxBuffer() * *  Description: Clean up single Tx Bbuffer * *  Arguments:  PMRVDRV_ADAPTER Adapter *     *  Return Value: NDIS_STATUS_SUCCESS or NDIS_STATUS_FAILURE *  *  Notes:         * *****************************************************************************/NDIS_STATUSCleanUpSingleTxBuffer(IN PMRVDRV_ADAPTER Adapter){          ULONG i;    BOOLEAN timerStatus;    PNDIS_PACKET pPacket;                 RETAILMSG(1,(TEXT("[Marvell]+CleanUpSingleTxBuffer()\r\n")));     if(Adapter->TxPktTimerIsSet==TRUE)    {          NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);        Adapter->TxPktTimerIsSet=FALSE;    }    //dralee    //tt ra fail: Dragon suggested 2005/10/17    EnterCriticalSection(&Adapter->TxCriticalSection);                 if( Adapter->SentPacket )    {                   pPacket = Adapter->SentPacket;        Adapter->SentPacket = NULL;                       #ifdef RETQ_TIMER //++dralee_20060413         if( Adapter->bSentPacketReturned == 0 )         {            NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_FAILURE);            NdisMSendComplete(                              Adapter->MrvDrvAdapterHdl,                               pPacket,                               NDIS_STATUS_FAILURE);            }        else            Adapter->bSentPacketReturned = 0;        #endif     }    for(i=0; i< MAX_TX_PACKETS; i++)    {        PTXQ_KEEPER  pTxQKeeper;        PTXQ_NODE    pTQNode;        TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode);        if(pTQNode == NULL)           break;                       #ifdef RETQ_TIMER //++dralee_20060413        pPacket = pTQNode -> pPacket;          if ( pPacket == NULL )            V5DbgMsg( (L"   ??? nul pkt\n") );        if ( pPacket )        {        NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_FAILURE);        NdisMSendComplete(                           Adapter->MrvDrvAdapterHdl,                            pPacket,                            NDIS_STATUS_FAILURE);            } //tt ra fail         #endif//tt ++ ra fail        // Dragon suggested 2005/10/17        PushFreeTxQNode( Adapter->TxFreeQ, pTQNode );//tt --    } //tt ++ ra fail#ifdef RETQ_TIMER        if( Adapter->RetQTimerIsSet)        {                          Adapter->RetQTimerIsSet = 0;            NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);             BatchIndicateRetQPkts(Adapter);        }//#else ///        ///crlo:retqtm ++//        EnterCriticalSection(&Adapter->TxCriticalSection);//        BatchIndicateRetQPkts(Adapter); //        LeaveCriticalSection(&Adapter->TxCriticalSection);        ///crlo:retqtm --#endif  ///RETQ_TIMER//tt --    InitializeTxNodeQ(Adapter);     //set Tx queue parameter to default     Adapter->TxPacketCount=0;    Adapter->TxPacketComplete = 0;    Adapter->TxPacketPut = 0;    Adapter->TxPacketGet = 0;     Adapter->SentPacket = NULL;        //dralee    //tt ra fail: Dragon suggested 2005/10/17    LeaveCriticalSection(&Adapter->TxCriticalSection);     return NDIS_STATUS_SUCCESS;}#ifdef TX_PRY_Q   void TxPacketEnQueue(PMRVDRV_ADAPTER Adapter,PNDIS_PACKET Packet){                         PTXQ_KEEPER  pTxQKeeper;  PTXQ_NODE    pTQNode;  //int          priority;  UCHAR ac;  #ifdef WMM     UCHAR tos;  #endif #ifndef RETQ_TIMER   NDIS_STATUS Status; #endif    #ifdef WMM  if( Adapter->WmmDesc.enabled )  {  #ifdef WMM_USE_NDIS_EXT    tos = wmm_get_pkt_priority( Packet );  #else     tos = wmm_get_tos(Packet);  #endif // WMM_USE_NDIS_EXT       ac = wmm_tos2ac[Adapter->WmmDesc.acstatus][tos];    //DbgWmmMsg( (L"Pkt pri: tos=%d, ac=%d\n", tos, ac) );     /* Access control of the current packet not the Lowest */     if(ac > AC_PRIO_BE)     Adapter->WmmDesc.fw_notify = 1;   }   else    ac = 3;  #else // WMM    #ifdef TX_PRY_Q_TEST  ac = GetTickCount()&0x3;  #else  ac = 3;   #endif   #endif // WMM  pTQNode = PopFreeTxQNode(Adapter->TxFreeQ);  pTQNode->pPacket = Packet;      #ifndef RETQ_TIMER  Status = PrepareDownloadPacket(Adapter, Packet, &(pTQNode->DnldPacket));  #endif  //RETAILMSG(1,(L"Enqueue: %x, %x\n\r",(ULONG)pTQNode,(ULONG)Packet));  //Adapter->TxPacketCount++;  //Adapter->TxPacketSend++;    pTxQKeeper = (PTXQ_KEEPER)&Adapter->TXPRYQ[ac];  InsertTxQNodeAtTail(pTxQKeeper,pTQNode);  }VOID TxPacketDeQueue(PMRVDRV_ADAPTER Adapter,PPTXQ_KEEPER ppTxQKeeper,PPTXQ_NODE ppTQNode){     int pri;    for(pri=0; pri<4; pri++)    {       *ppTxQKeeper = (PTXQ_KEEPER)&Adapter->TXPRYQ[pri];       *ppTQNode = PopFirstTxQNode(*ppTxQKeeper);       if(*ppTQNode)          break;

⌨️ 快捷键说明

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