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

📄 rt_main_dev.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 4 页
字号:
	//	IntSource.word = 0x00000000L;//	McuIntSource.word = 0x00000000L;	//	// Get the interrupt sources & saved to local variable	//	//RTMP_IO_READ32(pAd, where, &McuIntSource.word);	//RTMP_IO_WRITE32(pAd, , McuIntSource.word);	//	// Flag fOP_STATUS_DOZE On, means ASIC put to sleep, elase means ASICK WakeUp	// And at the same time, clock maybe turned off that say there is no DMA service.	// when ASIC get to sleep. 	// To prevent system hang on power saving.	// We need to check it before handle the INT_SOURCE_CSR, ASIC must be wake up.	//	// RT2661 => when ASIC is sleeping, MAC register cannot be read and written.	// RT2860 => when ASIC is sleeping, MAC register can be read and written.//	if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))	{		RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);		RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear	}//	else//		DBGPRINT(RT_DEBUG_TRACE, (">>>fOP_STATUS_DOZE<<<\n"));//	RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IsrAfterClear);//	RTMP_IO_READ32(pAd, MCU_INT_SOURCE_CSR, &McuIsrAfterClear);//	DBGPRINT(RT_DEBUG_INFO, ("====> RTMPHandleInterrupt(ISR=%08x,Mcu ISR=%08x, After clear ISR=%08x, MCU ISR=%08x)\n",//			IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear));	//	// Handle interrupt, walk through all bits	// Should start from highest priority interrupt	// The priority can be adjust by altering processing if statement	//#ifdef DBG	if ((RTDebugLevel == RT_DEBUG_LOUD) && (((++print_int_count) % 100) == 0))	{		ULONG reg;		int Count, free;		RTMP_IO_READ32(pAd, INT_MASK_CSR, &reg);     // 1:enable		printk("%d: INT_MASK_CSR = %08lx, IntSource %08x\n", print_int_count, reg, IntSource.word);		RTMP_IO_READ32(pAd, TX_CTX_IDX0 + 0 * 0x10 , &reg);		printk("TX_CTX_IDX0 = %08lx\n", reg);		RTMP_IO_READ32(pAd, TX_DTX_IDX0 + 0 * 0x10 , &reg);		printk("TX_DTX_IDX0 = %08lx\n", reg);		RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &reg);		printk("WPDMA_GLO_CFG = %08lx\n", reg);		for (Count = 0; Count < 1; Count++)		{			if (pAd->TxRing[Count].TxSwFreeIdx> pAd->TxRing[Count].TxCpuIdx)				free = pAd->TxRing[Count].TxSwFreeIdx - pAd->TxRing[Count].TxCpuIdx -1;			else				free = pAd->TxRing[Count].TxSwFreeIdx + TX_RING_SIZE - pAd->TxRing[Count].TxCpuIdx -1;					printk("%d: Free = %d TxSwFreeIdx = %ld\n", Count, free, pAd->TxRing[Count].TxSwFreeIdx); 		}		printk("pAd->int_disable_mask = %08x\n", pAd->int_disable_mask);		printk("pAd->int_enable_reg = %08x\n", pAd->int_enable_reg);		printk("pAd->int_pending = %08x\n", pAd->int_pending);		RTMP_IO_READ32(pAd, RX_DRX_IDX , &reg);		printk("pAd->RxRing.RxSwReadIdx = %08lx, RX_DRX_IDX = %08lx\n", pAd->RxRing.RxSwReadIdx, reg);//		NetJobAdd(APRxDoneIntProcess, pAd, 0, 0);	}#endif			// If required spinlock, each interrupt service routine has to acquire	// and release itself.	//		if (IntSource.word & TxCoherent)	{		DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n"));		RTMPHandleRxCoherentInterrupt(pAd);	}	if (IntSource.word & RxCoherent)	{		DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n"));		RTMPHandleRxCoherentInterrupt(pAd);	}	if (IntSource.word & FifoStaFullInt) 	{#if 1		if ((pAd->int_disable_mask & FifoStaFullInt) == 0) 		{			/* mask FifoStaFullInt */			rt2860_int_disable(pAd, FifoStaFullInt);			tasklet_hi_schedule(&pObj->fifo_statistic_full_task);		}		pAd->int_pending |= FifoStaFullInt; #else		NICUpdateFifoStaCounters(pAd);		#endif	}	if (IntSource.word & INT_MGMT_DLY) 	{		if ((pAd->int_disable_mask & INT_MGMT_DLY) ==0 )		{			rt2860_int_disable(pAd, INT_MGMT_DLY);			tasklet_hi_schedule(&pObj->mgmt_dma_done_task);					}		//RTMPHandleMgmtRingDmaDoneInterrupt(pAd);		pAd->int_pending |= INT_MGMT_DLY ;	}	if (IntSource.word & INT_RX)	{		if ((pAd->int_disable_mask & INT_RX) == 0) 		{			/* mask RxINT */			rt2860_int_disable(pAd, INT_RX);			tasklet_hi_schedule(&pObj->rx_done_task);		}		pAd->int_pending |= INT_RX; 			}	if (IntSource.word & INT_HCCA_DLY)	{		if ((pAd->int_disable_mask & INT_HCCA_DLY) == 0) 		{			/* mask TxDataInt */			rt2860_int_disable(pAd, INT_HCCA_DLY);			tasklet_hi_schedule(&pObj->hcca_dma_done_task);		}		pAd->int_pending |= INT_HCCA_DLY;							}	if (IntSource.word & INT_AC3_DLY)	{		if ((pAd->int_disable_mask & INT_AC3_DLY) == 0) 		{			/* mask TxDataInt */			rt2860_int_disable(pAd, INT_AC3_DLY);			tasklet_hi_schedule(&pObj->ac3_dma_done_task);		}		pAd->int_pending |= INT_AC3_DLY;							}	if (IntSource.word & INT_AC2_DLY)	{		if ((pAd->int_disable_mask & INT_AC2_DLY) == 0) 		{			/* mask TxDataInt */			rt2860_int_disable(pAd, INT_AC2_DLY);			tasklet_hi_schedule(&pObj->ac2_dma_done_task);		}		pAd->int_pending |= INT_AC2_DLY;							}	if (IntSource.word & INT_AC1_DLY)	{		pAd->int_pending |= INT_AC1_DLY;								if ((pAd->int_disable_mask & INT_AC1_DLY) == 0) 		{			/* mask TxDataInt */			rt2860_int_disable(pAd, INT_AC1_DLY);			tasklet_hi_schedule(&pObj->ac1_dma_done_task);		}			}	if (IntSource.word & INT_AC0_DLY)	{/*		if (IntSource.word & 0x2) {			u32 reg;			RTMP_IO_READ32(pAd, DELAY_INT_CFG, &reg);			printk("IntSource.word = %08x, DELAY_REG = %08x\n", IntSource.word, reg);		}*/		pAd->int_pending |= INT_AC0_DLY;		if ((pAd->int_disable_mask & INT_AC0_DLY) == 0) 		{			/* mask TxDataInt */			rt2860_int_disable(pAd, INT_AC0_DLY);			tasklet_hi_schedule(&pObj->ac0_dma_done_task);		}									}    if (IntSource.word & PreTBTTInt)	{		RTMPHandlePreTBTTInterrupt(pAd);	}	if (IntSource.word & TBTTInt)	{		RTMPHandleTBTTInterrupt(pAd);	}#ifdef CONFIG_STA_SUPPORT    if (IntSource.word & AutoWakeupInt)		RTMPHandleTwakeupInterrupt(pAd);#endif // CONFIG_STA_SUPPORT //	// Do nothing if Reset in progress	if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS) ||		RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))	{#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)        return  IRQ_HANDLED;#else        return;#endif	}#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)    return  IRQ_HANDLED;#endif	}/*========================================================================Routine Description:    Send a packet to WLAN.Arguments:    skb_p           points to our adapter    dev_p           which WLAN network interfaceReturn Value:    0: transmit successfully    otherwise: transmit failNote:========================================================================*/static INT rt2860_send_packets(	IN struct sk_buff 		*skb_p, 	IN struct net_device 	*net_dev){	RTMP_SET_PACKET_NET_DEVICE_MBSSID(skb_p, MAIN_MBSSID);	/* transmit the packet */	return rt2860_packet_xmit(skb_p);} /* End of MBSS_VirtualIF_PacketSend */#ifdef CONFIG_STA_SUPPORT#if WIRELESS_EXT >= 12// This function will be called when query /procstruct iw_statistics *rt2860_get_wireless_stats(    IN struct net_device *net_dev){	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv;		DBGPRINT(RT_DEBUG_TRACE, ("rt2860_get_wireless_stats --->\n"));		// TODO: All elements are zero before be implemented	pAd->iw_stats.status = 0;   // Status - device dependent for now	pAd->iw_stats.qual.qual = pAd->Mlme.ChannelQuality; // link quality (%retries, SNR, %missed beacons or better...)	// signal level (dBm)	pAd->iw_stats.qual.level = pAd->StaCfg.RssiSample.LastRssi0 - (CHAR)pAd->BbpRssiToDbmDelta;	pAd->iw_stats.qual.noise = pAd->BbpWriteLatch[66]; // noise level (dBm)		pAd->iw_stats.qual.noise += 256 - 143;	pAd->iw_stats.qual.updated = 1;     // Flags to know if updated	pAd->iw_stats.discard.nwid = 0;     // Rx : Wrong nwid/essid	pAd->iw_stats.miss.beacon = 0;      // Missed beacons/superframe		// pAd->iw_stats.discard.code, discard.fragment, discard.retries, discard.misc has counted in other place    DBGPRINT(RT_DEBUG_TRACE, ("<--- rt2860_get_wireless_stats\n"));	return &pAd->iw_stats;}#endif#endif // CONFIG_STA_SUPPORT ///*    ========================================================================    Routine Description:        return ethernet statistics counter    Arguments:        net_dev                     Pointer to net_device    Return Value:        net_device_stats*    Note:    ========================================================================*/struct net_device_stats *rt2860_get_ether_stats(    IN  struct net_device *net_dev){	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv;        DBGPRINT(RT_DEBUG_INFO, ("rt2860_get_ether_stats --->\n"));    pAd->stats.rx_packets = pAd->WlanCounters.ReceivedFragmentCount.u.LowPart;        // total packets received    pAd->stats.tx_packets = pAd->WlanCounters.TransmittedFragmentCount.u.LowPart;     // total packets transmitted    pAd->stats.rx_bytes = pAd->RalinkCounters.ReceivedByteCount;             // total bytes received    pAd->stats.tx_bytes = pAd->RalinkCounters.TransmittedByteCount;         // total bytes transmitted    pAd->stats.rx_errors = pAd->Counters8023.RxErrors;                          // bad packets received    pAd->stats.tx_errors = pAd->Counters8023.TxErrors;                          // packet transmit problems    pAd->stats.rx_dropped = pAd->Counters8023.RxNoBuffer;                       // no space in linux buffers    pAd->stats.tx_dropped = pAd->WlanCounters.FailedCount.u.LowPart;                  // no space available in linux    pAd->stats.multicast = pAd->WlanCounters.MulticastReceivedFrameCount.u.LowPart;   // multicast packets received    pAd->stats.collisions = pAd->Counters8023.OneCollision + pAd->Counters8023.MoreCollisions;  // Collision packets    pAd->stats.rx_length_errors = 0;    pAd->stats.rx_over_errors = pAd->Counters8023.RxNoBuffer;                   // receiver ring buff overflow    pAd->stats.rx_crc_errors = 0;//pAd->WlanCounters.FCSErrorCount;     // recved pkt with crc error    pAd->stats.rx_frame_errors = pAd->Counters8023.RcvAlignmentErrors;          // recv'd frame alignment error    pAd->stats.rx_fifo_errors = pAd->Counters8023.RxNoBuffer;                   // recv'r fifo overrun    pAd->stats.rx_missed_errors = 0;                                            // receiver missed packet    // detailed tx_errors    pAd->stats.tx_aborted_errors = 0;    pAd->stats.tx_carrier_errors = 0;    pAd->stats.tx_fifo_errors = 0;    pAd->stats.tx_heartbeat_errors = 0;    pAd->stats.tx_window_errors = 0;    // for cslip etc    pAd->stats.rx_compressed = 0;    pAd->stats.tx_compressed = 0;    return &pAd->stats;}/*    ========================================================================    Routine Description:        Set to filter multicast list    Arguments:        net_dev                     Pointer to net_device    Return Value:        VOID    Note:    ========================================================================*/static VOID rt2860_set_rx_mode(    IN  struct net_device *net_dev){	INT i;	VIRTUAL_ADAPTER *pVirtualAd;	RTMP_ADAPTER *pAd = net_dev->priv;	UCHAR mfilterAddr[MAC_ADDR_LEN];	// determine this ioctl command is comming from which interface.	if (net_dev->priv_flags == INT_MAIN)	{		pAd= net_dev->priv;	}	else if ((net_dev->priv_flags == INT_MBSSID)			|| (net_dev->priv_flags == INT_APCLI))	{		pVirtualAd = net_dev->priv;		pAd = pVirtualAd->RtmpDev->priv;	}	/* Note: do not reorder, GCC is clever about common statements. */	if ((net_dev->flags & IFF_PROMISC)		|| (net_dev->flags & IFF_ALLMULTI))	{		/* Unconditionally log net taps. */		DBGPRINT (RT_DEBUG_INFO, ("%s: Promiscuous or Accept-All_Multicase mode enabled.\n", net_dev->name));	} else if (net_dev->flags & IFF_UP)	{		struct dev_mc_list *mclist;		for (i = 0, mclist = net_dev->mc_list; mclist && i < net_dev->mc_count;			i++, mclist = mclist->next)		{			COPY_MAC_ADDR(mfilterAddr, mclist->dmi_addr);			DBGPRINT(RT_DEBUG_INFO, ("%s (%2x:%2x:%2x:%2x:%2x:%2x)\n",				net_dev->name, mfilterAddr[0], mfilterAddr[1], mfilterAddr[2],				mfilterAddr[3], mfilterAddr[4], mfilterAddr[5]));		}	}	return;}

⌨️ 快捷键说明

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