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

📄 txproc.c

📁 此压缩包为杰得开发得z228的BSP的源代码,可以实现很多功能,尤其是视频解码有很好的效果.
💻 C
📖 第 1 页 / 共 5 页
字号:
  }  #endif#endif // WMM_UAPSD  //// temporarily disable useBuffer optimization, it seems to cause problem  useBuffer = TRUE;    DBGPRINT(DBG_TXDATA | DBG_CRLF,("+SendSinglePacket()\n"));  //RETAILMSG(1,(TEXT("[Marvell]+SendSinglePacket()")));    //lykao, 060905, test     DBGPRINT(DBG_ALLEN,("[Marvell]SendSinglePacket Adapter->psState=%d\n",Adapter->psState));  if((Adapter->psState != PS_STATE_FULL_POWER) &&      (Adapter->psState != PS_STATE_WAKEUP))  {      DBGPRINT(DBG_TXDATA ,("Tx can not send in the power state \n"));      DBGPRINT(DBG_ALLEN ,("Tx can not send in the power state \n"));    //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Tx can not send in the power state")));      //070705      //Adapter->SendPSFlag=TRUE;    return NDIS_STATUS_RESOURCES;    //return NDIS_STATUS_FAILURE;  }  //BugFix  //if (sd_UseAndLockSDDownloadPath(Adapter) == FALSE)  //{  //    return NDIS_STATUS_RESOURCES;  //}     Status = NDIS_STATUS_SUCCESS;   pTxNode=&Adapter->TxNode;      //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryPacket")));  NdisQueryPacket(    Packet,    NULL,    &BufferCount,    &pBuffer,    &TotalPacketLength);  //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryPacket")));  if(!pBuffer || !BufferCount || !TotalPacketLength)  {    DBGPRINT(DBG_TXDATA|DBG_WARNING,("TX - NDIS buffer is not valid, return FAILURE \n"));               Status=NDIS_STATUS_FAILURE;         //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX - NDIS buffer is not valid, return FAILURE ")));         goto end;  }  //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisQueryBuffer")));  NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length);  //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisQueryBuffer")));  pHeader = (PUCHAR)pVirtualAddr;#ifndef MRVL_CHECK_TXPACKET#ifdef WPA    // check if in key absent state, if so, block all packet other than    // 802.1x    if ( Adapter->EncryptionStatus == Ndis802_11Encryption2KeyAbsent )      {        // no key yet, only allow 802.1x packets        if ( TotalPacketLength < 14 )         {            // malformed packet, blocked!            DBGPRINT(DBG_TXDATA|DBG_WARNING,("Got packet with size less than 14 bytes, reject!\n"));             Status =  NDIS_STATUS_FAILURE;       //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Got packet with size less than 14 bytes, reject! ")));                 goto end;        }        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]));      //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:Still no key and packet typeis not 802.1x  drop! ")));                                  Status = NDIS_STATUS_FAILURE;       goto end;        }    }  #endif // #ifdef WPA#endif //#ifdef MRVL_CHECK_TXPACKET    DBGPRINT(DBG_TXDATA,("SendSinglePacket: buffers %d, packet len %d\n",BufferCount, TotalPacketLength));  pTxNode->NPTxPacket = Packet;  NdisZeroMemory(pTxNode->LocalWCB, sizeof(WCB));  pTxNode->LocalWCB->Status = MRVDRV_WCB_STATUS_USED;  pTxNode->LocalWCB->PktLen = (USHORT)TotalPacketLength;    DBGPRINT(DBG_DATARATE,("DataRate = %x\n", (ULONG)Adapter -> DataRate));#ifdef INTERFACE20    // number of retry is 3      //Ling++, 012706, Tx DataRate, Fix: Tx FixRate issue       //pTxNode->LocalWCB->TxControl = ( (3 << 12 ) | Adapter->DataRate);    pTxNode->LocalWCB->TxControl =0;    //Ling--, 012706    pTxNode->LocalWCB->PktPtr = sizeof(WCB);#endif // #ifdef INTERFACE20  #ifdef WMM    if ( Adapter->WmmDesc.enabled )    {    #ifdef WMM_USE_NDIS_EXT        pTxNode->LocalWCB->Priority = wmm_get_pkt_priority( Packet );    #else        pTxNode->LocalWCB->Priority = wmm_get_tos( Packet );    #endif // WMM_USE_NDIS_EXT    pTxNode->LocalWCB->PowerMgmt = 0;        #ifdef WMM_UAPSD        if( CheckLastPacketIndication(Adapter) )        {            pTxNode->LocalWCB->PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET;        }    #endif // WMM_UAPSD    }#endif // WMM#ifdef PROPRIETARY_PERIODIC_PS      //dralee_20060327    //set last packet indication when PPS is enabled and system in PS mode.    if(Adapter->psState != PS_STATE_FULL_POWER)    {                                                                           if( CheckLastPacketIndication(Adapter) )       {           pTxNode->LocalWCB->PowerMgmt |= MRVDRV_WCB_POWER_MGMT_LAST_PACKET;           Adapter->TxLock = 1;           //RETAILMSG(1,(L"###LP indication\n\r")); //, powerMgmt=%x\n\r",pTxNode->LocalWCB->PowerMgmt));       }    }#endif     //      First buffer contains the MAC header    //      Call NdisMoveMemory() to copy DEST MAC adress to WCB    //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:1 NdisMoveMemory")));    NdisMoveMemory(      (PVOID)pTxNode->LocalWCB->DestMACAdrHi,      pVirtualAddr,       MRVDRV_ETH_ADDR_LEN);   //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:2 NdisMoveMemory")));  // Start the packet.    TotalBufferLength = TotalPacketLength;    TotalBufferLength += sizeof(WCB);/* dralee_20060403  // check for 802.3 vs. ethernet encapsulation  if( pHeader[12] > 0x05 )  {     bIsEtherPacket = TRUE;  }  else  {    bIsEtherPacket = FALSE;     } */  #ifdef UNDER_CE  useBuffer = TRUE;#endif           /* dralee_20060403    if ( bIsEtherPacket == FALSE )    {      // if 802.3 packet, then omit the length field      TotalBufferLength -= 2;    }*/        // TotalBufferLength contains the size of the packet    //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: before ADD_SDIO_PKT_HDR_LENGTH")));    downloadPkt.Len = ADD_SDIO_PKT_HDR_LENGTH(TotalBufferLength);     // RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: after ADD_SDIO_PKT_HDR_LENGTH")));        DBGPRINT(DBG_TXDATA,("TX %d bytes: packet size %d\n",(ULONG)TotalBufferLength, (ULONG)TotalPacketLength));          if ( bIsEtherPacket == FALSE )    {      // in the case of 802.3 packet, the length field omitted when sent      // to FW      pTxNode->LocalWCB->PktLen = (USHORT)TotalPacketLength - 2;    }      // Transmit the MAC header to the device.        // NOTE:  WCB has to be EVEN in size!!!       // RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **1NdisMoveMemory")));     NdisMoveMemory(pCurPtr, (PUCHAR)pTxNode->LocalWCB, sizeof(WCB));     pCurPtr += sizeof(WCB);     //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **2NdisMoveMemory")));          //HexDump(DBG_TXDATADUMP,"TX Buffer:", (PUCHAR )pTxNode->LocalWCB, sizeof(WCB));       DBGPRINT(DBG_T3  | DBG_CRLF ,("TX PACKET:\n"));  //      Query each buffer for the packet and move data to SQ  AccumLength = sizeof(WCB);  for(i=0; i<BufferCount; i++)  {     NdisQueryBuffer(pBuffer, &pVirtualAddr, &Length);    AccumLength += Length;    if( AccumLength > MRVDRV_ETH_TX_PACKET_BUFFER_SIZE )        // PJG: accum length already counts the header... need to compare to entire buffer size      break;               // ***** Fix for odd sized buffer *****        // Because the CF controller needs 16 bit write, it will not handle        // odd sized buffers        if( pVirtualAddr )    {            if ((bIsEtherPacket == FALSE) || (useBuffer) || ( (Length % 2) != 0 ) )            {                // one of the previous buffer is odd, use coalescing buffer                          NdisMoveMemory((PVOID)pDest, pVirtualAddr, Length);            pDest = (PUCHAR)((ULONG)pDest + Length);                coBufferLength += Length;                useBuffer = TRUE;                //DBGPRINT(DBG_TXDATA,("buffer packet"));                            }            else            {                DBGPRINT(DBG_TXDATA,("not buffer packet"));          //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket: **not buffer packet")));                NdisMoveMemory(pCurPtr, (PUCHAR)pVirtualAddr, (USHORT)Length);        pCurPtr += Length;            }      }//if( pVirtualAddr )                  NdisGetNextBuffer(pBuffer, &pNextBuffer);    if( !pNextBuffer )      break;    pBuffer = pNextBuffer;  }//for(i=0; i<BufferCount; i++)    //DBGPRINT(DBG_TXDATADUMP | DBG_RAW,("\n"));  //102605    DBGPRINT(DBG_TXDATADUMP,("\n"));   HexDump(DBG_TXDATADUMP,"[Marvell]TX Buffer:", Buffer, 64);   DBGPRINT(DBG_TXDATADUMP,("\n"));          //RETAILMSG(1,(TEXT("[Marvell]++SendSinglePacket:  ")));      // Check with Sean why he is doing this. And take appropriate action. For now send the complete     // data as is.        if ( bIsEtherPacket == FALSE )    {     // 802.3 packet, already contains LLC    // send DA MAC, SA MAC to FW      NdisMoveMemory(pCurPtr, (PUCHAR)Buffer, (USHORT)MRVDRV_ETH_ADDR_LEN * 2);      pCurPtr += (USHORT)(MRVDRV_ETH_ADDR_LEN * 2);      NdisMoveMemory(pCurPtr, (PUCHAR)(Buffer+MRVDRV_ETH_HEADER_SIZE), (USHORT)TotalPacketLength - MRVDRV_ETH_HEADER_SIZE);      pCurPtr += (USHORT)(TotalPacketLength - MRVDRV_ETH_HEADER_SIZE);  }  else  {        if ( useBuffer )         {            NdisMoveMemory(pCurPtr, (PUCHAR)Buffer, (USHORT)coBufferLength);            pCurPtr +=(USHORT)coBufferLength;        }  }    DBGPRINT(DBG_ALLEN,("[Marvell]TX SendSinglePacket!\n"));      //remember the current packet being sent    Adapter->SentPacket = Packet;     Adapter->TxPktTimerIsSet=TRUE;    NdisMSetTimer(&Adapter->MrvDrvTxPktTimer,                    MRVDRV_DEFAULT_TX_PKT_TIME_OUT);    //RETAILMSG(1,(L"SendSinglePacket: SentPacket %x \n", (ULONG)Packet));   downloadPkt.Type = IF_DATA_PKT;    sdstatus = If_DownloadPkt(Adapter, &downloadPkt);     //lykao, 052605   Adapter->ulTxByteInLastPeriod += downloadPkt.Len;   if (!SD_API_SUCCESS(sdstatus))   {                        BOOLEAN  timerStatus;         DBGPRINT(DBG_ALLEN,("[Marvell]TX download failed!\n"));        RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download failed! ")));          //dralee 09202005        Adapter->SentPacket = NULL;            Adapter->TxPktTimerIsSet=FALSE;        NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);                    return NDIS_STATUS_FAILURE;    }   else   {        DBGPRINT(DBG_LOAD,("TX download success!\n"));        DBGPRINT(DBG_ALLEN,("[Marvell]TX download success!\n"));        //RETAILMSG(1,(TEXT("[Marvell]SendSinglePacket:TX download success!")));     }    DBGSTROBE_LINE_ON(DBLINE2);    // remember the current packet being sent    //Adapter->TxRetryCount = 0;   //dralee 09172005, unused flag    // Start Tx timer    //NdisMSetTimer(&Adapter->MrvDrvTxPktTimer,     //               MRVDRV_DEFAULT_TX_PKT_TIME_OUT);    //Adapter->TxPktTimerIsSet=TRUE;    // Update sequence number    Adapter->SeqNum++;      //DBGPRINT(DBG_T3,("DONE TX PACKET:\n"));    //DBGPRINT(DBG_TXDATA,("-SendSinglePacket()\n"));    end:   //RETAILMSG(1,(TEXT("[Marvell]-SendSinglePacket()")));  //BugFix, dralee mask off  //  sd_ReleaseSDDownloadPath(Adapter);  return Status;} #endif NDIS_STATUSHandleTxSingleDoneEvent(  PMRVDRV_ADAPTER Adapter){  PNDIS_PACKET pPacket;  NDIS_STATUS Status;  USHORT usTxFrmSeqNum = 0, usTxFrmStatus = 0, usTCNSeqNum = 0;  USHORT usTxCurrentRate = 0;  BOOLEAN  timerStatus;  PTXQ_KEEPER  pTxQKeeper;  PTXQ_NODE    pTQNode;  DBGSTROBE_LINE_OFF(DBLINE2);  DBGPRINT(DBG_TXDATA | DBG_CRLF ,("+HandleTxSingleDoneEvent()\n"));  if( Adapter->TxPktTimerIsSet==TRUE )  {       NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);     Adapter->TxPktTimerIsSet=FALSE;  }     /* Handle Txsingle done may be caused by txed data packet and command packet.      If caused by command packet, Adapter->SentPacket == null.      If caused by data packet, Adapter->SentPacket != null except the txed packet is null packet.      When PPS is actived, null packet with last packet indication set may be sent to FW   */  #if 0 //++dralee_20060327  if( Adapter->SentPacket == NULL )  {    DBGPRINT(DBG_TXDATA,("Adapter->SentPacket == NULL but received TX_DONE\n"));    RETAILMSG(1,(TEXT("Adapter->SentPacket == NULL but received TX_DONE\n")));    return NDIS_STATUS_FAILURE;  }  #endif      Status = NDIS_STATUS_SUCCESS;    EnterCriticalSection(&Adapter->TxCriticalSection);    pPacket = Adapter->SentPacket;    Adapter->SentPacket = NULL;  #ifdef CCX    if ( ! wlan_ccx_isCurPacket(pPacket) )    {#endif           #ifdef RETQ_TIMER    if(pPacket && Adapter->bSentPacketReturned == 0)    {               //RETAILMSG(1,(L"\r\n indicate Tx complete: %x",(ULONG)pPacket));        #if 0        Status = NDIS_STATUS_SUCCESS;        NDIS_SET_PACKET_STATUS(pPacket, Status);        NdisMSendComplete(                          Adapter->MrvDrvAdapterHdl,                          pPacket,                          Status);        #else         pTQNode = PopFreeTxQNode(Adapter->TxFreeQ);        pTQNode->pPacket = pPacket;            pTxQKeeper = (PTXQ_KEEPER)&Adapter->TXRETQ;        InsertTxQNodeAtTail(pTxQKeeper,pTQNode);         #ifdef RETQ_TIMER        if( Adapter->RetQTimerIsSet==0)        {          NdisMSetTimer(&Adapter->MrvRetQTimer,                          MRVDRV_DEFAULT_RETQ_TIME_OUT);          Adapter->RetQTimerIsSet=1;        }        //#else        ///crlo:retqtm ++        //EnterCriticalSection(&Adapter->TxCriticalSection);        //BatchIndicateRetQPkts(Adapter);         //LeaveCriticalSection(&Adapter->TxCriticalSection);        ///crlo:retqtm --        #endif  ///RETQ_TIMER        #endif  //0    }    else       Adapter->bSentPacketReturned = 0;    #endif  //RETQ_TIMER

⌨️ 快捷键说明

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