Ejemplo n.º 1
0
NTSTATUS RTMP_BBP_IO_WRITE8_BY_REG_ID(
	RTMP_ADAPTER *pAd,
	UINT32 Offset,
	UINT8 Value)
{
#ifdef RT65xx
	if (IS_RT65XX(pAd))
		return STATUS_UNSUCCESSFUL;
#endif /* RT65xx */


#ifdef RTMP_MAC_PCI
/*
	This marco used for the BBP write operation which need via MCU.
	But for some chipset which didn't have mcu (e.g., RBUS based chipset), we
	will use this function too and didn't access the bbp register via the MCU.
*/
	if ((pAd)->bPCIclkOff == FALSE)
	{
		if ((pAd)->infType == RTMP_DEV_INF_RBUS)
			RTMP_BBP_IO_WRITE8(pAd, Offset, Value, FALSE);
		else
			if(IS_SUPPORT_PCIE_PS_L3(pAd))
				RTMP_PCIE_PS_L3_BBP_IO_WRITE8(pAd, Offset, Value, TRUE);
			else
			RTMP_BBP_IO_WRITE8(pAd, Offset, Value, TRUE);
	}

	return STATUS_SUCCESS;
#endif /* RTMP_MAC_PCI */
}
Ejemplo n.º 2
0
CHAR ConvertToRssi(RTMP_ADAPTER *pAd, CHAR Rssi, UCHAR rssi_idx)
{
	UCHAR	RssiOffset, LNAGain;

	/* Rssi equals to zero or rssi_idx larger than 3 should be an invalid value*/
	if (Rssi == 0 || rssi_idx >= 3)
		return -99;

	LNAGain = GET_LNA_GAIN(pAd);
	if (pAd->LatchRfRegs.Channel > 14)
		RssiOffset = pAd->ARssiOffset[rssi_idx];
	else
		RssiOffset = pAd->BGRssiOffset[rssi_idx];

#ifdef RT65xx
	/*
		Recommended by CSD team:
		2.4G : RSSI_report = RSSI_bpp + EEPROM_0x46[15:8 or 7:0] - EEPROM_0x44[7:0]
		5G : RSSI_report = RSSI_bbp + EEPROM_0x4A[15:8 or 7:0] - EEPROM_0x44 or 0x48 or 0x4c[15:8]
	*/
	if (IS_RT65XX(pAd))
		return (Rssi + RssiOffset - LNAGain);
	else
#endif /* RT65xx */
		return (-12 - RssiOffset - LNAGain - Rssi);
}
Ejemplo n.º 3
0
static inline BOOLEAN rf_csr_poll_idle(RTMP_ADAPTER *pAd, UINT32 *rfcsr)
{
    RF_CSR_CFG_STRUC *csr_val;
    BOOLEAN idle = BUSY;
    INT i = 0;

    do
    {
        if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
            break;

        RTMP_IO_READ32(pAd, RF_CSR_CFG, rfcsr);

        csr_val = (RF_CSR_CFG_STRUC *)rfcsr;
#ifdef RT65xx
        if (IS_RT65XX(pAd))
            idle = csr_val->bank_65xx.RF_CSR_KICK;
        else
#endif /* RT65xx */
            idle = csr_val->non_bank.RF_CSR_KICK;

        if (idle == IDLE)
            break;

        i++;
    } while (i < MAX_BUSY_COUNT);

    if ((i == MAX_BUSY_COUNT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
    {
        DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed(cnt=%d)!\n", i));
    }

    return idle;
}
Ejemplo n.º 4
0
NDIS_STATUS rlt_rf_write(
    IN PRTMP_ADAPTER pAd,
    IN UCHAR bank,
    IN UCHAR regID,
    IN UCHAR value)
{
    RF_CSR_CFG_STRUC rfcsr = { { 0 } };
    NDIS_STATUS	 ret;


#ifdef RTMP_MAC_PCI
    if ((pAd->bPCIclkOff == TRUE) || (pAd->LastMCUCmd == SLEEP_MCU_CMD))
    {
        DBGPRINT_ERR(("rlt_rf_write. Not allow to write RF 0x%x : fail\n",  regID));
        return STATUS_UNSUCCESSFUL;
    }
#endif /* RTMP_MAC_PCI */

#ifdef RLT_MAC
    // TODO: shiang-usw, why we need to check this for MT7601?? Get these code from MT7601!
    if (pAd->chipCap.hif_type == HIF_RLT) {
        if (pAd->WlanFunCtrl.field.WLAN_EN == 0)
        {
            DBGPRINT_ERR(("rlt_rf_write. Not allow to write RF 0x%x : fail\n",  regID));
            return STATUS_UNSUCCESSFUL;
        }
    }
#endif /* RLT_MAC */


    ASSERT((regID <= pAd->chipCap.MaxNumOfRfId));

    ret = STATUS_UNSUCCESSFUL;
    if (rf_csr_poll_idle(pAd, &rfcsr.word) != IDLE)
        goto done;

#ifdef RT65xx
    if (IS_RT65XX(pAd)) {
        rfcsr.bank_65xx.RF_CSR_WR = 1;
        rfcsr.bank_65xx.RF_CSR_KICK = 1;
        rfcsr.bank_65xx.RF_CSR_REG_BANK = bank;
        rfcsr.bank_65xx.RF_CSR_REG_ID = regID;
        rfcsr.bank_65xx.RF_CSR_DATA = value;
    }
    else
#endif /* RT65xx */
    {
        DBGPRINT_ERR(("%s():RF write with wrong handler!\n", __FUNCTION__));
        goto done;
    }
    RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);

    ret = NDIS_STATUS_SUCCESS;

done:

    return ret;
}
Ejemplo n.º 5
0
/*
    ========================================================================
    Routine Description:
        Periodic evaluate antenna link status
        
    Arguments:
        pAd         - Adapter pointer
        
    Return Value:
        None
        
    ========================================================================
*/
VOID APAsicEvaluateRxAnt(
	IN PRTMP_ADAPTER	pAd)
{
	ULONG	TxTotalCnt;

#ifdef RALINK_ATE
	if (ATE_ON(pAd))
		return;
#endif /* RALINK_ATE */
#ifdef CARRIER_DETECTION_SUPPORT
	if(pAd->CommonCfg.CarrierDetect.CD_State == CD_SILENCE)
	return;
#endif /* CARRIER_DETECTION_SUPPORT */

#ifdef RT8592
	// TODO: shiang-6590, for 8592, this EvaaluateRxAnt still need??
	if (IS_RT8592(pAd))
		return;
#endif /* RT8592 */

#ifdef RT65xx
	if (IS_RT65XX(pAd))
		return;
#endif /* RT76x0 */


#ifdef TXBF_SUPPORT
	/* TODO: we didn't do RxAnt evaluate for 3x3 chips */
	if (IS_RT3883(pAd) || IS_RT2883(pAd))
		return;
#endif /* TXBF_SUPPORT */

	
#ifdef DOT11_N_SUPPORT
#ifdef GREENAP_SUPPORT
	if (pAd->ApCfg.bGreenAPActive == TRUE)
		bbp_set_rxpath(pAd, 1);
	else
#endif /* GREENAP_SUPPORT */
#endif /* DOT11_N_SUPPORT */
		bbp_set_rxpath(pAd, pAd->Antenna.field.RxPath);

	TxTotalCnt = pAd->RalinkCounters.OneSecTxNoRetryOkCount + 
					pAd->RalinkCounters.OneSecTxRetryOkCount + 
					pAd->RalinkCounters.OneSecTxFailCount;

	if (TxTotalCnt > 50)
	{
		RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 20);
		pAd->Mlme.bLowThroughput = FALSE;
	}
	else
	{
		RTMPSetTimer(&pAd->Mlme.RxAntEvalTimer, 300);
		pAd->Mlme.bLowThroughput = TRUE;
	}
}
static BOOLEAN AsicGetMacVersion(RTMP_ADAPTER *pAd)
{
	UINT32 reg = MAC_CSR0;

#ifdef RT65xx
	if (IS_RT65XX(pAd))
		RTMP_IO_READ32(pAd, ASIC_VERSION, &pAd->ChipID);
#endif /* RT65xx */

	if (WaitForAsicReady(pAd) == TRUE) {
		RTMP_IO_READ32(pAd, reg, &pAd->MACVersion);
		DBGPRINT(RT_DEBUG_OFF, ("MACVersion[Ver:Rev]=0x%08x : 0x%08x\n",
				pAd->MACVersion, pAd->ChipID));
		return TRUE;
	} else {
		DBGPRINT(RT_DEBUG_ERROR, ("%s() failed!\n", __FUNCTION__));
		return FALSE;
	}
}
Ejemplo n.º 7
0
/*
	========================================================================

	Routine Description: Read RF register through MAC

	Arguments:

	Return Value:

	IRQL =

	Note:

	========================================================================
*/
NDIS_STATUS rlt_rf_read(
    IN RTMP_ADAPTER *pAd,
    IN UCHAR bank,
    IN UCHAR regID,
    IN UCHAR *pValue)
{
    RF_CSR_CFG_STRUC rfcsr = { { 0 } };
    UINT i=0, k=0;
    BOOLEAN rf_status;
    NDIS_STATUS	 ret = STATUS_UNSUCCESSFUL;

#ifdef MT76x0
    if (IS_MT7610U(pAd)) {
        BANK_RF_REG_PAIR reg;
        reg.Bank = bank;
        reg.Register = regID;
        RF_RANDOM_READ(pAd, &reg, 1);

        *pValue = reg.Value;
        return NDIS_STATUS_SUCCESS;
    }
#endif /* MT76x0 */

#ifdef RTMP_MAC_PCI
    if ((pAd->bPCIclkOff == TRUE) || (pAd->LastMCUCmd == SLEEP_MCU_CMD))
    {
        DBGPRINT_ERR(("RT30xxReadRFRegister. Not allow to read RF 0x%x : fail\n",  regID));
        return STATUS_UNSUCCESSFUL;
    }
#endif /* RTMP_MAC_PCI */

#ifdef RTMP_MAC_USB
    if (IS_USB_INF(pAd)) {
        RTMP_SEM_EVENT_WAIT(&pAd->reg_atomic, i);
        if (i != 0) {
            DBGPRINT(RT_DEBUG_ERROR, ("reg_atomic get failed(ret=%d)\n", i));
            return STATUS_UNSUCCESSFUL;
        }
    }
#endif /* RTMP_MAC_USB */

    ASSERT((regID <= pAd->chipCap.MaxNumOfRfId));

    rfcsr.word = 0;

    for (i=0; i<MAX_BUSY_COUNT; i++)
    {
        if(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
            goto done;

        rf_status = rf_csr_poll_idle(pAd, &rfcsr.word);
        if ( rf_status == BUSY)
            break;

        rfcsr.word = 0;
#ifdef RT6352
        if (IS_RT6352(pAd))
        {
            rfcsr.bank_6352.RF_CSR_WR = 0;
            rfcsr.bank_6352.RF_CSR_KICK = 1;
            rfcsr.bank_6352.TESTCSR_RFACC_REGNUM = (regID | (bank << 6));
        }
        else
#endif /* RT6352 */
#ifdef RT65xx
            if (IS_RT65XX(pAd)) {
                rfcsr.bank_65xx.RF_CSR_WR = 0;
                rfcsr.bank_65xx.RF_CSR_KICK = 1;
                rfcsr.bank_65xx.RF_CSR_REG_ID = regID;
                rfcsr.bank_65xx.RF_CSR_REG_BANK = bank;
            }
            else
#endif /* RT65xx */
            {
                DBGPRINT_ERR(("RF[%d] read function for non-supported chip[0x%x]\n", regID, pAd->MACVersion));
                break;
            }

        RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);

        rf_status = rf_csr_poll_idle(pAd, &rfcsr.word);
        if (rf_status == IDLE)
        {
#ifdef RT6352
            if (IS_RT6352(pAd) && ((rfcsr.bank_6352.TESTCSR_RFACC_REGNUM & 0x3F) == regID))
            {
                *pValue = (UCHAR)(rfcsr.bank_6352.RF_CSR_DATA);
                break;
            }
#endif /* RT6352 */
#ifdef RT65xx
            if (IS_RT65XX(pAd) && (rfcsr.bank_65xx.RF_CSR_REG_ID == regID) &&
                    (rfcsr.bank_65xx.RF_CSR_REG_BANK == bank))
            {
                *pValue = (UCHAR)(rfcsr.bank_65xx.RF_CSR_DATA);
                break;
            }
#endif /* RT65xx */
        }
    }

    if (rf_status == BUSY)
    {
        DBGPRINT_ERR(("RF read R%d=0x%X fail, i[%d], k[%d]\n", regID, rfcsr.word,i,k));
        goto done;
    }
    ret = STATUS_SUCCESS;
#if 0
    if (bank >= RF_BANK4)
    {
        printk("TESTCSR_RFACC_REGNUM = %x, RF_CSR_DATA = %x !!!\n", rfcsr.field.TESTCSR_RFACC_REGNUM, rfcsr.field.RF_CSR_DATA);
    }
#endif

done:
#ifdef RTMP_MAC_USB
    if (IS_USB_INF(pAd)) {
        RTMP_SEM_EVENT_UP(&pAd->reg_atomic);
    }
#endif /* RTMP_MAC_USB */

    return ret;
}
Ejemplo n.º 8
0
INT rtmp_mac_fifo_stat_update(RTMP_ADAPTER *pAd)
{
	TX_STA_FIFO_STRUC	StaFifo;
	TX_STA_FIFO_EXT_STRUC StaFifoExt;
	MAC_TABLE_ENTRY		*pEntry = NULL;
	UINT32				i = 0;
	UCHAR				pid = 0, wcid = 0;
	INT32				reTry;
	UCHAR				succMCS;



	do
	{
#ifdef FIFO_EXT_SUPPORT
		if (IS_RT65XX(pAd)) {
			RTMP_IO_READ32(pAd, TX_STA_FIFO_EXT, &StaFifoExt.word);
		}
#endif /* FIFO_EXT_SUPPORT */
		RTMP_IO_READ32(pAd, TX_STA_FIFO, &StaFifo.word);

		if (StaFifo.field.bValid == 0)
			break;
	
		wcid = (UCHAR)StaFifo.field.wcid;

#ifdef DBG_CTRL_SUPPORT
#ifdef INCLUDE_DEBUG_QUEUE
	if (pAd->CommonCfg.DebugFlags & DBF_DBQ_TXFIFO) {
		dbQueueEnqueue(0x73, (UCHAR *)(&StaFifo.word));
	}
#endif /* INCLUDE_DEBUG_QUEUE */
#endif /* DBG_CTRL_SUPPORT */

	/* ignore NoACK and MGMT frame use 0xFF as WCID */
		if ((StaFifo.field.TxAckRequired == 0) || (wcid >= MAX_LEN_OF_MAC_TABLE))
		{
			i++;
			continue;
		}

		/* PID store Tx MCS Rate */
#ifdef FIFO_EXT_SUPPORT
		if (IS_RT65XX(pAd))
			pid = (UCHAR)StaFifoExt.field.pkt_id_65xx;
		else
#endif /* FIFO_EXT_SUPPORT */
			pid = (UCHAR)StaFifo.field.PidType;

		pEntry = &pAd->MacTab.Content[wcid];

		if (pEntry & pAd->MacTab.tr_entry[wcid].PsDeQWaitCnt)
			pAd->MacTab.tr_entry[wcid].PsDeQWaitCnt = 0;

		pEntry->DebugFIFOCount++;


#ifdef DOT11_N_SUPPORT
#endif /* DOT11_N_SUPPORT */

#ifdef UAPSD_SUPPORT
		UAPSD_SP_AUE_Handle(pAd, pEntry, StaFifo.field.TxSuccess);
#endif /* UAPSD_SUPPORT */


		if (!StaFifo.field.TxSuccess)
		{
			pEntry->FIFOCount++;
			pEntry->OneSecTxFailCount++;
								
			if (pEntry->FIFOCount >= 1)
			{			
				DBGPRINT(RT_DEBUG_TRACE, ("#"));
#ifdef DOT11_N_SUPPORT
				pEntry->NoBADataCountDown = 64;
#endif /* DOT11_N_SUPPORT */


				/* Update the continuous transmission counter.*/
				pEntry->ContinueTxFailCnt++;
				// TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry!
				pAd->MacTab.tr_entry[pEntry->wcid].ContinueTxFailCnt++;

				if(pEntry->PsMode == PWR_ACTIVE)
				{
#ifdef DOT11_N_SUPPORT					
					int tid;
					for (tid=0; tid<NUM_OF_TID; tid++)
						BAOriSessionTearDown(pAd, pEntry->wcid,  tid, FALSE, FALSE);
#endif /* DOT11_N_SUPPORT */

#ifdef WDS_SUPPORT
					/* fix WDS Jam issue*/
					if(IS_ENTRY_WDS(pEntry)
						&& (pEntry->LockEntryTx == FALSE)
						&& (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck))
					{ 
						DBGPRINT(RT_DEBUG_TRACE, ("Entry %02x:%02x:%02x:%02x:%02x:%02x Blocked!! (Fail Cnt = %d)\n",
							PRINT_MAC(pEntry->Addr), pEntry->ContinueTxFailCnt ));

						pEntry->LockEntryTx = TRUE;
						// TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry!
						pAd->MacTab.tr_entry[pEntry->wcid].LockEntryTx = TRUE;

					}
#endif /* WDS_SUPPORT */
				}
			}
#ifdef CONFIG_AP_SUPPORT
#ifdef RTMP_MAC_PCI
		/* if Tx fail >= 20, then clear TXWI ack in Tx Ring*/
		if (pEntry->ContinueTxFailCnt >= pAd->ApCfg.EntryLifeCheck)
			ClearTxRingClientAck(pAd, pEntry);	
#endif /* RTMP_MAC_PCI */				
#endif /* CONFIG_AP_SUPPORT */
		}
		else
		{
#ifdef DOT11_N_SUPPORT
			if ((pEntry->PsMode != PWR_SAVE) && (pEntry->NoBADataCountDown > 0))
			{
				pEntry->NoBADataCountDown--;
				if (pEntry->NoBADataCountDown==0)
				{
					DBGPRINT(RT_DEBUG_TRACE, ("@\n"));
				}
			}
#endif /* DOT11_N_SUPPORT */
			pEntry->FIFOCount = 0;
			pEntry->OneSecTxNoRetryOkCount++;


			/* update NoDataIdleCount when sucessful send packet to STA.*/
			pEntry->NoDataIdleCount = 0;
			pEntry->ContinueTxFailCnt = 0;
#ifdef WDS_SUPPORT
			pEntry->LockEntryTx = FALSE;
#endif /* WDS_SUPPORT */
			// TODO: shiang-usw, remove upper setting because we need to mirgate to tr_entry!
			pAd->MacTab.tr_entry[pEntry->wcid].NoDataIdleCount = 0;
			pAd->MacTab.tr_entry[pEntry->wcid].ContinueTxFailCnt = 0;
			pAd->MacTab.tr_entry[pEntry->wcid].LockEntryTx = FALSE;

		}

		succMCS = StaFifo.field.SuccessRate & 0x7F;
#ifdef DOT11N_SS3_SUPPORT
		if (pEntry->HTCapability.MCSSet[2] == 0xff)
		{
			if (succMCS > pid)
				pid = pid + 16;
		}
#endif /* DOT11N_SS3_SUPPORT */

		if (StaFifo.field.TxSuccess)
		{
			pEntry->TXMCSExpected[pid]++;
			if (pid == succMCS)
				pEntry->TXMCSSuccessful[pid]++;
			else 
				pEntry->TXMCSAutoFallBack[pid][succMCS]++;
		}
		else
		{
			pEntry->TXMCSFailed[pid]++;
		}

#ifdef DOT11N_SS3_SUPPORT
		if (pid >= 16 && succMCS <= 8)
			succMCS += (2 - (succMCS >> 3)) * 7;
#endif /* DOT11N_SS3_SUPPORT */

		reTry = pid - succMCS;

		if (reTry > 0)
		{
			/* MCS8 falls back to 0 */
			if (pid>=8 && succMCS==0)
				reTry -= 7;
			else if ((pid >= 12) && succMCS <=7)
				reTry -= 4;

			pEntry->OneSecTxRetryOkCount += reTry;
		}

		i++;	/* ASIC store 16 stack*/
	} while ( i < (TX_RING_SIZE<<1) );

}
Ejemplo n.º 9
0
VOID RTMP_BBP_IO_READ8(
	PRTMP_ADAPTER pAd,
	UCHAR bbp_id,
	UINT8 *pValue,
	BOOLEAN bViaMCU)
{
	BBP_CSR_CFG_STRUC BbpCsr;
	int _busyCnt, _secCnt, _regID;
	ULONG __IrqFlags = 0;

#ifdef RT65xx
	if (IS_RT65XX(pAd))
		return;
#endif /* RT65xx */


	if ((bViaMCU) == TRUE)
		RTMP_MAC_SHR_MSEL_PROTECT_LOCK(pAd, __IrqFlags);

	_regID = ((bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG);
	for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++)
	{
		RTMP_IO_READ32(pAd, _regID, &BbpCsr.word);
		if (BbpCsr.field.Busy == BUSY)
			continue;
		BbpCsr.word = 0;
		BbpCsr.field.fRead = 1;
		BbpCsr.field.BBP_RW_MODE = 1;
		BbpCsr.field.Busy = 1;
		BbpCsr.field.RegNum = bbp_id;
		RTMP_IO_WRITE32(pAd, _regID, BbpCsr.word);
		if ((bViaMCU) == TRUE)
		{
			AsicSendCommandToMcuBBP(pAd, 0x80, 0xff, 0x0, 0x0, FALSE);
			/*RtmpusecDelay(1000);*/
		}
		for (_secCnt=0; _secCnt<MAX_BUSY_COUNT; _secCnt++)
		{
			RTMP_IO_READ32(pAd, _regID, &BbpCsr.word);
			if (BbpCsr.field.Busy == IDLE)
				break;
		}
		if ((BbpCsr.field.Busy == IDLE) && (BbpCsr.field.RegNum == bbp_id))
		{
			*pValue = (UCHAR)BbpCsr.field.Value;
			break;
		}
	}

	if (BbpCsr.field.Busy == BUSY)
	{
		DBGPRINT_ERR(("BBP(viaMCU=%d) read R%d fail\n", bViaMCU, bbp_id));
		*pValue = pAd->BbpWriteLatch[bbp_id];
		if (bViaMCU == TRUE)
		{
			RTMP_IO_READ32(pAd, _regID, &BbpCsr.word);
			BbpCsr.field.Busy = 0;
			RTMP_IO_WRITE32(pAd, _regID, BbpCsr.word);
		}
	}

	if (bViaMCU == TRUE)
		RTMP_MAC_SHR_MSEL_PROTECT_UNLOCK(pAd, __IrqFlags);
}
Ejemplo n.º 10
0
VOID RTMP_BBP_IO_WRITE8(
	RTMP_ADAPTER *pAd,
	UCHAR bbp_id,
	UINT8 Value,
	BOOLEAN bViaMCU)
{
	BBP_CSR_CFG_STRUC BbpCsr;
	int _busyCnt=0, _regID;
	BOOLEAN brc;
	ULONG __IrqFlags = 0;

#ifdef RT65xx
	if (IS_RT65XX(pAd))
		return;
#endif /* RT65xx */


	if (bViaMCU == TRUE)
		RTMP_MAC_SHR_MSEL_PROTECT_LOCK(pAd, __IrqFlags);

	_regID = (bViaMCU == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG);
	for (_busyCnt=1; _busyCnt<MAX_BUSY_COUNT; _busyCnt++)
	{
		RTMP_IO_READ32((pAd), _regID, &BbpCsr.word);
		if (BbpCsr.field.Busy == BUSY)
		{
				if ( (bViaMCU == TRUE) && ((_busyCnt % 20) == 0))
				{
					BbpCsr.field.Busy = IDLE;
					RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);
				}
			continue;
		}
		BbpCsr.word = 0;
		BbpCsr.field.fRead = 0;
		BbpCsr.field.BBP_RW_MODE = 1;
		BbpCsr.field.Busy = 1;
		BbpCsr.field.Value = Value;
		BbpCsr.field.RegNum = bbp_id;
		RTMP_IO_WRITE32((pAd), _regID, BbpCsr.word);
		if (bViaMCU == TRUE)
		{
			brc = AsicSendCommandToMcuBBP(pAd, 0x80, 0xff, 0x0, 0x0, FALSE);
			if (pAd->OpMode == OPMODE_AP)
				RtmpusecDelay(1000);
			if (brc == FALSE)
			{
				BbpCsr.field.Busy = IDLE;
				RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);
			}
		}
		pAd->BbpWriteLatch[bbp_id] = Value;
		break;
	}
	if (_busyCnt == MAX_BUSY_COUNT)
	{
		DBGPRINT_ERR(("BBP write R%d fail\n", bbp_id));
		if(bViaMCU == TRUE)
		{
			RTMP_IO_READ32(pAd, H2M_BBP_AGENT, &BbpCsr.word);
			BbpCsr.field.Busy = 0;
			RTMP_IO_WRITE32(pAd, H2M_BBP_AGENT, BbpCsr.word);
		}
	}
	if (bViaMCU == TRUE)
		RTMP_MAC_SHR_MSEL_PROTECT_UNLOCK(pAd, __IrqFlags);
		
}
Ejemplo n.º 11
0
/*
	========================================================================
	
	Routine Description:
		Calculates the duration which is required to transmit out frames
	with given size and specified rate.
					  
	Arguments:
		pTxWI		Pointer to head of each MPDU to HW.
		Ack 		Setting for Ack requirement bit
		Fragment	Setting for Fragment bit
		RetryMode	Setting for retry mode
		Ifs 		Setting for IFS gap
		Rate		Setting for transmit rate
		Service 	Setting for service
		Length		Frame length
		TxPreamble	Short or Long preamble when using CCK rates
		QueIdx - 0-3, according to 802.11e/d4.4 June/2003
		
	Return Value:
		None
	
	See also : BASmartHardTransmit()    !!!
	
	========================================================================
*/
VOID RTMPWriteTxWI(
	IN RTMP_ADAPTER *pAd,
	IN TXWI_STRUC *pOutTxWI,
	IN BOOLEAN FRAG,
	IN BOOLEAN CFACK,
	IN BOOLEAN InsTimestamp,
	IN BOOLEAN AMPDU,
	IN BOOLEAN Ack,
	IN BOOLEAN NSeq,		/* HW new a sequence.*/
	IN UCHAR BASize,
	IN UCHAR WCID,
	IN ULONG Length,
	IN UCHAR PID,
	IN UCHAR TID,
	IN UCHAR TxRate,
	IN UCHAR Txopmode,
	IN BOOLEAN CfAck,
	IN HTTRANSMIT_SETTING *pTransmit)
{
	PMAC_TABLE_ENTRY pMac = NULL;
	TXWI_STRUC TxWI, *pTxWI;
	UINT8 TXWISize = pAd->chipCap.TXWISize;

	if (WCID < MAX_LEN_OF_MAC_TABLE)
		pMac = &pAd->MacTab.Content[WCID];

	
	/* 
		Always use Long preamble before verifiation short preamble functionality works well.
		Todo: remove the following line if short preamble functionality works
	*/
	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED);
	NdisZeroMemory(&TxWI, TXWISize);
	pTxWI = &TxWI;
	pTxWI->TxWIFRAG= FRAG;
	pTxWI->TxWICFACK = CFACK;
	pTxWI->TxWITS= InsTimestamp;
	pTxWI->TxWIAMPDU = AMPDU;
	pTxWI->TxWIACK = Ack;
	pTxWI->TxWITXOP= Txopmode;
	
	pTxWI->TxWINSEQ = NSeq;
	/* John tune the performace with Intel Client in 20 MHz performance*/
