rt_main_dev.c
来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 1,801 行 · 第 1/4 页
C
1,801 行
#ifdef DOT11_N_SUPPORT // Allocate BA Reordering memory ba_reordering_resource_init(pAd, MAX_REORDERING_MPDU_NUM);#endif // DOT11_N_SUPPORT // // Make sure MAC gets ready. index = 0; do { RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0); pAd->MACVersion = MacCsr0; if ((pAd->MACVersion != 0x00) && (pAd->MACVersion != 0xFFFFFFFF)) break; RTMPusecDelay(10); } while (index++ < 100); DBGPRINT(RT_DEBUG_TRACE, ("MAC_CSR0 [ Ver:Rev=0x%08x]\n", pAd->MACVersion));/*Iverson patch PCIE L1 issue */ // Disable DMA RT28XXDMADisable(pAd); // Load 8051 firmware Status = NICLoadFirmware(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("NICLoadFirmware failed, Status[=0x%08x]\n", Status)); goto err1; } NICLoadRateSwitchingParams(pAd); // Disable interrupts here which is as soon as possible // This statement should never be true. We might consider to remove it later Status = RTMPAllocTxRxRingMemory(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("RTMPAllocDMAMemory failed, Status[=0x%08x]\n", Status)); goto err1; } RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); // initialize MLME // Status = MlmeInit(pAd); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("MlmeInit failed, Status[=0x%08x]\n", Status)); goto err2; } // Initialize pAd->StaCfg, pAd->ApCfg, pAd->CommonCfg to manufacture default // UserCfgInit(pAd);#ifdef RT2870 // We need init timerQ related structure before create the timer thread. RT2870_TimerQ_Init(pAd);#endif // RT2870 // RT28XX_TASK_THREAD_INIT(pAd, Status); if (Status != NDIS_STATUS_SUCCESS) goto err1;// COPY_MAC_ADDR(pAd->ApCfg.MBSSID[apidx].Bssid, netif->hwaddr);// pAd->bForcePrintTX = TRUE; CfgInitHook(pAd);#ifdef BLOCK_NET_IF initblockQueueTab(pAd);#endif // BLOCK_NET_IF //#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) NdisAllocateSpinLock(&pAd->MacTabLock);#endif // CONFIG_STA_SUPPORT // MeasureReqTabInit(pAd); TpcReqTabInit(pAd); // // Init the hardware, we need to init asic before read registry, otherwise mac register will be reset // Status = NICInitializeAdapter(pAd, TRUE); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("NICInitializeAdapter failed, Status[=0x%08x]\n", Status)); if (Status != NDIS_STATUS_SUCCESS) goto err3; } // Read parameters from Config File Status = RTMPReadParametersHook(pAd); printk("1. Phy Mode = %d\n", pAd->CommonCfg.PhyMode); if (Status != NDIS_STATUS_SUCCESS) { DBGPRINT_ERR(("NICReadRegParameters failed, Status[=0x%08x]\n",Status)); goto err4; }#ifdef RT2870 pAd->CommonCfg.bMultipleIRP = FALSE; if (pAd->CommonCfg.bMultipleIRP) pAd->CommonCfg.NumOfBulkInIRP = RX_RING_SIZE; else pAd->CommonCfg.NumOfBulkInIRP = 1;#endif // RT2870 // //Init Ba Capability parameters.// RT28XX_BA_INIT(pAd);#ifdef DOT11_N_SUPPORT pAd->CommonCfg.DesiredHtPhy.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity; pAd->CommonCfg.DesiredHtPhy.AmsduEnable = (USHORT)pAd->CommonCfg.BACapability.field.AmsduEnable; pAd->CommonCfg.DesiredHtPhy.AmsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; pAd->CommonCfg.DesiredHtPhy.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; // UPdata to HT IE pAd->CommonCfg.HtCapability.HtCapInfo.MimoPs = (USHORT)pAd->CommonCfg.BACapability.field.MMPSmode; pAd->CommonCfg.HtCapability.HtCapInfo.AMsduSize = (USHORT)pAd->CommonCfg.BACapability.field.AmsduSize; pAd->CommonCfg.HtCapability.HtCapParm.MpduDensity = (UCHAR)pAd->CommonCfg.BACapability.field.MpduDensity;#endif // DOT11_N_SUPPORT // // after reading Registry, we now know if in AP mode or STA mode // Load 8051 firmware; crash when FW image not existent // Status = NICLoadFirmware(pAd); // if (Status != NDIS_STATUS_SUCCESS) // break; printk("2. Phy Mode = %d\n", pAd->CommonCfg.PhyMode); // We should read EEPROM for all cases. rt2860b NICReadEEPROMParameters(pAd, mac); #ifdef CONFIG_STA_SUPPORT#endif // CONFIG_STA_SUPPORT // printk("3. Phy Mode = %d\n", pAd->CommonCfg.PhyMode); NICInitAsicFromEEPROM(pAd); //rt2860b // Set PHY to appropriate mode TmpPhy = pAd->CommonCfg.PhyMode; pAd->CommonCfg.PhyMode = 0xff; RTMPSetPhyMode(pAd, TmpPhy);#ifdef DOT11_N_SUPPORT SetCommonHT(pAd);#endif // DOT11_N_SUPPORT // // No valid channels. if (pAd->ChannelListNum == 0) { printk("Wrong configuration. No valid channel found. Check \"ContryCode\" and \"ChannelGeography\" setting.\n"); goto err4; }#ifdef DOT11_N_SUPPORT printk("MCS Set = %02x %02x %02x %02x %02x\n", pAd->CommonCfg.HtCapability.MCSSet[0], pAd->CommonCfg.HtCapability.MCSSet[1], pAd->CommonCfg.HtCapability.MCSSet[2], pAd->CommonCfg.HtCapability.MCSSet[3], pAd->CommonCfg.HtCapability.MCSSet[4]);#endif // DOT11_N_SUPPORT //#ifdef RT30xx //Init RT30xx RFRegisters after read RFIC type from EEPROM NICInitRT30xxRFRegisters(pAd);#endif // RT30xx //// APInitialize(pAd);#ifdef IKANOS_VX_1X0 VR_IKANOS_FP_Init(pAd->ApCfg.BssidNum, pAd->PermanentAddress);#endif // IKANOS_VX_1X0 // // // Initialize RF register to default value // AsicSwitchChannel(pAd, pAd->CommonCfg.Channel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); if (pAd && (Status != NDIS_STATUS_SUCCESS)) { // // Undo everything if it failed // if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) {// NdisMDeregisterInterrupt(&pAd->Interrupt); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE); }// RTMPFreeAdapter(pAd); // we will free it in disconnect() } else if (pAd) { // Microsoft HCT require driver send a disconnect event after driver initialization. OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);// pAd->IndicateMediaState = NdisMediaStateDisconnected; RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_MEDIA_STATE_CHANGE); DBGPRINT(RT_DEBUG_TRACE, ("NDIS_STATUS_MEDIA_DISCONNECT Event B!\n"));#ifdef RT2870 RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS); // // Support multiple BulkIn IRP, // the value on pAd->CommonCfg.NumOfBulkInIRP may be large than 1. // for(index=0; index<pAd->CommonCfg.NumOfBulkInIRP; index++) { RTUSBBulkReceive(pAd); DBGPRINT(RT_DEBUG_TRACE, ("RTUSBBulkReceive!\n" )); }#endif // RT2870 // }// end of else DBGPRINT_S(Status, ("<==== RTMPInitialize, Status=%x\n", Status)); return TRUE;err4:err3: MlmeHalt(pAd);err2: RTMPFreeTxRxRingMemory(pAd);// RTMPFreeAdapter(pAd);err1:#ifdef DOT11_N_SUPPORT os_free_mem(pAd, pAd->mpdu_blk_pool.mem); // free BA pool#endif // DOT11_N_SUPPORT // RT28XX_IRQ_RELEASE(net_dev); // shall not set priv to NULL here because the priv didn't been free yet. //net_dev->priv = 0;#ifdef INF_AMAZON_SEerr0:#endif // INF_AMAZON_SE // printk("!!! %s Initialized fail !!!\n", RT28xx_CHIP_NAME); return FALSE;} /* End of rt28xx_init *//*========================================================================Routine Description: Open raxx interface.Arguments: *net_dev the raxx interface pointerReturn Value: 0 Open OK otherwise Open FailNote:========================================================================*/int rt28xx_open(IN PNET_DEV dev){ struct net_device * net_dev = (struct net_device *)dev; PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)net_dev->priv; int retval = 0; POS_COOKIE pObj; // Sanity check for pAd if (pAd == NULL) { /* if 1st open fail, pAd will be free; So the net_dev->priv will be NULL in 2rd open */ return -1; }#ifdef CONFIG_APSTA_MIXED_SUPPORT if (pAd->OpMode == OPMODE_AP) { CW_MAX_IN_BITS = 6; } else if (pAd->OpMode == OPMODE_STA) { CW_MAX_IN_BITS = 10; }#if WIRELESS_EXT >= 12 if (net_dev->priv_flags == INT_MAIN) { if (pAd->OpMode == OPMODE_AP) net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_ap_iw_handler_def; else if (pAd->OpMode == OPMODE_STA) net_dev->wireless_handlers = (struct iw_handler_def *) &rt28xx_iw_handler_def; }#endif // WIRELESS_EXT >= 12 //#endif // CONFIG_APSTA_MIXED_SUPPORT //#ifdef CONFIG_STA_SUPPORT#endif // CONFIG_STA_SUPPORT // // Init pObj = (POS_COOKIE)pAd->OS_Cookie; // reset Adapter flags RTMP_CLEAR_FLAGS(pAd); // Request interrupt service routine for PCI device // register the interrupt routine with the os RT28XX_IRQ_REQUEST(net_dev); // Init BssTab & ChannelInfo tabbles for auto channel select. // Chip & other init if (rt28xx_init(net_dev) == FALSE) goto err;#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { 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); // Init IRQ parameters RT28XX_IRQ_INIT(pAd); // Various AP function init#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) {#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 // // Enable Interrupt RT28XX_IRQ_ENABLE(pAd); // Now Enable RxTx RTMPEnableRxTx(pAd); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_START_UP); { UINT32 reg = 0; RTMP_IO_READ32(pAd, 0x1300, ®); // clear garbage interrupts printk("0x1300 = %08x\n", reg); } {// u32 reg;// u8 byte;// u16 tmp;// RTMP_IO_READ32(pAd, XIFS_TIME_CFG, ®);// tmp = 0x0805;// reg = (reg & 0xffff0000) | tmp;// RTMP_IO_WRITE32(pAd, XIFS_TIME_CFG, reg); }#ifdef CONFIG_STA_SUPPORT#endif // CONFIG_STA_SUPPORT // return (retval);err: return (-1);} /* End of rt28xx_open *//* Must not be called for mdev and apdev */static NDIS_STATUS rt_ieee80211_if_setup(struct net_device *dev, PRTMP_ADAPTER pAd){ NDIS_STATUS Status; INT i=0; CHAR slot_name[IFNAMSIZ]; struct net_device *device; //ether_setup(dev); dev->hard_start_xmit = rt28xx_send_packets;#ifdef IKANOS_VX_1X0 dev->hard_start_xmit = IKANOS_DataFramesTx;#endif // IKANOS_VX_1X0 //// dev->set_multicast_list = ieee80211_set_multicast_list;// dev->change_mtu = ieee80211_change_mtu;#ifdef CONFIG_STA_SUPPORT#if WIRELESS_EXT >= 12 if (pAd->OpMode == OPMODE_STA) { dev->wireless_handlers = &rt28xx_iw_handler_def; }#endif //WIRELESS_EXT >= 12#endif // CONFIG_STA_SUPPORT //#ifdef CONFIG_APSTA_MIXED_SUPPORT#if WIRELESS_EXT >= 12 if (pAd->OpMode == OPMODE_AP) { dev->wireless_handlers = &rt28xx_ap_iw_handler_def; }#endif //WIRELESS_EXT >= 12#endif // CONFIG_APSTA_MIXED_SUPPORT //#if WIRELESS_EXT < 21 dev->get_wireless_stats = rt28xx_get_wireless_stats;#endif dev->get_stats = RT28xx_get_ether_stats; dev->open = MainVirtualIF_open; //rt28xx_open; dev->stop = MainVirtualIF_close; //rt28xx_close;// dev->uninit = ieee80211_if_reinit;// dev->destructor = ieee80211_if_free; dev->priv_flags = INT_MAIN; dev->do_ioctl = rt28xx_ioctl;#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) dev->validate_addr = NULL;#endif // find available device name
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?