📄 rt_main_dev.c
字号:
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, ®); // 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 + -