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, &reg);  // clear garbage interrupts	printk("0x1300 = %08x\n", reg);	}	{//	u32 reg;//	u8  byte;//	u16 tmp;//	RTMP_IO_READ32(pAd, XIFS_TIME_CFG, &reg);//	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 + -
显示快捷键?