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

📄 usb_main_dev.c

📁 ralink 2870 usb无线网卡 最新驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
Routine Description:    MLME kernel thread.Arguments:	*Context			the pAd, driver control block pointerReturn Value:    0					close the threadNote:========================================================================*/INT MlmeThread(	IN void *Context){	RTMP_ADAPTER *pAd;	RTMP_OS_TASK *pTask;	int status;	status = 0;	pTask = (RTMP_OS_TASK *)Context;	pAd = (PRTMP_ADAPTER)pTask->priv;		RtmpOSTaskCustomize(pTask);	while(!pTask->task_killed)	{#ifdef KTHREAD_SUPPORT		RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);#else		RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);		/* unlock the device pointers */		if (status != 0)		{			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);			break;		}	#endif					/* lock the device pointers , need to check if required*/		//down(&(pAd->usbdev_semaphore));				if (!pAd->PM_FlgSuspend)			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().	 */	DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__FUNCTION__));#ifndef KTHREAD_SUPPORT	pTask->taskPID = THREAD_PID_INIT_VALUE;	complete_and_exit (&pTask->taskComplete, 0);#endif	return 0;}/*========================================================================Routine Description:    USB command kernel thread.Arguments:	*Context			the pAd, driver control block pointerReturn Value:    0					close the threadNote:========================================================================*/INT RTUSBCmdThread(	IN void * Context){	RTMP_ADAPTER *pAd;	RTMP_OS_TASK *pTask;	int status;	status = 0;	pTask = (RTMP_OS_TASK *)Context;	pAd = (PRTMP_ADAPTER)pTask->priv;		RtmpOSTaskCustomize(pTask);	NdisAcquireSpinLock(&pAd->CmdQLock);	pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING;	NdisReleaseSpinLock(&pAd->CmdQLock);		while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING)	{#ifdef KTHREAD_SUPPORT		RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);#else		/* lock the device pointers */		RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);		if (status != 0)		{			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);			break;		}#endif		if (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_STOPED)			break;						if (!pAd->PM_FlgSuspend)			CMDHandler(pAd);	}	if (pAd && !pAd->PM_FlgSuspend)	{	// Clear the CmdQElements.		CmdQElmt	*pCmdQElmt = NULL;		NdisAcquireSpinLock(&pAd->CmdQLock);		pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;		while(pAd->CmdQ.size)		{			RTUSBDequeueCmd(&pAd->CmdQ, &pCmdQElmt);			if (pCmdQElmt)			{				if (pCmdQElmt->CmdFromNdis == TRUE)				{					if (pCmdQElmt->buffer != NULL)						os_free_mem(pAd, pCmdQElmt->buffer);					os_free_mem(pAd, (PUCHAR)pCmdQElmt);				}				else				{					if ((pCmdQElmt->buffer != NULL) && (pCmdQElmt->bufferlength != 0))						os_free_mem(pAd, pCmdQElmt->buffer);					os_free_mem(pAd, (PUCHAR)pCmdQElmt);				}			}		}		NdisReleaseSpinLock(&pAd->CmdQLock);	}	/* 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().	 */	DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n"));#ifndef KTHREAD_SUPPORT	pTask->taskPID = THREAD_PID_INIT_VALUE;	complete_and_exit (&pTask->taskComplete, 0);#endif	return 0;}VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd){	PHT_TX_CONTEXT		pHTTXContext;	int 					idx;	ULONG				irqFlags;	PURB		   		pUrb;	BOOLEAN				needDumpSeq = FALSE;	UINT32          	MACValue;	idx = 0;	RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);	if ((MACValue & 0xff) !=0 )	{		DBGPRINT(RT_DEBUG_TRACE, ("TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n", MACValue));		RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012);		while((MACValue &0xff) != 0 && (idx++ < 10))		{		        RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);		        RTMPusecDelay(1);		}		RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);	}	idx = 0;	if ((MACValue & 0xff00) !=0 )	{		DBGPRINT(RT_DEBUG_TRACE, ("TX QUEUE 1 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n", MACValue));		RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf4000a);		while((MACValue &0xff00) != 0 && (idx++ < 10))		{			RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);			RTMPusecDelay(1);		}		RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);	}		if (pAd->watchDogRxOverFlowCnt >= 2)	{		DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\n"));		if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |									fRTMP_ADAPTER_BULKIN_RESET |									fRTMP_ADAPTER_HALT_IN_PROGRESS |									fRTMP_ADAPTER_NIC_NOT_EXIST))))		{			DBGPRINT(RT_DEBUG_TRACE, ("Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\n"));			RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);			RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);			needDumpSeq = TRUE;		}		pAd->watchDogRxOverFlowCnt = 0;	}	for (idx = 0; idx < NUM_OF_TX_RING; idx++)	{		pUrb = NULL;				RTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags);		if ((pAd->BulkOutPending[idx] == TRUE) && pAd->watchDogTxPendingCnt)		{			pAd->watchDogTxPendingCnt[idx]++;			if ((pAd->watchDogTxPendingCnt[idx] > 2) && 				 (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_BULKOUT_RESET)))				)			{				// FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it!				pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[idx]);				if (pHTTXContext->IRPPending)				{	// Check TxContext.					pUrb = pHTTXContext->pUrb;				}				else if (idx == MGMTPIPEIDX)				{					PTX_CONTEXT pMLMEContext, pNULLContext, pPsPollContext;										//Check MgmtContext.					pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa);					pPsPollContext = (PTX_CONTEXT)(&pAd->PsPollContext);					pNULLContext = (PTX_CONTEXT)(&pAd->NullContext);										if (pMLMEContext->IRPPending)					{						ASSERT(pMLMEContext->IRPPending);						pUrb = pMLMEContext->pUrb;					}					else if (pNULLContext->IRPPending)					{							ASSERT(pNULLContext->IRPPending);						pUrb = pNULLContext->pUrb;					}					else if (pPsPollContext->IRPPending)					{							ASSERT(pPsPollContext->IRPPending);						pUrb = pPsPollContext->pUrb;					}				}								RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);								DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\n", idx));				if (pUrb)				{					DBGPRINT(RT_DEBUG_TRACE, ("Unlink the pending URB!\n"));					// unlink it now					RTUSB_UNLINK_URB(pUrb);					// Sleep 200 microseconds to give cancellation time to work					RTMPusecDelay(200);					needDumpSeq = TRUE;				}				else				{					DBGPRINT(RT_DEBUG_ERROR, ("Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\n"));				}			}			else			{				RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);			}		}		else		{			RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);		}	}#ifdef DOT11_N_SUPPORT	// For Sigma debug, dump the ba_reordering sequence.	if((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0))	{		USHORT				Idx;		PBA_REC_ENTRY		pBAEntry = NULL;		UCHAR				count = 0;		struct reordering_mpdu *mpdu_blk;							Idx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0];		pBAEntry = &pAd->BATable.BARecEntry[Idx];		if((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL))		{			DBGPRINT(RT_DEBUG_TRACE, ("NICUpdateRawCounters():The Queueing pkt in reordering buffer:\n"));			NdisAcquireSpinLock(&pBAEntry->RxReRingLock);			mpdu_blk = pBAEntry->list.next;			while (mpdu_blk)			{				DBGPRINT(RT_DEBUG_TRACE, ("\t%d:Seq-%d, bAMSDU-%d!\n", count, mpdu_blk->Sequence, mpdu_blk->bAMSDU));				mpdu_blk = mpdu_blk->next;				count++;			}			DBGPRINT(RT_DEBUG_TRACE, ("\npBAEntry->LastIndSeq=%d!\n", pBAEntry->LastIndSeq));			NdisReleaseSpinLock(&pBAEntry->RxReRingLock);		}	}#endif // DOT11_N_SUPPORT //}/*========================================================================Routine Description:    Release allocated resources.Arguments:    *dev				Point to the PCI or USB device	pAd					driver control block pointerReturn Value:    NoneNote:========================================================================*/static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd){	DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n",				dev->bus->bus_name, dev->devpath));	if (!pAd)	{#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	/* kernel 2.4 series */		while(MOD_IN_USE > 0)		{			MOD_DEC_USE_COUNT;		}#else		usb_put_dev(dev);#endif // LINUX_VERSION_CODE //		printk("rtusb_disconnect: pAd == NULL!\n");		return;	}	RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);	// for debug, wait to show some messages to /proc system	udelay(1);	RtmpPhyNetDevExit(pAd, pAd->net_dev);	// FIXME: Shall we need following delay and flush the schedule??	udelay(1);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	/* kernel 2.4 series */#else	flush_scheduled_work();#endif // LINUX_VERSION_CODE //	udelay(1);	// free the root net_device	RtmpOSNetDevFree(pAd->net_dev);	RtmpRaDevCtrlExit(pAd);	// release a use of the usb device structure#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	/* kernel 2.4 series */	while(MOD_IN_USE > 0)	{		MOD_DEC_USE_COUNT;	}#else	usb_put_dev(dev);#endif // LINUX_VERSION_CODE //	udelay(1);	DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n"));}static int __devinit rt2870_probe(	IN struct usb_interface *intf,	IN struct usb_device *usb_dev,	IN const struct usb_device_id *dev_id,	IN RTMP_ADAPTER **ppAd){	struct  net_device		*net_dev = NULL;	RTMP_ADAPTER       	*pAd = (RTMP_ADAPTER *) NULL;	INT                 		status, rv;	PVOID				handle;	RTMP_OS_NETDEV_OP_HOOK	netDevHook;		DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n"));		// Check chipset vendor/product ID	//if (RT28XXChipsetCheck(_dev_p) == FALSE)	//	goto err_out;//RtmpDevInit=============================================	// Allocate RTMP_ADAPTER adapter structure	handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);	if (handle == NULL)	{		printk("rt2870_probe(): Allocate memory for os handle failed!\n");		return -ENOMEM;	}	((POS_COOKIE)handle)->pUsb_Dev = usb_dev;		rv = RTMPAllocAdapterBlock(handle, &pAd);	if (rv != NDIS_STATUS_SUCCESS) 	{		kfree(handle);		goto err_out;	}//USBDevInit==============================================	if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE)		goto err_out_free_radev;		RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_USB);//NetDevInit==============================================	net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);	if (net_dev == NULL)		goto err_out_free_radev;		// Here are the net_device structure with usb specific parameters.#ifdef NATIVE_WPA_SUPPLICANT_SUPPORT	/* for supporting Network Manager.	  * Set the sysfs physical device reference for the network logical device if set prior to registration will 	  * cause a symlink during initialization.	 */#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))	SET_NETDEV_DEV(net_dev, &(usb_dev->dev));#endif#endif // NATIVE_WPA_SUPPLICANT_SUPPORT //#ifdef CONFIG_STA_SUPPORT    pAd->StaCfg.OriDevType = net_dev->type;#endif // CONFIG_STA_SUPPORT ////All done, it's time to register the net device to linux kernel.	// Register this device	status = RtmpOSNetDevAttach(net_dev, &netDevHook);	if (status != 0)		goto err_out_free_netdev;#ifdef KTHREAD_SUPPORT	init_waitqueue_head(&pAd->mlmeTask.kthread_q);	init_waitqueue_head(&pAd->timerTask.kthread_q);	init_waitqueue_head(&pAd->cmdQTask.kthread_q);#endif		*ppAd = pAd;	DBGPRINT(RT_DEBUG_TRACE, ("<===rt2870_probe()!\n"));	return 0;	/* --------------------------- ERROR HANDLE --------------------------- */	err_out_free_netdev:	RtmpOSNetDevFree(net_dev);	err_out_free_radev:	RTMPFreeAdapter(pAd);	err_out:	*ppAd = NULL;	return -1;	}

⌨️ 快捷键说明

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