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

📄 rtmp_main.c

📁 TP Link 321 Linux Driver
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (pAd->RTUSBCmdThr_pid>= 0) 	{		RTUSBCmd_kill = 1;		RTUSBCMDUp(pAd);		wmb(); // need to check		ret = kill_proc (pAd->RTUSBCmdThr_pid, SIGTERM, 1);		if (ret) 		{			printk (KERN_WARNING "%s: unable to RTUSBCmd thread, pid=%d\n", pAd->net_dev->name, pAd->RTUSBCmdThr_pid);		}		wait_for_completion (&pAd->CmdThreadNotify);		// reset cmd thread		pAd->RTUSBCmdThr_pid= -1;	}	RTUSBHalt(pAd, TRUE);	RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);	tasklet_kill(&pAd->rx_bh);	DBGPRINT(RT_DEBUG_TRACE,"<--usb_rtusb_close_device \n");	return 0;}static int usb_rtusb_open(struct net_device *net_dev){	PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER) net_dev->priv;	UCHAR	TmpPhy;	NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;//	if (!pAd->ProbeFinish)//		return -1;	DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__);#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//iverson        PortCfgInit(pAd);	// Wait for hardware stable	{		ULONG MacCsr0 = 0, Index = 0;				do		{			Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacCsr0);			if (MacCsr0 != 0)				break;						RTMPusecDelay(1000);		} while (Index++ < 1000);		DBGPRINT(RT_DEBUG_TRACE, "Init: MAC_CSR0=0x%08x, Status=0x%08x\n", MacCsr0, Status);	}	// Load 8051 firmware	// Read RaConfig profile parameters #ifdef  READ_PROFILE_FROM_FILE  	RTMPReadParametersFromFile(pAd);#endif  // // Read additional info from NIC such as MAC address // This function must called after register CSR base address //#ifdef INIT_FROM_EEPROM	 NICReadEEPROMParameters(pAd);	 NICInitAsicFromEEPROM(pAd);#endif 	RTUSBWriteHWMACAddress(pAd); 	 // external LNA has different R17 base	 if (pAd->NicConfig2.field.ExternalLNA)	 {	  pAd->BbpTuning.R17LowerBoundA += 0x10;	  pAd->BbpTuning.R17UpperBoundA += 0x10;	  pAd->BbpTuning.R17LowerBoundG += 0x10;	  pAd->BbpTuning.R17UpperBoundG += 0x10;	 } 	 // hardware initialization after all parameters are acquired from	 // Registry or E2PROM#if 1	 TmpPhy = pAd->PortCfg.PhyMode;//	pAd->PortCfg.PhyMode = 0xff;	 RTMPSetPhyMode(pAd, TmpPhy);#endif	 // max desired rate might be reset as call phymode setup, so set TxRate again	 if (pAd->PortCfg.DefaultMaxDesiredRate == 0)	  RTMPSetDesiredRates(pAd, -1);	 else	  RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[pAd->PortCfg.DefaultMaxDesiredRate - 1] * 1000000));	printk("=> usb_rtusb_open\n");	if (VIRTUAL_IF_NUM(pAd) == 0)	{		RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x0718);		// Clear Reset Flag before starting receiving/transmitting		RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS);		RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_REMOVE_IN_PROGRESS);		if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))		{			RTUSBBulkReceive(pAd);			RTUSBWriteMACRegister(pAd, TXRX_CSR0, 0x025eb032);    // enable RX of MAC block, Staion not drop control frame		}		AsicSwitchChannel(pAd, pAd->PortCfg.Channel);		AsicLockChannel(pAd, pAd->PortCfg.Channel);	}	VIRTUAL_IF_INC(pAd);	netif_start_queue(net_dev);	netif_carrier_on(net_dev);	netif_wake_queue(net_dev);	DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__);	return 0;}static int usb_rtusb_close(struct net_device *net_dev){	PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER) net_dev->priv;	int	            i = 0;	MLME_DISASSOC_REQ_STRUCT DisReq;	MLME_QUEUE_ELEM          MsgElem;	wait_queue_head_t wait;//	if (!pAd->ProbeFinish)//		return -1;	init_waitqueue_head(&wait);	DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__);	netif_carrier_off(pAd->net_dev);	netif_stop_queue(pAd->net_dev);	if (INFRA_ON(pAd))	{		COPY_MAC_ADDR(DisReq.Addr, pAd->PortCfg.Bssid);		DisReq.Reason =  REASON_DISASSOC_STA_LEAVING;		MsgElem.Machine = ASSOC_STATE_MACHINE;		MsgElem.MsgType = MT2_MLME_DISASSOC_REQ;		MsgElem.MsgLen = sizeof(MLME_DISASSOC_REQ_STRUCT);		NdisMoveMemory(MsgElem.Msg, &DisReq, sizeof(MLME_DISASSOC_REQ_STRUCT));		MlmeDisassocReqAction(pAd, &MsgElem);		wait_event_interruptible_timeout(wait,0,HZ/1000);	}	VIRTUAL_IF_DEC(pAd);	if (VIRTUAL_IF_NUM(pAd) == 0)	{		for(i=0;i<10 || pAd->CmdHandlerIsRunning==TRUE;i++)			wait_event_interruptible_timeout(wait,0,HZ/1000);				for(i=0;i<10 || pAd->Mlme.bRunning==TRUE;i++)			wait_event_interruptible_timeout(wait,0,HZ/1000);		//		// Patch to fully turn off BBP, need to send a fake NULL frame.		//		RTUSBWriteMACRegister(pAd, MAC_CSR10, 0x0018);		for (i=0; i<10; i++)		{			RTMPSendNullFrame(pAd, RATE_6);			RTMPusecDelay(1000);		}					AsicDisableSync(pAd);				RTMPSetLED(pAd, LED_HALT);		atomic_set(&pAd->PendingRx, 0);	}#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT{	// TODO: Shall we send wireless event to notfiy user space that if-down??}#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)	module_put(THIS_MODULE);#else	MOD_DEC_USE_COUNT;#endif	DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__);	return 0;}static INT usb_rtusb_sendpkt(	IN	struct sk_buff		*pSkb,	IN	struct net_device	*net_dev){	/* transmit the packet */	return RTMPSendPackets(pSkb, net_dev);}static int usb_rtusb_init_device(struct net_device *net_dev){	PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER) net_dev->priv;	NDIS_STATUS     Status = NDIS_STATUS_SUCCESS;	UCHAR           TmpPhy;		DBGPRINT(RT_DEBUG_TRACE, "%s-->\n", __FUNCTION__);	// init mediastate to disconnected	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);		//bottom half data is assign at  each task_scheduler	tasklet_init(&pAd->rx_bh, RTUSBBulkRxHandle, (unsigned long)pAd);		// Initialize pAd->PortCfg to manufacture default	PortCfgInit(pAd);	// Init  RTMP_ADAPTER CmdQElements	Status = RTMPInitAdapterBlock(pAd); //always success	if (Status != NDIS_STATUS_SUCCESS)	{		return Status;	}	//	// Init send data structures and related parameters	//	Status = NICInitTransmit(pAd);      //if fail clean itself	if (Status != NDIS_STATUS_SUCCESS)	{		return Status;	}	//	// Init receive data structures and related parameters	//	Status = NICInitRecv(pAd);	if (Status != NDIS_STATUS_SUCCESS)	{		goto out;	}		// Wait for hardware stable	{		ULONG MacCsr0 = 0, Index = 0;				do		{			Status = RTUSBReadMACRegister(pAd, MAC_CSR0, &MacCsr0);			if (MacCsr0 != 0)				break;						RTMPusecDelay(1000);		} while (Index++ < 1000);		DBGPRINT(RT_DEBUG_TRACE, "Init: MAC_CSR0=0x%08x, Status=0x%08x\n", MacCsr0, Status);	}	// Load 8051 firmware	Status = NICLoadFirmware(pAd);	if(Status != NDIS_STATUS_SUCCESS)	{		goto out;	}	// Initialize Asics	NICInitializeAsic(pAd);#ifdef BLOCK_NET_IF	initblockQueueTab(pAd);#endif // BLOCK_NET_IF //	// Read RaConfig profile parameters #ifdef  READ_PROFILE_FROM_FILE 	RTMPReadParametersFromFile(pAd);#endif	//	// Read additional info from NIC such as MAC address	// This function must called after register CSR base address	//#ifdef	INIT_FROM_EEPROM	NICReadEEPROMParameters(pAd);	NICInitAsicFromEEPROM(pAd);#endif	RTUSBWriteHWMACAddress(pAd);	// external LNA has different R17 base	if (pAd->NicConfig2.field.ExternalLNA)	{		pAd->BbpTuning.R17LowerBoundA += 0x10;		pAd->BbpTuning.R17UpperBoundA += 0x10;		pAd->BbpTuning.R17LowerBoundG += 0x10;		pAd->BbpTuning.R17UpperBoundG += 0x10;	}	// hardware initialization after all parameters are acquired from	// Registry or E2PROM	TmpPhy = pAd->PortCfg.PhyMode;	pAd->PortCfg.PhyMode = 0xff;	RTMPSetPhyMode(pAd, TmpPhy);	// max desired rate might be reset as call phymode setup, so set TxRate again	if (pAd->PortCfg.DefaultMaxDesiredRate == 0)		RTMPSetDesiredRates(pAd, -1);	else		RTMPSetDesiredRates(pAd, (LONG) (RateIdToMbps[pAd->PortCfg.DefaultMaxDesiredRate - 1] * 1000000));	//	// initialize MLME	//	Status = MlmeInit(pAd);	if(Status != NDIS_STATUS_SUCCESS)	{		goto out;	}	// mlmethread & RTUSBCmd flag restart	mlme_kill = 0;	RTUSBCmd_kill =0;	CreateThreads(net_dev);	// at every open handler, copy mac address.	COPY_MAC_ADDR(pAd->net_dev->dev_addr, pAd->CurrentAddress);	// USB_ID info for UI	pAd->VendorDesc = 0x148F2573;	DBGPRINT(RT_DEBUG_TRACE, "%s<--\n", __FUNCTION__);	return 0;out:	ReleaseAdapter(pAd, TRUE, FALSE);	return Status;}INT MlmeThread(    IN void * Context){	PRTMP_ADAPTER	pAd = (PRTMP_ADAPTER)Context;//2007/12/11:KH modified to fix compiled failed#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	daemonize();#else	daemonize("rt73");#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)	allow_signal(SIGTERM);#endif	current->flags |= PF_NOFREEZE;	/* signal that we've started the thread */	complete(&(pAd->MlmeThreadNotify));	while (1)	{		int status;				status = down_interruptible(&pAd->mlme_semaphore);		if (status != 0)			continue;		if (mlme_kill)			break;		MlmeHandler(pAd);	}	/* notify the exit routine that we're actually exiting now 	 *	 * complete()/wait_for_completion() is similar to up()/down(),	 * except that complete() is safe in the case where the structure	 * is getting deleted in a parallel mode of execution (i.e. just	 * after the down() -- that's necessary for the thread-shutdown	 * case.	 *	 * complete_and_exit() goes even further than this -- it is safe in	 * the case that the thread of the caller is going away (not just	 * the structure) -- this is necessary for the module-remove case.	 * This is important in preemption kernels, which transfer the flow	 * of execution immediately upon a complete().	 */	complete_and_exit (&pAd->MlmeThreadNotify, 0);	DBGPRINT(RT_DEBUG_TRACE, "<---MlmeThread\n");}INT RTUSBCmdThread(    IN void * Context){	PRTMP_ADAPTER	pAd = (PRTMP_ADAPTER)Context;//2007/12/11:KH modified to fix compiled failed#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	daemonize();#else	daemonize("rt73");#endif#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)	allow_signal(SIGTERM);#endif	current->flags |= PF_NOFREEZE;	/* signal that we've started the thread */	complete(&(pAd->CmdThreadNotify));	while (1)		{				int status;						status = down_interruptible(&(pAd->RTUSBCmd_semaphore));				if (status != 0)						continue;						if (RTUSBCmd_kill)			break;		pAd->CmdHandlerIsRunning=TRUE;		CMDHandler(pAd);			pAd->CmdHandlerIsRunning=FALSE;	}	/* notify the exit routine that we're actually exiting now 	 *	 * complete()/wait_for_completion() is similar to up()/down(),	 * except that complete() is safe in the case where the structure	 * is getting deleted in a parallel mode of execution (i.e. just	 * after the down() -- that's necessary for the thread-shutdown	 * case.	 *

⌨️ 快捷键说明

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