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

📄 rt_main_dev.c

📁 Linux下的RT系列无线网卡驱动,可以直接在x86平台上编译
💻 C
📖 第 1 页 / 共 4 页
字号:
		return -1;	} 	pObj = (POS_COOKIE)pAd->OS_Cookie;	// reset Adapter flags	RTMP_CLEAR_FLAGS(pAd);#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)    if (!try_module_get(THIS_MODULE))    {        DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot reserve module\n", __FUNCTION__));        return -1;    }#else    MOD_INC_USE_COUNT;#endif	/* register the interrupt routine with the os */#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)    if ((retval = request_irq(pObj->pci_dev->irq, rt2860_interrupt, IRQF_SHARED, net_dev->name ,net_dev))) #else	if ((retval = request_irq(pObj->pci_dev->irq,rt2860_interrupt, SA_SHIRQ, net_dev->name ,net_dev))) #endif	{		printk("RT2860: request_irq  ERROR(%d)\n", retval);		return retval;	}	// Init BssTab & ChannelInfo tabbles for auto channel select.	if (rt2860_init(net_dev) == FALSE)		goto err;	#ifdef CONFIG_STA_SUPPORT    NdisZeroMemory(pAd->StaCfg.dev_name, 16);    NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name, strlen(net_dev->name));#endif // CONFIG_STA_SUPPORT //		// Set up the Mac address	NdisMoveMemory(net_dev->dev_addr, (void *) pAd->CurrentAddress, 6);	//pAd->bStaFifoTest = TRUE;	pAd->int_enable_reg = ((DELAYINTMASK)  | (RxINT|TxDataInt|TxMgmtInt)) & ~(0x03);	pAd->int_disable_mask = 0;	pAd->int_pending = 0;	    // Start net interface tx /rx#ifdef CONFIG_STA_SUPPORT#ifdef WPA_SUPPLICANT_SUPPORT#ifndef NATIVE_WPA_SUPPLICANT_SUPPORT    {        union iwreq_data    wrqu;        // send wireless event to wpa_supplicant for infroming interface down.        memset(&wrqu, 0, sizeof(wrqu));        wrqu.data.flags = RT_INTERFACE_UP;        wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, NULL);    } #endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#endif // WPA_SUPPLICANT_SUPPORT //#endif // CONFIG_STA_SUPPORT //#if 1		//		// Enable Interrupt		//		RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff);  // clear garbage interrupts		NICEnableInterrupt(pAd);		// Now Enable RxTx		//		RTMPEnableRxTx(pAd);		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP);#endif {	ULONG reg;	RTMP_IO_READ32(pAd, 0x1300, &reg);  // clear garbage interrupts	printk("0x1300 = %08lx\n", reg);}    netif_start_queue(net_dev);    netif_carrier_on(net_dev);    netif_wake_queue(net_dev);	return (retval);err:#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)    module_put(THIS_MODULE);#else    MOD_DEC_USE_COUNT;#endif	return (-1);}static void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode){	u32 regValue;	pAd->int_disable_mask &= ~(mode);	regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask);			//if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))	{		RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue);     // 1:enable	}	//else	//	DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_DOZE !\n"));	if (regValue != 0)		RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);}static void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode){	u32 regValue;	pAd->int_disable_mask |= mode;	regValue = 	pAd->int_enable_reg & ~(pAd->int_disable_mask);	RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue);     // 0: disable 		if (regValue == 0)	{		RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);			}}static void mgmt_dma_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;    INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;	    pObj = (POS_COOKIE) pAd->OS_Cookie;//	printk("mgmt_dma_done_process\n");	IntSource.word = 0;	IntSource.field.MgmtDmaDone = 1;	pAd->int_pending &= ~INT_MGMT_DLY;		RTMPHandleMgmtRingDmaDoneInterrupt(pAd);	RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid lose of interrupts	 */	if (pAd->int_pending & INT_MGMT_DLY) 	{		tasklet_hi_schedule(&pObj->mgmt_dma_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable TxDataInt again */	rt2860_int_enable(pAd, INT_MGMT_DLY);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    }static void rx_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;	BOOLEAN	bReschedule = 0;	POS_COOKIE pObj;	    pObj = (POS_COOKIE) pAd->OS_Cookie;		pAd->int_pending &= ~(INT_RX);#ifdef CONFIG_STA_SUPPORT//	else		bReschedule = STARxDoneInterruptHandle(pAd);#endif // CONFIG_STA_SUPPORT //	RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid rotting packet 	 */	if (pAd->int_pending & INT_RX || bReschedule) 	{		tasklet_hi_schedule(&pObj->rx_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable RxINT again */	rt2860_int_enable(pAd, INT_RX);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);}void fifo_statistic_full_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;	POS_COOKIE pObj;	    pObj = (POS_COOKIE) pAd->OS_Cookie;	pAd->int_pending &= ~(FifoStaFullInt); 	NICUpdateFifoStaCounters(pAd);		RTMP_IRQ_LOCK(&pAd->irq_lock, flags);  	/*	 * double check to avoid rotting packet 	 */	if (pAd->int_pending & FifoStaFullInt) 	{		tasklet_hi_schedule(&pObj->fifo_statistic_full_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable RxINT again */	rt2860_int_enable(pAd, FifoStaFullInt);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);}static void hcca_dma_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;    INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;	    pObj = (POS_COOKIE) pAd->OS_Cookie;	IntSource.word = 0;	IntSource.field.HccaDmaDone = 1;	pAd->int_pending &= ~INT_HCCA_DLY;	RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);	RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid lose of interrupts	 */	if (pAd->int_pending & INT_HCCA_DLY)	{		tasklet_hi_schedule(&pObj->hcca_dma_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable TxDataInt again */	rt2860_int_enable(pAd, INT_HCCA_DLY);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    }static void ac3_dma_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;    INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;	BOOLEAN bReschedule = 0;	    pObj = (POS_COOKIE) pAd->OS_Cookie;//	printk("ac0_dma_done_process\n");	IntSource.word = 0;	IntSource.field.Ac3DmaDone = 1;	pAd->int_pending &= ~INT_AC3_DLY;	bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);	RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid lose of interrupts	 */	if ((pAd->int_pending & INT_AC3_DLY) || bReschedule)	{		tasklet_hi_schedule(&pObj->ac3_dma_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable TxDataInt again */	rt2860_int_enable(pAd, INT_AC3_DLY);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    }static void ac2_dma_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;    INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;	BOOLEAN bReschedule = 0;	    pObj = (POS_COOKIE) pAd->OS_Cookie;	IntSource.word = 0;	IntSource.field.Ac2DmaDone = 1;	pAd->int_pending &= ~INT_AC2_DLY;	bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);	RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid lose of interrupts	 */	if ((pAd->int_pending & INT_AC2_DLY) || bReschedule) 	{		tasklet_hi_schedule(&pObj->ac2_dma_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable TxDataInt again */	rt2860_int_enable(pAd, INT_AC2_DLY);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    }static void ac1_dma_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;    INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;	BOOLEAN bReschedule = 0;	    pObj = (POS_COOKIE) pAd->OS_Cookie;//	printk("ac0_dma_done_process\n");	IntSource.word = 0;	IntSource.field.Ac1DmaDone = 1;	pAd->int_pending &= ~INT_AC1_DLY;	bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);	RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid lose of interrupts	 */	if ((pAd->int_pending & INT_AC1_DLY) || bReschedule) 	{		tasklet_hi_schedule(&pObj->ac1_dma_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable TxDataInt again */	rt2860_int_enable(pAd, INT_AC1_DLY);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    }static void ac0_dma_done_tasklet(unsigned long data){	unsigned long flags;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;    INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;	BOOLEAN bReschedule = 0;	    pObj = (POS_COOKIE) pAd->OS_Cookie;//	printk("ac0_dma_done_process\n");	IntSource.word = 0;	IntSource.field.Ac0DmaDone = 1;	pAd->int_pending &= ~INT_AC0_DLY;//	RTMPHandleMgmtRingDmaDoneInterrupt(pAd);	bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);		RTMP_IRQ_LOCK(&pAd->irq_lock, flags);	/*	 * double check to avoid lose of interrupts	 */	if ((pAd->int_pending & INT_AC0_DLY) || bReschedule)	{		tasklet_hi_schedule(&pObj->ac0_dma_done_task);		RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    		return;	}	/* enable TxDataInt again */	rt2860_int_enable(pAd, INT_AC0_DLY);	RTMP_IRQ_UNLOCK(&pAd->irq_lock, flags);    }int print_int_count;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)   irqreturn_t#elsevoid #endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)rt2860_interrupt(int irq, void *dev_instance)#elsert2860_interrupt(int irq, void *dev_instance, struct pt_regs *regs)#endif{	struct net_device *net_dev = (struct net_device *) dev_instance;	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) net_dev->priv;	INT_SOURCE_CSR_STRUC	IntSource;	POS_COOKIE pObj;		pObj = (POS_COOKIE) pAd->OS_Cookie;	//	// Inital the Interrupt source.

⌨️ 快捷键说明

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