#ifdef DOT11_N_SUPPORT
	BASize = pAd->CommonCfg.TxBASize;
#ifdef RT65xx
	if (IS_RT65XX(pAd))
	{
		if (BASize > 31)
			BASize =31;
	}
	else
#endif /* RT65xx */
#ifdef MT7601
	if (IS_MT7601(pAd))
	{
		if (BASize > 15)
			BASize =15;
	}
	else
#endif /* MT7601 */
	if (pAd->MACVersion == 0x28720200)
	{
		if (BASize > 13)
			BASize =13;
	}
	else
	{
		if( BASize >7 )
			BASize =7;
	}

	pTxWI->TxWIBAWinSize = BASize;
	pTxWI->TxWIShortGI = pTransmit->field.ShortGI;
	pTxWI->TxWISTBC = pTransmit->field.STBC;

#ifdef TXBF_SUPPORT
	if (pMac && pAd->chipCap.FlgHwTxBfCap)
	{
		if (pMac->TxSndgType == SNDG_TYPE_NDP  || pMac->TxSndgType == SNDG_TYPE_SOUNDING || pTxWI->eTxBF)
			pTxWI->TxWISTBC = 0;
	}
#endif /* TXBF_SUPPORT */
#endif /* DOT11_N_SUPPORT */
		
	pTxWI->TxWIWirelessCliID = WCID;
	pTxWI->TxWIMPDUByteCnt = Length;
