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

📄 txproc.c

📁 marvell8385 GSPI开发驱动
💻 C
📖 第 1 页 / 共 3 页
字号:

  //// 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;
//-dzj  , now the maroc WPA isn't used, it need modify when add WPA function
#if 1 
#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"));
//            RETAILMSG(DBG_TXDATA|DBG_WARNING,("\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]));
//                                  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

    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
#ifdef DEBUG_PARA_ROAMING
    pTxNode->LocalWCB->TxControl = ( (PARA_802_11_TXRETRY << 12 ) | PARA_802_11_AUTORATE);
#else
    // number of retry is 3
    pTxNode->LocalWCB->TxControl = ( (3 << 12 ) | Adapter->DataRate);
#endif
    pTxNode->LocalWCB->PktPtr = sizeof(WCB);
#endif // #ifdef INTERFACE20

    //      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);


  // check for 802.3 vs. ethernet encapsulation
  if( pHeader[12] > 0x05 )
  { 
    bIsEtherPacket = TRUE;
  }
  else
  {
    bIsEtherPacket = FALSE;   
  }
  
#ifdef UNDER_CE
  useBuffer = TRUE;
#endif    

    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;
    NdisMCancelTimer(&Adapter->MrvDrvTxPktTimer, &timerStatus);
    NdisMSetTimer(&Adapter->MrvDrvTxPktTimer, 
                   MRVDRV_DEFAULT_TX_PKT_TIME_OUT);


    //RETAILMSG(1,(L"SendSinglePacket: SentPacket %x \n", (ULONG)Packet));

#ifdef CONFIG_WLAN_DHCP_PROXY
    if(wlan_DHCPProxyTxPkt(Adapter,(UCHAR *)downloadPkt.Buf.CmdBuf, TotalPacketLength) == 1)
    {
        return NDIS_STATUS_SUCCESS;
    }
#endif

   downloadPkt.Type = SDIO_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;

} 


NDIS_STATUS
HandleTxSingleDoneEvent(
  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;
  } 


  #if 1  
  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")));
    /*
    if (Adapter->bEAPOLSendPending == TRUE )
    {
        Adapter->bEAPOLSendPending = FALSE;
        // indicate TX resource available
        NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl);
    }
    */
    return NDIS_STATUS_FAILURE;
  }
  #endif  

    Status = NDIS_STATUS_SUCCESS;

    EnterCriticalSection(&Adapter->TxCriticalSection);

    pPacket = Adapter->SentPacket;

    Adapter->SentPacket = NULL;  

    if(pPacket && Adapter->bSentPacketReturned == 0)
    {      
//tt ++ ra fail
//	static USHORT		s_nInsCount=0;
//tt --
        //if(Adapter->TxPacketCount == 0)
        //   NdisMSleep(1);
 
        //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); 
//tt ++ ra fail
//	s_nInsCount ++;
//	V5DbgMsg( (L"        + iq: %d\n", s_nInsCount) );  
//tt --     

#ifdef RETQ_TIMER
  if( Adapter->RetQTimerIsSet==0)
  {
    NdisMCancelTimer(&Adapter->MrvRetQTimer, &timerStatus);
    NdisMSetTimer(&Adapter->MrvRetQTimer, 
                   MRVDRV_DEFAULT_RETQ_TIME_OUT);
    Adapter->RetQTimerIsSet=1;
  }
#endif  
        #endif
    }
    else
       Adapter->bSentPacketReturned = 0;

    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));	
/* //dralee_0110, dummy code	  
    if(Adapter->PendingTxCnt && Adapter->TxPacketCount  < MAX_TX_PACKETS/2 )
    {   
        Adapter->PendingTxCnt = 0;
        RETAILMSG(1,(TEXT("event send to protocol thread\r\n")));
		V5DbgMsg( (L"* indicate avail -1\n") );
        NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl); 
		V5DbgMsg( (L"* indicate avail -2\n") );
        //SetEvent(Adapter->TxResourceControlEvent);
    }
*/

          

/*
#if 1
          if(Adapter->PendingTxCnt && Adapter->TxPacketCount < MAX_TX_PACKETS/2 )
          {   
                 //if(Adapter->DisplayTxMsg)
                 //    NKDbgPrintfW( L"-- call SendResourceAvailable %d \r\n", Adapter->TxPacketCount);

                 NdisMSendResourcesAvailable(Adapter->MrvDrvAdapterHdl); 
                 RETAILMSG(1,(TEXT("\r\n TxQ half empty, send SendResourceAvailable...")));

                 //if( Adapter->TxPacketCount < 2 ) 
                 Adapter->PendingTxCnt = 0;
          } 
#endif 
*/     


          if( Adapter->TxPacketCount && Adapter->psState != PS_STATE_SLEEP )
          {       
            
#if 0
            MrvPrintFile("[TxDone]:CurrCmd+TxDone");
    
            if( Adapter->CurCmd ) 
            {                             
                 MrvPrintFile("[TxDone]:CurrCmd+TxDone");
 
                 Adapter->TxPktTimerIsSet=TRUE;
                 NdisMSetTimer(&Adapter->MrvDrvTxPktTimer, 5);
            } 
            else
            {    
#endif
  
            
              TxPacketDeQueue(Adapter, &pTxQKeeper, &pTQNode); 

// tt ++ ps check

⌨️ 快捷键说明

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