Esempio n. 1
0
static int async_task(void *param)
{
	HIF_DEVICE      *device;
	BUS_REQUEST 	*request;
	A_STATUS 		status;

	static int		rw_cnt = 0;
	
	device = (HIF_DEVICE *)param;

	
	while(!device->async_shutdown)
	{

		/* wait for work */
		NdisWaitEvent(&device->sem_async, 0);
		NdisResetEvent(&device->sem_async);

		if (device->async_shutdown) {
			NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6000: async task stopping\n");
			break;
		}		
		
		/* pull the request to work on */
		while (device->asyncreq != NULL) 
		{
			request = device->asyncreq;
	
			if (request->inusenext != NULL) 
				device->asyncreq = request->inusenext;
			else 
				device->asyncreq = NULL;
			
			/* call HIFReadWrite in sync mode to do the work */
			NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6000: async_task processing req: 0x%X \r\n", (unsigned int)request);

			rw_cnt++;

			if(rw_cnt > 1)
				NDIS_DEBUG_PRINTF(DBG_ERR, "%s() : two time call !!!!! \r\n", __FUNCTION__);
			
			status = __HIFReadWrite(device, request->address, request->buffer,
			                      request->length, request->request & ~HIF_SYNCHRONOUS, NULL);
			rw_cnt --;
			if (request->request & HIF_ASYNCHRONOUS) 
			{
				NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6000: async_task completion routine req: 0x%X\n", (unsigned int)request);
				device->htcCallbacks.rwCompletionHandler(request->context, status);
				NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6000: async_task freeing req: 0x%X\n", (unsigned int)request);
				hifFreeBusRequest(device, request);
			} 
			else 
			{
			
				NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6000: async_task upping req: 0x%X\n", (unsigned int)request);
				request->status = status;
				NdisSetEvent(&request->sem_req);			
			}


        }

	}

	return 0;
}
Esempio n. 2
0
void IoDecrement(OPEN_INSTANCE *pOpen)
{
	if(InterlockedDecrement((PLONG)&pOpen->nIrpCount) == 0)
		NdisSetEvent(&pOpen->CleanupEvent);
}
Esempio n. 3
0
VOID
tapCompleteIrpAndFreeReceiveNetBufferList(
    __in  PTAP_ADAPTER_CONTEXT  Adapter,
    __in  PNET_BUFFER_LIST      NetBufferList,  // Only one NB here...
    __in  NTSTATUS              IoCompletionStatus
    )
{
    PIRP    irp;
    ULONG   frameType, netBufferCount, byteCount;
    LONG    nblCount;

    // Fetch NB frame type.
    frameType = tapGetNetBufferFrameType(NET_BUFFER_LIST_FIRST_NB(NetBufferList));

    // Fetch statistics for all NBs linked to the NB.
    netBufferCount = tapGetNetBufferCountsFromNetBufferList(
                        NetBufferList,
                        &byteCount
                        );

    // Update statistics by frame type
    if(IoCompletionStatus == STATUS_SUCCESS)
    {
        switch(frameType)
        {
        case NDIS_PACKET_TYPE_DIRECTED:
            Adapter->FramesRxDirected += netBufferCount;
            Adapter->BytesRxDirected += byteCount;
            break;

        case NDIS_PACKET_TYPE_BROADCAST:
            Adapter->FramesRxBroadcast += netBufferCount;
            Adapter->BytesRxBroadcast += byteCount;
            break;

        case NDIS_PACKET_TYPE_MULTICAST:
            Adapter->FramesRxMulticast += netBufferCount;
            Adapter->BytesRxMulticast += byteCount;
            break;

        default:
            ASSERT(FALSE);
            break;
        }
    }

    //
    // Handle P2P Packet
    // -----------------
    // Free MDL allocated for P2P Ethernet header.
    //
    if(TAP_RX_NBL_FLAG_TEST(NetBufferList,TAP_RX_NBL_FLAGS_IS_P2P))
    {
        PNET_BUFFER     netBuffer;
        PMDL            mdl;

        netBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
        mdl = NET_BUFFER_FIRST_MDL(netBuffer);
        mdl->Next = NULL;

        NdisFreeMdl(mdl);
    }

    //
    // Handle Injected Packet
    // -----------------------
    // Free MDL and data buffer allocated for injected packet.
    //
    if(TAP_RX_NBL_FLAG_TEST(NetBufferList,TAP_RX_NBL_FLAGS_IS_INJECTED))
    {
        PNET_BUFFER     netBuffer;
        PMDL            mdl;
        PUCHAR          injectBuffer;

        netBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
        mdl = NET_BUFFER_FIRST_MDL(netBuffer);

        injectBuffer = (PUCHAR )MmGetSystemAddressForMdlSafe(mdl,NormalPagePriority);

        if(injectBuffer)
        {
            NdisFreeMemory(injectBuffer,0,0);
        }

        NdisFreeMdl(mdl);
    }

    //
    // Complete the IRP
    //
    irp = (PIRP )NetBufferList->MiniportReserved[0];

    if(irp)
    {
        irp->IoStatus.Status = IoCompletionStatus;
        IoCompleteRequest(irp, IO_NO_INCREMENT);
    }

    // Decrement in-flight receive NBL count.
    nblCount = NdisInterlockedDecrement(&Adapter->ReceiveNblInFlightCount);
    ASSERT(nblCount >= 0 );
    if (0 == nblCount)
    {
        NdisSetEvent(&Adapter->ReceiveNblInFlightCountZeroEvent);
    }

    // Free the NBL
    NdisFreeNetBufferList(NetBufferList);
}
Esempio n. 4
0
A_STATUS 
HIFReadWrite(HIF_DEVICE		*device, 
             A_UINT32		address, 
             A_UCHAR		*buffer, 
             A_UINT32		length, 
             A_UINT32		request, 
             void			*context) 
{

    A_STATUS            status = A_OK;
	//unsigned long 		flags;
	BUS_REQUEST 		*busrequest;
	BUS_REQUEST 		*async;
	BUS_REQUEST 		*active;


	AR_DEBUG_ASSERT(device != NULL);
	
	
	
	do 
	{
		
		
		if ((request & HIF_ASYNCHRONOUS) || (request & HIF_SYNCHRONOUS))
		{
		
			/* serialize all requests through the async thread */
			NDIS_DEBUG_PRINTF(DBG_TRACE, "AR6000: Execution mode: %s\n", (request & HIF_ASYNCHRONOUS) ?"Async":"Synch");

			busrequest = hifAllocateBusRequest(device);
			if (busrequest == NULL) {
				NDIS_DEBUG_PRINTF(DBG_ERR, "AR6000: no async bus requests available\n");
				return A_ERROR;
			}

			Hif_Lock();
			
			busrequest->address = address;
			busrequest->buffer = buffer;
			busrequest->length = length;
			busrequest->request = request;
			busrequest->context = context;

			//NDIS_DEBUG_PRINTF(1, " add = %x, length = %x, request = %d \r\n", address, length, request);
					
			/* add to async list */
			active = device->asyncreq;
			if (active == NULL) 
			{
				device->asyncreq = busrequest;
				device->asyncreq->inusenext = NULL;
			} 
			else 	
			{
				for (async = device->asyncreq; async != NULL; async = async->inusenext) {
					 active =  async;
				}
				active->inusenext = busrequest;
				busrequest->inusenext = NULL;
			}
			
			Hif_Unlock();
			
		    if (request & HIF_SYNCHRONOUS) 
			{

				NdisSetEvent(&device->sem_async);

				/* Wait Read/Write Complete from the async_task */
				if( ! NdisWaitEvent(&busrequest->sem_req, HIF_SYNCHRONOUS_WAIT_TIME)) {
					NDIS_DEBUG_PRINTF(DBG_ERR, " HIF Synchronous Read/Write Time Out !! \r\n");
					NdisResetEvent(&busrequest->sem_req);
					
					return A_ERROR;
				} 

				NdisResetEvent(&busrequest->sem_req);
				hifFreeBusRequest(device, busrequest);	
				
				if(busrequest->status != A_OK)
					NDIS_DEBUG_PRINTF(DBG_ERR, "%s() Read/Write Err \r\n", __FUNCTION__);
				
				
				return busrequest->status;
			} 
			else 
			{
				NdisSetEvent(&device->sem_async);	
				
				return  A_PENDING;
		  	}
			
		}
		else
		{
			NDIS_DEBUG_PRINTF(DBG_ERR, "AR6000: Invalid execution mode: 0x%08x\n", (unsigned int)request);
            status = A_EINVAL;
            break;			
		}
		
	}while(0);
    NDIS_DEBUG_PRINTF(0, "%s() :  - Exit \r\n",__FUNCTION__);
    return status;
}
/**********************************************************
    callback from asynchronous RECEIVE PAUSE on reset
***********************************************************/
static void OnReceivePauseCompleteOnReset(PARANDIS_ADAPTER *pContext)
{
    DEBUG_ENTRY(0);
    NdisSetEvent(&pContext->ResetEvent);
}
Esempio n. 6
0
NDIS_STATUS
MiniportInitialize5(
    OUT PNDIS_STATUS             OpenErrorStatus,
    OUT PUINT                    SelectedMediumIndex,
    IN  PNDIS_MEDIUM             MediumArray,
    IN  UINT                     MediumArraySize,
    IN  NDIS_HANDLE              MiniportAdapterHandle,
    IN  NDIS_HANDLE              WrapperConfigurationContext
    )
{
    UINT            i;
    PADAPTER        pAdapt;
    NDIS_STATUS     Status = NDIS_STATUS_FAILURE;
    NDIS_MEDIUM     Medium;

    UNREFERENCED_PARAMETER(WrapperConfigurationContext);
    
    do
    {
        pAdapt = NdisIMGetDeviceContext(MiniportAdapterHandle);
        pAdapt->MiniportHandle = MiniportAdapterHandle;

        Medium = pAdapt->Medium;

        if (Medium == NdisMediumWan)
        {
            Medium = NdisMedium802_3;
			pAdapt->bWanAdapter = TRUE;
        }

        for (i = 0; i < MediumArraySize; i++)
        {
            if (MediumArray[i] == Medium)
            {
                *SelectedMediumIndex = i;
                break;
            }
        }

        if (i == MediumArraySize)
        {
            Status = NDIS_STATUS_UNSUPPORTED_MEDIA;
            break;
        }

        NdisMSetAttributesEx(MiniportAdapterHandle,
                             pAdapt,
                             0,              // CheckForHangTimeInSeconds
                             NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT    |
                                NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT|
                                NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER |
                                NDIS_ATTRIBUTE_DESERIALIZE |
                                NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND,
                             0);


        pAdapt->LastIndicatedStatus = NDIS_STATUS_MEDIA_CONNECT;
        
        pAdapt->MiniportDeviceState = NdisDeviceStateD0;

        //
        // Create an ioctl interface
        //
        (VOID)ProtocolRegisterDevice();
        
		Status = NDIS_STATUS_SUCCESS;
    }
    while (FALSE);

    ASSERT(pAdapt->MiniportInitPending == TRUE);
    pAdapt->MiniportInitPending = FALSE;
    NdisSetEvent(&pAdapt->MiniportInitEvent);

    *OpenErrorStatus = Status;
    
    return Status;
}
/*************************************************************
Callback of delayed send pause procedure
*************************************************************/
static VOID OnSendStopped(VOID *p)
{
    PARANDIS_ADAPTER *pContext = (PARANDIS_ADAPTER *)p;
    DEBUG_ENTRY(0);
    NdisSetEvent(&pContext->HaltEvent);
}
Esempio n. 8
0
NDIS_STATUS
MPInitialize(
    OUT PNDIS_STATUS             OpenErrorStatus,
    OUT PUINT                    SelectedMediumIndex,
    IN  PNDIS_MEDIUM             MediumArray,
    IN  UINT                     MediumArraySize,
    IN  NDIS_HANDLE              MiniportAdapterHandle,
    IN  NDIS_HANDLE              WrapperConfigurationContext
    )