#ifdef RLT_MAC
	pTxWI->TxWIPacketId = PID;
#endif /* RLT_MAC */
	
	/* If CCK or OFDM, BW must be 20*/
	pTxWI->TxWIBW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);
#ifdef DOT11_N_SUPPORT
#ifdef DOT11N_DRAFT3
	if (pTxWI->TxWIBW)
		pTxWI->TxWIBW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);
#endif /* DOT11N_DRAFT3 */
#endif /* DOT11_N_SUPPORT */
	
	pTxWI->TxWIMCS = pTransmit->field.MCS;
	pTxWI->TxWIPHYMODE = pTransmit->field.MODE;
	pTxWI->TxWICFACK = CfAck;

#ifdef DOT11_N_SUPPORT
	if (pMac)
	{
        if (pAd->CommonCfg.bMIMOPSEnable)
        {
    		if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7))
			{
				/* Dynamic MIMO Power Save Mode*/
				pTxWI->TxWIMIMOps = 1;
			}
			else if (pMac->MmpsMode == MMPS_STATIC)
			{
				/* Static MIMO Power Save Mode*/
				if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7)
				{
					pTxWI->TxWIMCS = 7;
					pTxWI->TxWIMIMOps = 0;
				}
			}
        }
		/*pTxWI->TxWIMIMOps = (pMac->PsMode == PWR_MMPS)? 1:0;*/
		{
			pTxWI->TxWIMpduDensity = pMac->MpduDensity;
		}
	}
