📄 rt_main_dev.c
字号:
// 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, ®); // 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 , ®); printk("TX_CTX_IDX0 = %08lx\n", reg); RTMP_IO_READ32(pAd, TX_DTX_IDX0 + 0 * 0x10 , ®); printk("TX_DTX_IDX0 = %08lx\n", reg); RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, ®); 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 , ®); 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, ®); 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 + -