/*++

Routine Description:

    This is the initialize handler which gets called as a result of
    the BindAdapter handler calling NdisIMInitializeDeviceInstanceEx.
    The context parameter which we pass there is the adapter structure
    which we retrieve here.

    Arguments:

    OpenErrorStatus            Not used by us.
    SelectedMediumIndex        Place-holder for what media we are using
    MediumArray                Array of ndis media passed down to us to pick from
    MediumArraySize            Size of the array
    MiniportAdapterHandle    The handle NDIS uses to refer to us
    WrapperConfigurationContext    For use by NdisOpenConfiguration

Return Value:

    NDIS_STATUS_SUCCESS unless something goes wrong

--*/
{
    UINT            i;
    PADAPT          pAdapt;
    NDIS_STATUS     Status = NDIS_STATUS_FAILURE;
    NDIS_MEDIUM     Medium;

    UNREFERENCED_PARAMETER(WrapperConfigurationContext);
    
    do
    {
        //
        // Start off by retrieving our adapter context and storing
        // the Miniport handle in it.
        //
        pAdapt = NdisIMGetDeviceContext(MiniportAdapterHandle);
        pAdapt->MiniportHandle = MiniportAdapterHandle;

        DBGPRINT(("==> Miniport Initialize: Adapt %p\n", pAdapt));

        //
        // Usually we export the medium type of the adapter below as our
        // virtual miniport's medium type. However if the adapter below us
        // is a WAN device, then we claim to be of medium type 802.3.
        //
        Medium = pAdapt->Medium;

        if (Medium == NdisMediumWan)
        {
            Medium = NdisMedium802_3;
        }

        for (i = 0; i < MediumArraySize; i++)
        {
            if (MediumArray[i] == Medium)
            {
                *SelectedMediumIndex = i;
                break;
            }
        }

        if (i == MediumArraySize)
        {
            Status = NDIS_STATUS_UNSUPPORTED_MEDIA;
            break;
        }


        //
        // Set the attributes now. NDIS_ATTRIBUTE_DESERIALIZE enables us
        // to make up-calls to NDIS without having to call NdisIMSwitchToMiniport
        // or NdisIMQueueCallBack. This also forces us to protect our data using
        // spinlocks where appropriate. Also in this case NDIS does not queue
        // packets on our behalf. Since this is a very simple pass-thru
        // miniport, we do not have a need to protect anything. However in
        // a general case there will be a need to use per-adapter spin-locks
        // for the packet queues at the very least.
        //
        NdisMSetAttributesEx(MiniportAdapterHandle,
                             pAdapt,
                             0,                                        // CheckForHangTimeInSeconds
                             NDIS_ATTRIBUTE_IGNORE_PACKET_TIMEOUT    |
                                NDIS_ATTRIBUTE_IGNORE_REQUEST_TIMEOUT|
                                NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER |
                                NDIS_ATTRIBUTE_DESERIALIZE |
                                NDIS_ATTRIBUTE_NO_HALT_ON_SUSPEND,
                             0);

        //
        // Initialize LastIndicatedStatus to be NDIS_STATUS_MEDIA_CONNECT
        //
        pAdapt->LastIndicatedStatus = NDIS_STATUS_MEDIA_CONNECT;
        
        //
        // Initialize the power states for both the lower binding (PTDeviceState)
        // and our miniport edge to Powered On.
        //
        pAdapt->MPDeviceState = NdisDeviceStateD0;
        pAdapt->PTDeviceState = NdisDeviceStateD0;

        //
        // Add this adapter to the global pAdapt List
        //
        NdisAcquireSpinLock(&GlobalLock);

        pAdapt->Next = pAdaptList;
        pAdaptList = pAdapt;

        NdisReleaseSpinLock(&GlobalLock);
        
        //
        // Create an ioctl interface
        //
        (VOID)PtRegisterDevice();

        Status = NDIS_STATUS_SUCCESS;
    }
    while (FALSE);

    //
    // If we had received an UnbindAdapter notification on the underlying
    // adapter, we would have blocked that thread waiting for the IM Init
    // process to complete. Wake up any such thread.
    //
    ASSERT(pAdapt->MiniportInitPending == TRUE);
    pAdapt->MiniportInitPending = FALSE;
    NdisSetEvent(&pAdapt->MiniportInitEvent);

    DBGPRINT(("<== Miniport Initialize: Adapt %p, Status %x\n", pAdapt, Status));

    *OpenErrorStatus = Status;
    
    return Status;
}
/**********************************************************
    callback from asynchronous RECEIVE PAUSE on reset
***********************************************************/
static void OnReceivePauseCompleteOnReset(void *ctx)
{
    DEBUG_ENTRY(0);
    PPARANDIS_ADAPTER pContext = (PPARANDIS_ADAPTER) ctx;
    NdisSetEvent(&pContext->ResetEvent);
}
/*************************************************************
Callback of delayed send pause procedure upon reset request
*************************************************************/
static void OnSendStoppedOnReset(VOID *p)
{
    PARANDIS_ADAPTER *pContext = (PARANDIS_ADAPTER *)p;
    DEBUG_ENTRY(0);
    NdisSetEvent(&pContext->ResetEvent);
}
Esempio n. 11
0
void
shared_dpc_schedule(shared_info_t *sh)
{
	NdisSetEvent(&sh->dpc_event);
}
Esempio n. 12
0
VOID
SxpNdisCompleteInternalOidRequest(
    _In_ PSX_SWITCH_OBJECT Switch,
    _In_ PNDIS_OID_REQUEST NdisRequest,
    _In_ NDIS_STATUS Status
    )