#endif /* DOT11_N_SUPPORT */


#ifdef RLT_MAC
	pTxWI->TxWIPacketId = pTxWI->TxWIMCS;
#endif /* RLT_MAC */
	NdisMoveMemory(pOutTxWI, &TxWI, TXWISize);
//+++Add by shiang for debug
if (0){
	hex_dump("TxWI", (UCHAR *)pOutTxWI, TXWISize);
}
//---Add by shiang for debug
}
Ejemplo n.º 12
0
/*
========================================================================
Routine Description:
	Initialize chip related information.

Arguments:
	pCB				- WLAN control block pointer

Return Value:
	None

Note:
========================================================================
*/
VOID RtmpChipOpsHook(VOID *pCB)
{
	RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pCB;
	RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
	RTMP_CHIP_CAP *pChipCap = &pAd->chipCap;
	UINT32 MacValue;


	/* sanity check */
	WaitForAsicReady(pAd);
	RTMP_IO_READ32(pAd, MAC_CSR0, &MacValue);
	pAd->MACVersion = MacValue;	

	/* default init */
	RTMP_DRS_ALG_INIT(pAd, RATE_ALG_LEGACY);




#ifdef RT3290
	if (IS_RT3290(pAd))
	{
		RT3290_Init(pAd);
		goto done;
	}
#endif /* RT290 */

#ifdef RT8592
	if (IS_RT8592(pAd)) {
		RT85592_Init(pAd);
		goto done;
	}
#endif /* RT8592 */

#ifdef RT65xx
	if (IS_RT65XX(pAd)) {
		RT6590_Init(pAd);
		goto done;
	}
#endif /* RT65xx */

#ifdef MT7601
	if (IS_MT7601(pAd)) {
		MT7601_Init(pAd);
		goto done;
	}
#endif /* MT7601 */


	/* init default value whatever chipsets */
	/* default pChipOps content will be 0x00 */
	pChipCap->bbpRegTbSize = 0;
	pChipCap->MaxNumOfRfId = 31;
	pChipCap->MaxNumOfBbpId = 136;
	pChipCap->SnrFormula = SNR_FORMULA1;
	pChipCap->RfReg17WtMethod = RF_REG_WT_METHOD_NONE;
	pChipCap->TXWISize = 16;
	pChipCap->RXWISize = 16;
#if defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION)
	pChipCap->TxPowerTuningTable_2G = TxPowerTuningTableOrg;
#ifdef A_BAND_SUPPORT
	pChipCap->TxPowerTuningTable_5G = TxPowerTuningTableOrg;
#endif /* A_BAND_SUPPORT */
#endif /* defined(RTMP_INTERNAL_TX_ALC) || defined(RTMP_TEMPERATURE_COMPENSATION) */
	pChipOps->AsicMacInit = NULL;
	pChipOps->AsicBbpInit = NULL;
	pChipOps->AsicRfInit = NULL;

#ifdef RTMP_EFUSE_SUPPORT
	pChipCap->EFUSE_USAGE_MAP_START = 0x2d0;
	pChipCap->EFUSE_USAGE_MAP_END = 0x2fc;      
       	pChipCap->EFUSE_USAGE_MAP_SIZE = 45;
#endif /* RTMP_EFUSE_SUPPORT */

	pChipCap->VcoPeriod = 10;
	pChipCap->FlgIsVcoReCalMode = VCO_CAL_DISABLE;
	pChipCap->WPDMABurstSIZE = 2; /* default 64B */
	pChipCap->MBSSIDMode = MBSSID_MODE0; 


	RtmpChipBcnInit(pAd);

	pChipOps->RxSensitivityTuning = RxSensitivityTuning;
#ifdef CONFIG_STA_SUPPORT
	pChipOps->ChipAGCAdjust = ChipAGCAdjust;
#endif /* CONFIG_STA_SUPPORT */
	pChipOps->ChipBBPAdjust = ChipBBPAdjust;
	pChipOps->ChipSwitchChannel = Default_ChipSwitchChannel;

	/* TX ALC */
	pChipCap->bTempCompTxALC = FALSE;
	pChipOps->AsicGetTxPowerOffset = NULL;
	pChipOps->InitDesiredTSSITable = NULL;
	pChipOps->AsicTxAlcGetAutoAgcOffset = NULL;
	pChipOps->AsicExtraPowerOverMAC = NULL;

	pChipOps->ChipAGCInit = Default_ChipAGCInit;
	pChipOps->AsicAntennaDefaultReset = AsicAntennaDefaultReset;
	pChipOps->NetDevNickNameInit = NetDevNickNameInit;
	/* Init value. If pChipOps->AsicResetBbpAgent==NULL, "AsicResetBbpAgent" as default. If your chipset has specific routine, please re-hook it at self init function */
	pChipOps->AsicResetBbpAgent = NULL;

	pChipOps->InitTemperCompensation = NULL;
	pChipOps->TemperCompensation = NULL;

#ifdef RT28xx
	pChipOps->ChipSwitchChannel = RT28xx_ChipSwitchChannel;
#endif /* RT28xx */
#ifdef CARRIER_DETECTION_SUPPORT
	pChipCap->carrier_func = DISABLE_TONE_RADAR;
	pChipOps->ToneRadarProgram = NULL;
#endif /* CARRIER_DETECTOIN_SUPPORT */
#ifdef DFS_SUPPORT
	pChipCap->DfsEngineNum = 4;
#endif /* DFS_SUPPORT */
	pChipOps->CckMrcStatusCtrl = NULL;
	pChipOps->RadarGLRTCompensate = NULL;


	/* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */



#if defined(RT3883) || defined(RT3290) || defined(RT65xx) || defined(MT7601)
done:
#endif /* defined(RT3883) || defined(RT3290) || defined(RT65xx) || define(MT7601) */
	DBGPRINT(RT_DEBUG_TRACE, ("Chip specific bbpRegTbSize=%d!\n", pChipCap->bbpRegTbSize));
	DBGPRINT(RT_DEBUG_TRACE, ("Chip VCO calibration mode = %d!\n", pChipCap->FlgIsVcoReCalMode));
}
Ejemplo n.º 13
0
/*
	========================================================================

	Routine Description: Read RF register through MAC

	Arguments:

	Return Value:

	IRQL =

	Note:

	========================================================================
*/
NDIS_STATUS rlt_rf_read(
    IN RTMP_ADAPTER *pAd,
    IN UCHAR bank,
    IN UCHAR regID,
    IN UCHAR *pValue)
{
    RF_CSR_CFG_STRUC rfcsr = { { 0 } };
    UINT i=0, k=0;
    BOOLEAN rf_status;
    NDIS_STATUS	 ret = STATUS_UNSUCCESSFUL;


#ifdef RTMP_MAC_PCI
    if ((pAd->bPCIclkOff == TRUE) || (pAd->LastMCUCmd == SLEEP_MCU_CMD))
    {
        DBGPRINT_ERR(("RT30xxReadRFRegister. Not allow to read RF 0x%x : fail\n",  regID));
        return STATUS_UNSUCCESSFUL;
    }
#endif /* RTMP_MAC_PCI */


    ASSERT((regID <= pAd->chipCap.MaxNumOfRfId));

    rfcsr.word = 0;

    for (i=0; i<MAX_BUSY_COUNT; i++)
    {
        if(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST))
            goto done;

        rf_status = rf_csr_poll_idle(pAd, &rfcsr.word);
        if ( rf_status == BUSY)
            break;

        rfcsr.word = 0;
#ifdef RT65xx
        if (IS_RT65XX(pAd)) {
            rfcsr.bank_65xx.RF_CSR_WR = 0;
            rfcsr.bank_65xx.RF_CSR_KICK = 1;
            rfcsr.bank_65xx.RF_CSR_REG_ID = regID;
            rfcsr.bank_65xx.RF_CSR_REG_BANK = bank;
        }
        else
#endif /* RT65xx */
        {
            DBGPRINT_ERR(("RF[%d] read function for non-supported chip[0x%x]\n", regID, pAd->MACVersion));
            break;
        }

        RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);

        rf_status = rf_csr_poll_idle(pAd, &rfcsr.word);
        if (rf_status == IDLE)
        {
#ifdef RT65xx
            if (IS_RT65XX(pAd) && (rfcsr.bank_65xx.RF_CSR_REG_ID == regID) &&
                    (rfcsr.bank_65xx.RF_CSR_REG_BANK == bank))
            {
                *pValue = (UCHAR)(rfcsr.bank_65xx.RF_CSR_DATA);
                break;
            }
#endif /* RT65xx */
        }
    }

    if (rf_status == BUSY)
    {
        DBGPRINT_ERR(("RF read R%d=0x%X fail, i[%d], k[%d]\n", regID, rfcsr.word,i,k));
        goto done;
    }
    ret = STATUS_SUCCESS;

done:

    return ret;
}