/*++

Routine Description:

    NDIS entry point indicating completion of a pended NDIS_OID_REQUEST.

Arguments:

    Switch - pointer to switch object.

    NdisRequest - pointer to NDIS request

    Status - Status of request completion

Return Value:

    None

--*/
{
    PSX_OID_REQUEST oidRequest;
    ULONG bytesNeeded;
    
    UNREFERENCED_PARAMETER(Switch);

    bytesNeeded = 0;
    oidRequest = NULL;

    switch (NdisRequest->RequestType)
    {
    case NdisRequestSetInformation:
        bytesNeeded = NdisRequest->DATA.SET_INFORMATION.BytesNeeded;
        break;

    case NdisRequestQueryInformation:
        bytesNeeded = NdisRequest->DATA.QUERY_INFORMATION.BytesNeeded;
        break;

    case NdisRequestMethod:
        bytesNeeded = NdisRequest->DATA.METHOD_INFORMATION.BytesNeeded;
        break;
    }

    //
    // Get at the request context.
    //
    oidRequest = CONTAINING_RECORD(NdisRequest, SX_OID_REQUEST, NdisOidRequest);

    //
    // Save away the completion status.
    //
    oidRequest->Status = Status;
    
    //
    // Save bytesNeeded
    //
    oidRequest->BytesNeeded = bytesNeeded;

    //
    // Wake up the thread blocked for this request to complete.
    //
    NdisSetEvent(&oidRequest->ReqEvent);
}
Esempio n. 13
0
void
CAR6KMini::WMIWowListEvent(
    WMI_GET_WOW_LIST_REPLY *wowList)
{

        /* Alocate for the global ptr, copy data &  post wowListReplyGot event. The  function that
         * calls wmi_get_wow_list should free this.
     */

        /* if there are no filters, allocate for WMI_GET_WOW_LIST_REPLY & copy, set event & return
          */

           if(m_networkType == AP_NETWORK)
            {
                return;
            }
        if ( wowList->num_filters == 0) {

            m_WowListReply = (WMI_GET_WOW_LIST_REPLY *) A_MALLOC(sizeof(WMI_GET_WOW_LIST_REPLY));
            if (!m_WowListReply) {
                NdisSetEvent(&m_tgtWowListReplyEvent);
                return;
            }
            A_MEMZERO((A_UINT8 *)m_WowListReply, sizeof(WMI_GET_WOW_LIST_REPLY));
            A_MEMCPY((A_UINT8 *)m_WowListReply, (A_UINT8 *) wowList, sizeof(WMI_GET_WOW_LIST_REPLY));

            NdisSetEvent(&m_tgtWowListReplyEvent);
            return;
        }

        if ( wowList->this_filter_num == 1 ) {

        if ( wowList->num_filters > 1) {

            m_WowListReply = (WMI_GET_WOW_LIST_REPLY *) A_MALLOC(sizeof(WMI_GET_WOW_LIST_REPLY) + sizeof(WOW_FILTER) * (wowList->num_filters-1));
            if (!m_WowListReply) {
                NdisSetEvent(&m_tgtWowListReplyEvent);
                return;
            }
            A_MEMZERO((A_UINT8 *)m_WowListReply, sizeof(WMI_GET_WOW_LIST_REPLY) + sizeof(WOW_FILTER) * (wowList->num_filters-1));

        } else {

           m_WowListReply = (WMI_GET_WOW_LIST_REPLY *) A_MALLOC(sizeof(WMI_GET_WOW_LIST_REPLY));
           if (!m_WowListReply) {
               NdisSetEvent(&m_tgtWowListReplyEvent);
               return;
           }
           A_MEMZERO((A_UINT8 *)m_WowListReply,sizeof(WMI_GET_WOW_LIST_REPLY));

        }

        A_MEMCPY((A_UINT8 *)m_WowListReply, (A_UINT8 *) wowList, sizeof(WMI_GET_WOW_LIST_REPLY));

        } else { // 2nd filter onwards

        A_MEMCPY((A_UINT8 *)m_WowListReply+sizeof(WMI_GET_WOW_LIST_REPLY)+(wowList->this_filter_num-2) *sizeof(WOW_FILTER), (A_UINT8 *) wowList->wow_filters, sizeof(WOW_FILTER));


        } //endif


        // Set the event only after we get all the filter events.
        if ( wowList->this_filter_num == wowList->num_filters ) {
            NdisSetEvent(&m_tgtWowListReplyEvent);
        }

    return;
}
Esempio n. 14
0
void
CAR6KMini::WMITargetStatsEvent(
    WMI_TARGET_STATS *pTargetStats)
{
 if(m_networkType == AP_NETWORK)
    {
            return;
    }
    int ac = 0;

    // Update the RSSI for now.
    if (m_Connected) {
        bss_t *pWmiNode = NULL;

        pWmiNode = wmi_find_node((wmi_t *)m_pWMI,m_PeerBSSID);
        if (pWmiNode)
        {
            pWmiNode->ni_rssi = pTargetStats->cservStats.cs_aveBeacon_rssi;
            wmi_node_return((wmi_t *)m_pWMI, pWmiNode);
        }
        m_RSSI = pTargetStats->cservStats.cs_aveBeacon_rssi;
        //
        // Check whether the current mode is adhoc mode (in case of single node Target returns
        // -95 or -96 RSSI values) since there is no specific event from
        // taregt to indicate whenever joiner is available,
        // host has to check below condition in order to avoid
        // null RSSI
        //
        if ((Ndis802_11IBSS == m_InfrastructureMode) && (RSSI_TO_ABS(m_RSSI) <= 0))
        {
            m_RSSI = 0; // Max RSSI value
        }
    }

    // Update other target Stats.
    if (pTargetStats->txrxStats.tx_stats.tx_packets > pTargetStats->txrxStats.tx_stats.tx_failed_cnt)
    {
        m_tgtStats.TransmittedFragmentCount.QuadPart += (pTargetStats->txrxStats.tx_stats.tx_packets -
                                                         pTargetStats->txrxStats.tx_stats.tx_failed_cnt);
    }
    else
    {
        m_tgtStats.TransmittedFragmentCount.QuadPart += 0;
    }

    m_tgtStats.MulticastTransmittedFrameCount.QuadPart   += (pTargetStats->txrxStats.tx_stats.tx_multicast_pkts + \
                                                             pTargetStats->txrxStats.tx_stats.tx_broadcast_pkts);

    m_tgtStats.FailedCount.QuadPart     += pTargetStats->txrxStats.tx_stats.tx_retry_cnt;
    m_tgtStats.RetryCount.QuadPart      += pTargetStats->txrxStats.tx_stats.tx_mult_retry_cnt;
    m_tgtStats.MultipleRetryCount.QuadPart      += pTargetStats->txrxStats.tx_stats.tx_mult_retry_cnt;

    m_tgtStats.RTSSuccessCount.QuadPart += pTargetStats->txrxStats.tx_stats.tx_rts_success_cnt;
    m_tgtStats.RTSFailureCount.QuadPart += pTargetStats->txrxStats.tx_stats.tx_rts_fail_cnt;

    m_tgtStats.FrameDuplicateCount.QuadPart         += pTargetStats->txrxStats.rx_stats.rx_duplicate_frames;
    m_tgtStats.ReceivedFragmentCount.QuadPart       += pTargetStats->txrxStats.rx_stats.rx_packets;
    m_tgtStats.MulticastReceivedFrameCount.QuadPart += (pTargetStats->txrxStats.rx_stats.rx_multicast_pkts + \
                                pTargetStats->txrxStats.rx_stats.rx_broadcast_pkts);

    m_tgtStats.FCSErrorCount.QuadPart += pTargetStats->txrxStats.rx_stats.rx_crcerr;

    m_txRate = wmi_get_rate (pTargetStats->txrxStats.tx_stats.tx_unicast_rate);
    m_rxRate = wmi_get_rate (pTargetStats->txrxStats.rx_stats.rx_unicast_rate);
#ifdef OS_ROAM_MANAGEMENT

    m_RateInfo.TxRateFiltered   = m_txRate;
    m_RateInfo.RxRateFiltered   = m_rxRate;
    m_RateInfo.TxDataFrames    += pTargetStats->txrxStats.tx_stats.tx_unicast_pkts;
    m_RateInfo.RxDataFrames    += pTargetStats->txrxStats.rx_stats.rx_unicast_pkts;
    m_RateInfo.RssiFiltered     = RSSI_TO_NDIS(pTargetStats->cservStats.cs_aveBeacon_rssi);

    if (m_Connected && (0 == pTargetStats->cservStats.cs_bmiss_cnt))
    {
        m_RateInfo.LastRssiBeaconTime = A_MS_TICKGET();
    }
#endif
    /* RX/TX Stats */
    m_tgtAllStats.tx_packets          += pTargetStats->txrxStats.tx_stats.tx_packets;
    m_tgtAllStats.tx_bytes            += pTargetStats->txrxStats.tx_stats.tx_bytes;
    m_tgtAllStats.tx_unicast_pkts     += pTargetStats->txrxStats.tx_stats.tx_unicast_pkts;
    m_tgtAllStats.tx_unicast_bytes    += pTargetStats->txrxStats.tx_stats.tx_unicast_bytes;
    m_tgtAllStats.tx_multicast_pkts   += pTargetStats->txrxStats.tx_stats.tx_multicast_pkts;
    m_tgtAllStats.tx_multicast_bytes  += pTargetStats->txrxStats.tx_stats.tx_multicast_bytes;
    m_tgtAllStats.tx_broadcast_pkts   += pTargetStats->txrxStats.tx_stats.tx_broadcast_pkts;
    m_tgtAllStats.tx_broadcast_bytes  += pTargetStats->txrxStats.tx_stats.tx_broadcast_bytes;
    m_tgtAllStats.tx_rts_success_cnt  += pTargetStats->txrxStats.tx_stats.tx_rts_success_cnt;

    for (ac = 0; ac < WMM_NUM_AC; ac++)
        m_tgtAllStats.tx_packet_per_ac[ac] += pTargetStats->txrxStats.tx_stats.tx_packet_per_ac[ac];

    m_tgtAllStats.tx_errors           += pTargetStats->txrxStats.tx_stats.tx_errors;
    m_tgtAllStats.tx_failed_cnt       += pTargetStats->txrxStats.tx_stats.tx_failed_cnt;
    m_tgtAllStats.tx_retry_cnt        += pTargetStats->txrxStats.tx_stats.tx_retry_cnt;
    m_tgtAllStats.tx_mult_retry_cnt   += pTargetStats->txrxStats.tx_stats.tx_mult_retry_cnt;
    m_tgtAllStats.tx_rts_fail_cnt     += pTargetStats->txrxStats.tx_stats.tx_rts_fail_cnt;
    m_tgtAllStats.tx_unicast_rate      = wmi_get_rate(pTargetStats->txrxStats.tx_stats.tx_unicast_rate);

    m_tgtAllStats.rx_packets          += pTargetStats->txrxStats.rx_stats.rx_packets;
    m_tgtAllStats.rx_bytes            += pTargetStats->txrxStats.rx_stats.rx_bytes;
    m_tgtAllStats.rx_unicast_pkts     += pTargetStats->txrxStats.rx_stats.rx_unicast_pkts;
    m_tgtAllStats.rx_unicast_bytes    += pTargetStats->txrxStats.rx_stats.rx_unicast_bytes;
    m_tgtAllStats.rx_multicast_pkts   += pTargetStats->txrxStats.rx_stats.rx_multicast_pkts;
    m_tgtAllStats.rx_multicast_bytes  += pTargetStats->txrxStats.rx_stats.rx_multicast_bytes;
    m_tgtAllStats.rx_broadcast_pkts   += pTargetStats->txrxStats.rx_stats.rx_broadcast_pkts;
    m_tgtAllStats.rx_broadcast_bytes  += pTargetStats->txrxStats.rx_stats.rx_broadcast_bytes;
    m_tgtAllStats.rx_fragment_pkt     += pTargetStats->txrxStats.rx_stats.rx_fragment_pkt;
    m_tgtAllStats.rx_errors           += pTargetStats->txrxStats.rx_stats.rx_errors;
    m_tgtAllStats.rx_crcerr           += pTargetStats->txrxStats.rx_stats.rx_crcerr;
    m_tgtAllStats.rx_key_cache_miss   += pTargetStats->txrxStats.rx_stats.rx_key_cache_miss;
    m_tgtAllStats.rx_decrypt_err      += pTargetStats->txrxStats.rx_stats.rx_decrypt_err;
    m_tgtAllStats.rx_duplicate_frames += pTargetStats->txrxStats.rx_stats.rx_duplicate_frames;
    m_tgtAllStats.rx_unicast_rate      = wmi_get_rate(pTargetStats->txrxStats.rx_stats.rx_unicast_rate);


    /* Cserv Stats */
    m_tgtAllStats.cs_bmiss_cnt += pTargetStats->cservStats.cs_bmiss_cnt;
    m_tgtAllStats.cs_lowRssi_cnt += pTargetStats->cservStats.cs_lowRssi_cnt;
    m_tgtAllStats.cs_connect_cnt += pTargetStats->cservStats.cs_connect_cnt;
    m_tgtAllStats.cs_disconnect_cnt += pTargetStats->cservStats.cs_disconnect_cnt;

    m_tgtAllStats.cs_aveBeacon_snr = pTargetStats->cservStats.cs_aveBeacon_snr;
    m_tgtAllStats.cs_aveBeacon_rssi = pTargetStats->cservStats.cs_aveBeacon_rssi;
    m_tgtAllStats.cs_lastRoam_msec = pTargetStats->cservStats.cs_lastRoam_msec;
    m_tgtAllStats.cs_snr = pTargetStats->cservStats.cs_snr;
    m_tgtAllStats.cs_rssi = pTargetStats->cservStats.cs_rssi;


    /* WoW Stats */
    m_tgtAllStats.wow_num_pkts_dropped += pTargetStats->wowStats.wow_num_pkts_dropped;
    m_tgtAllStats.wow_num_host_pkt_wakeups += pTargetStats->wowStats.wow_num_host_pkt_wakeups;
    m_tgtAllStats.wow_num_host_event_wakeups += pTargetStats->wowStats.wow_num_host_event_wakeups;
    m_tgtAllStats.wow_num_events_discarded  += pTargetStats->wowStats.wow_num_events_discarded;


    /* TKIP,CCMP  Stats */
    m_tgtAllStats.tkip_local_mic_failure += pTargetStats->txrxStats.tkipCcmpStats.tkip_local_mic_failure;
    m_tgtAllStats.tkip_counter_measures_invoked += pTargetStats->txrxStats.tkipCcmpStats.tkip_counter_measures_invoked;
    m_tgtAllStats.tkip_replays += pTargetStats->txrxStats.tkipCcmpStats.tkip_replays;
    m_tgtAllStats.tkip_format_errors += pTargetStats->txrxStats.tkipCcmpStats.tkip_format_errors;
    m_tgtAllStats.ccmp_format_errors += pTargetStats->txrxStats.tkipCcmpStats.ccmp_format_errors;
    m_tgtAllStats.ccmp_replays += pTargetStats->txrxStats.tkipCcmpStats.ccmp_replays;

    /* misc stats */
    m_tgtAllStats.power_save_failure_cnt += pTargetStats->pmStats.power_save_failure_cnt;
    m_tgtAllStats.noise_floor_calibation = pTargetStats->noise_floor_calibation;
    m_tgtAllStats.lqVal              = pTargetStats->lqVal;

    //post targetStats event
    NdisSetEvent(&m_tgtStatsEvent);

    return;
}
Esempio n. 15
0
void
CAR6KMini::WMIDisconnectIndication(A_UINT8 reason)
{
#ifdef NO_BCAST_PROBE_IN_CONNECT
    wmi_probedSsid_cmd((struct wmi_t *)m_pWMI, 0, ANY_SSID_FLAG, 0,NULL);
#endif
    do
    {
        //
        // Ignore pyxis specific reason during IEEE Mode
        //
        if (m_Connected)
        {
            if (reason == NO_NETWORK_AVAIL)
            {
                // remove the current associated bssid node
                wmi_free_node ((wmi_t *)m_pWMI, m_PeerBSSID);

                //
                // In case any other same SSID nodes are present
                // remove it, since those nodes also not available now
                //
                IterateNodeAndRemoveSSID (&m_SSID);

                SendWMIDisconnectCommand ();
            }

            // Flush any pending NDIS packets
            FlushNdisPacketTransmitQueue();

#ifdef OS_ROAM_MANAGEMENT
        if (FALSE == m_osRoamControl)
        {
#endif
        m_RSSIlevel = 0;
        if (m_Config.hostAssistedRoaming)
        {
            A_UNTIMEOUT(&m_rssiScanTimer);
        }
            NdisMIndicateStatus(m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_DISCONNECT, 0, 0);
        NdisMIndicateStatusComplete(m_MiniportAdapterHandle);
#ifdef OS_ROAM_MANAGEMENT
        }
        else
        {
            A_UNTIMEOUT(&m_disconnectIndicationTimer);
            A_TIMEOUT_MS(&m_disconnectIndicationTimer, m_Config.discTimeout*1000, 0);
        }
#endif
        //
        // Reset Chanel and BSSID info
        //
        m_Connected         = FALSE;
        m_ChannelHint       = 0;
        m_ConnectedChannel  = 0;
        memset (m_PeerBSSID, 0, ETHERNET_MAC_ADDRESS_LENGTH);
    }

    if (m_bIsSwitchAPtoSTA)
    {
        m_bIsSwitchAPtoSTA = FALSE;
        NdisMIndicateStatus(m_MiniportAdapterHandle, NDIS_STATUS_MEDIA_DISCONNECT, 0, 0);
        NdisMIndicateStatusComplete(m_MiniportAdapterHandle);
       //     configTargetParams();
        m_WantToBeConnected = TRUE;
    }


        {
            //
            // no need to send WMIConnect when target reply disconnect
            // reason other than DISCONNECT_CMD
            //
            if (DISCONNECT_CMD == reason)
            {
                m_ConnectInProgress = FALSE;
                if (m_WantToBeConnected)
                {
                    SendWMIConnectCommand (&m_SSID);
                }
            }
        }

    } while (FALSE);

    NdisSetEvent (&m_SuspendEvent);
}