亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rtmp_main.c

?? RT73_Linux_STA_Drv1.0.3.6 linux系統下
?? C
?? 第 1 頁 / 共 5 頁
字號:
	//pAd->rx_bh.data = (unsigned long)pAd;
	pAd->rx_bh.func = RTUSBRxPacket;
	
	res = register_netdev(pAd->net_dev);
	if (res)
		goto out;


	return pAd;
	
out:
	printk("register_netdev failed err=%d\n",res);
	return NULL;
}

//Disconnect function is called within exit routine
static void usb_rtusb_disconnect(struct usb_device *dev, void *ptr)
{
	PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) ptr;
	

	if (!pAd)
		return;
	
	tasklet_kill(&pAd->rx_bh);
	RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);
	// for debug, wait to show some messages to /proc system
	udelay(1);
	//After Add Thread implementation, Upon exec there, pAd->net_dev seems becomes NULL, 
	//need to check why???
	//assert(pAd->net_dev != NULL)
	if(pAd->net_dev != NULL)
	{
		printk("unregister_netdev()\n");
		unregister_netdev (pAd->net_dev);
	}
	udelay(1);
	udelay(1);

	while (MOD_IN_USE > 0) {
		MOD_DEC_USE_COUNT;
	}
	udelay(1);
	DBGPRINT(RT_DEBUG_ERROR,"<=== RTUSB disconnect successfully\n");

}

#else
static int usb_rtusb_close(struct net_device *net_dev)
{
	PRTMP_ADAPTER   pAd = (PRTMP_ADAPTER) net_dev->priv;
	int             ret;
	int	            i = 0;
	
	DECLARE_WAIT_QUEUE_HEAD (unlink_wakeup); 
	DECLARE_WAITQUEUE (wait, current);
	
	DBGPRINT(RT_DEBUG_TRACE,"-->rt73_close \n");
	
	netif_carrier_off(pAd->net_dev);
	netif_stop_queue(pAd->net_dev);

	// ensure there are no more active urbs. 
	add_wait_queue (&unlink_wakeup, &wait);
	pAd->wait = &unlink_wakeup;
	
	// maybe wait for deletions to finish.
	while ((i < 25) && atomic_read(&pAd->PendingRx) > 0) {
#if LINUX_VERSION_CODE >KERNEL_VERSION(2,6,9)

		msleep(UNLINK_TIMEOUT_MS);
#endif
		i++;
	}
	pAd->wait = NULL;
	remove_wait_queue (&unlink_wakeup, &wait); 

	if (pAd->MLMEThr_pid >= 0) 
	{
		mlme_kill = 1;
		RTUSBMlmeUp(pAd);
		wmb(); // need to check
		ret = kill_proc (pAd->MLMEThr_pid, SIGTERM, 1);
		if (ret) 
		{
			printk (KERN_ERR "%s: unable to signal thread\n", pAd->net_dev->name);
			return ret;
		}
		wait_for_completion (&pAd->notify);
	}
	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_ERR "%s: unable to signal thread\n", pAd->net_dev->name);
			return ret;
		}
		wait_for_completion (&pAd->notify);
	}
	RTUSBHalt(pAd, TRUE);
	
	DBGPRINT(RT_DEBUG_TRACE,"<--rt73_close \n");

	return 0;
}

INT MlmeThread(
    IN void * Context)
{
	PRTMP_ADAPTER	pAd = (PRTMP_ADAPTER)Context;

	daemonize("rt73");
	allow_signal(SIGTERM);
	current->flags |= PF_NOFREEZE;
	/* signal that we've started the thread */
	complete(&(pAd->notify));
#if 1
	while (1)
	{
		//if(down_interruptible(&pAd->mlme_semaphore))
			//break;

		/* lock the device pointers */
		down(&(pAd->mlme_semaphore));

		if (mlme_kill)
			break;

		/* lock the device pointers , need to check if required*/
		down(&(pAd->usbdev_semaphore));
#if 0
		if (current->flags & PF_FREEZE) {
			refrigerator(0);
		}
#endif
		MlmeHandler(pAd);		

		/* unlock the device pointers */
		up(&(pAd->usbdev_semaphore));
	}
#else
	// I tried this way for thread handling
	while(1)
	{
		timeout = next_tick;
		do {
			timeout = interruptible_sleep_on_timeout (&pAd->MLMEThr_wait, timeout);
			/* make swsusp happy with our thread */
			if (current->flags & PF_FREEZE)
				refrigerator(PF_FREEZE);
			DBGPRINT(RT_DEBUG_TRACE, "current->flags  = 0x%x\n",current->flags );
		} while (!signal_pending (current) && (timeout > 0));

		if (signal_pending (current)) {
			flush_signals(current);
		}

		if (mlme_kill)
			break;
	}
#endif

	/* 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->notify, 0);
	DBGPRINT(RT_DEBUG_TRACE, "<---MlmeThread\n");

}

INT RTUSBCmdThread(
    IN void * Context)
{
	PRTMP_ADAPTER	pAd = (PRTMP_ADAPTER)Context;

	daemonize("rt73");
	allow_signal(SIGTERM);
	current->flags |= PF_NOFREEZE;
	/* signal that we've started the thread */
	complete(&(pAd->notify));

	while (1)
	{
		//if(down_interruptible(&pAd->mlme_semaphore))
			//break;

		/* lock the device pointers */
		down(&(pAd->RTUSBCmd_semaphore));

		if (RTUSBCmd_kill)
			break;

		/* lock the device pointers , need to check if required*/
		down(&(pAd->usbdev_semaphore));
#if 0
		if (current->flags & PF_FREEZE) {
			refrigerator(0);
		//	continue;
		}
#endif
		CMDHandler(pAd);		

		/* unlock the device pointers */
		up(&(pAd->usbdev_semaphore));
	}

	/* 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->notify, 0);
	DBGPRINT(RT_DEBUG_TRACE, "<---RTUSBCmdThread\n");

}
static int usb_rtusb_probe (struct usb_interface *intf,
					  const struct usb_device_id *id)
{	
	struct usb_device   *dev = interface_to_usbdev(intf);
	PRTMP_ADAPTER       pAd = (PRTMP_ADAPTER)NULL;
	int                 i;
	struct net_device   *netdev;
	int                 res = -ENOMEM;


	usb_get_dev(dev);
	for (i = 0; i < rtusb_usb_id_len; i++)
	{
		if (dev->descriptor.idVendor == rtusb_usb_id[i].idVendor &&
			dev->descriptor.idProduct == rtusb_usb_id[i].idProduct)
		{
			printk("idVendor = 0x%x, idProduct = 0x%x \n",dev->descriptor.idVendor, dev->descriptor.idProduct);
			break;
		}
	}
	if (i == rtusb_usb_id_len) {
		printk("Device Descriptor not matching\n");
		return res;
	}

	netdev = alloc_etherdev(sizeof (*pAd));
	if(!netdev)
	{
		printk("alloc_etherdev failed\n");
	
		module_put(THIS_MODULE);
		return res;
	}
	
	pAd = netdev->priv;
	pAd->net_dev = netdev;
	netif_stop_queue(netdev);
	pAd->config = &dev->config->desc;
	pAd->pUsb_Dev = dev;
	SET_MODULE_OWNER(pAd->net_dev);
	ether_setup(pAd->net_dev);
	
	netdev->open = usb_rtusb_open;
	netdev->stop = usb_rtusb_close;
	netdev->priv = pAd;
	netdev->hard_start_xmit = RTMPSendPackets;
	netdev->get_stats = rt73_get_ether_stats;

#if WIRELESS_EXT >= 12
	netdev->get_wireless_stats = rt73_get_wireless_stats;
	netdev->wireless_handlers = (struct iw_handler_def *) &rt73_iw_handler_def;
#endif
	netdev->do_ioctl = rt73_ioctl;

	pAd->net_dev->hard_header_len = 14;
	pAd->net_dev->mtu = 1500;
	pAd->net_dev->addr_len = 6;
	pAd->net_dev->weight = 64;

	OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
	
	pAd->MLMEThr_pid= -1;
	pAd->RTUSBCmdThr_pid= -1;

	SET_NETDEV_DEV(pAd->net_dev, &intf->dev);
    
	{// find available 
		int 	i=0;
		char	slot_name[IFNAMSIZ];
		struct  net_device	*device;
        struct  usb_host_interface *iface_desc;
        struct  usb_endpoint_descriptor *endpoint;

        
		for (i = 0; i < 8; i++)
		{
			sprintf(slot_name, "rausb%d", i);

#if 1          
			if(dev_get_by_name(slot_name)==NULL)                
				break;
#else			
			read_lock_bh(&dev_base_lock); // avoid multiple init
			for (device = dev_base; device != NULL; device = device->next)
			{
				if (strncmp(device->name, slot_name, 4) == 0)
				{
					break;
				}
			}
			read_unlock_bh(&dev_base_lock);
			
			if(device == NULL)	break;
#endif			
		}
		if(i == 8)
		{
			DBGPRINT(RT_DEBUG_ERROR, "No available slot name\n");
			return res;
		}

		sprintf(pAd->net_dev->name, "rausb%d", i);
		DBGPRINT(RT_DEBUG_ERROR, "usb device name %s\n", pAd->net_dev->name);


        /* get the active interface descriptor */
        iface_desc = intf->cur_altsetting;

        /* check out the endpoint: it has to be Interrupt & IN */
        endpoint = &iface_desc->endpoint[i].desc;
        
        /* get Max Packet Size from endpoint */
        pAd->BulkOutMaxPacketSize = (USHORT)endpoint->wMaxPacketSize;
        DBGPRINT(RT_DEBUG_TRACE, "BulkOutMaxPacketSize  %d\n", pAd->BulkOutMaxPacketSize);

	}
	
    //bottom half data is assign at  each task_scheduler
	//pAd->rx_bh.data = (unsigned long)pAd;
	pAd->rx_bh.func = RTUSBRxPacket;

   
	res = register_netdev(pAd->net_dev);
	if (res)
		goto out;

	usb_set_intfdata(intf, pAd);

	return 0;
	
out:
	printk("register_netdev failed err=%d\n",res);
	free_netdev(netdev);

	return -1;
}

static void usb_rtusb_disconnect(struct usb_interface *intf)
{
	struct usb_device   *dev = interface_to_usbdev(intf);
	PRTMP_ADAPTER       pAd = (PRTMP_ADAPTER)NULL;
	
	pAd = usb_get_intfdata(intf);

	usb_set_intfdata(intf, NULL);
	RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);
	DBGPRINT(RT_DEBUG_ERROR,"unregister usbnet usb-%s-%s\n",
		dev->bus->bus_name, dev->devpath);
	if (!pAd)
		return;
	
	tasklet_kill(&pAd->rx_bh);
	// for debug, wait to show some messages to /proc system
	udelay(1);
	//After Add Thread implementation, Upon exec there, pAd->net_dev seems becomes NULL, 
	//need to check why???
	//assert(pAd->net_dev != NULL)
	if(pAd->net_dev!= NULL)
	{
		printk("unregister_netdev()\n");
		unregister_netdev (pAd->net_dev);
	}
	udelay(1);
	flush_scheduled_work ();
	udelay(1);

	free_netdev(pAd->net_dev);
	usb_put_dev(dev);
	udelay(1);
	DBGPRINT(RT_DEBUG_ERROR,"<=== RTUSB disconnect successfully\n");

}
#endif


//
// Driver module load function
//
INT __init usb_rtusb_init(void)
{
    printk("rtusb init ====>\n");
    
	return usb_register(&rtusb_driver);
}

//
// Driver module unload function
//
VOID __exit usb_rtusb_exit(void)
{
	udelay(1);
	udelay(1);
	usb_deregister(&rtusb_driver);
	
	printk("<=== rtusb exit\n");
}
/**************************************/
module_init(usb_rtusb_init);
module_exit(usb_rtusb_exit);
/**************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线亚洲免费视频| 欧美午夜不卡在线观看免费| 99久久久久久99| 久久伊99综合婷婷久久伊| 五月天激情综合网| 亚洲国产成人午夜在线一区| 欧美国产成人在线| 国产乱色国产精品免费视频| 亚洲一区二区视频在线观看| 91麻豆成人久久精品二区三区| 91浏览器在线视频| 亚洲一区二区三区影院| www激情久久| 91精品国产色综合久久不卡电影 | 日韩精品中文字幕在线不卡尤物| 日韩一卡二卡三卡国产欧美| 日韩高清电影一区| 欧美裸体bbwbbwbbw| 国产欧美一区二区三区网站| 精品一区二区成人精品| 日韩黄色一级片| 久久精品一区二区三区四区| 日韩视频免费观看高清完整版在线观看 | 亚洲精品久久7777| 性做久久久久久久免费看| 亚洲福利国产精品| www.欧美日韩| 精久久久久久久久久久| 欧美激情艳妇裸体舞| 欧美日韩国产天堂| 99麻豆久久久国产精品免费优播| 一区二区三区四区高清精品免费观看| 一区二区三区产品免费精品久久75 | 欧美艳星brazzers| 喷白浆一区二区| 91老司机福利 在线| 91福利国产精品| 日韩精品一区二区三区四区视频 | 欧美国产视频在线| 日本不卡一区二区| 国产黄人亚洲片| 成人毛片视频在线观看| 国产精品高潮呻吟| 精品久久久久99| xnxx国产精品| 欧美精品丝袜久久久中文字幕| 在线视频一区二区三| 色视频成人在线观看免| 日韩色在线观看| 国内精品伊人久久久久av影院| 免费在线观看日韩欧美| 免费人成网站在线观看欧美高清| 美脚の诱脚舐め脚责91 | 国产成人综合自拍| 亚洲中国最大av网站| 国产米奇在线777精品观看| 97精品电影院| 99久久免费精品| 国产精品高潮呻吟| 国产一区二区不卡老阿姨| 久久99久久99小草精品免视看| 成人免费高清视频在线观看| 国产高清一区日本| 国产福利不卡视频| 极品少妇xxxx偷拍精品少妇| 亚洲国产欧美在线| 国产精品美女久久久久av爽李琼 | 欧美性大战久久久久久久| 综合欧美一区二区三区| 欧美在线短视频| 欧美一区二区免费视频| 亚洲视频在线一区| 国产婷婷色一区二区三区四区| 欧美日韩在线观看一区二区| 麻豆国产欧美一区二区三区| 国产传媒一区在线| 国产毛片精品国产一区二区三区| 国产做a爰片久久毛片| 日韩免费高清av| 国产乱妇无码大片在线观看| 狠狠色狠狠色综合| 国产很黄免费观看久久| 一区二区三区小说| 性欧美疯狂xxxxbbbb| 欧美色偷偷大香| 日韩欧美色综合网站| 91在线观看视频| 久久久久国产精品麻豆| 亚洲一区二区三区中文字幕| 国产乱妇无码大片在线观看| 91首页免费视频| 丁香婷婷综合色啪| 亚洲黄网站在线观看| 免费一级欧美片在线观看| 精品一区二区在线视频| 99re热这里只有精品视频| 视频一区二区国产| 在线一区二区三区四区五区| 国产精品丝袜在线| 日韩精品久久理论片| 色婷婷av一区二区三区gif| 欧美激情一区二区三区蜜桃视频 | 成人丝袜视频网| 欧美亚洲国产一区二区三区va| 天堂午夜影视日韩欧美一区二区| 色爱区综合激月婷婷| 精品国产免费视频| 成人午夜短视频| 国产精品网曝门| 成人国产精品视频| 亚洲香蕉伊在人在线观| 中文字幕一区二区三区四区不卡 | 欧美美女激情18p| 亚洲午夜精品17c| 日本午夜一本久久久综合| 欧美色男人天堂| 国产精品久久久久国产精品日日| 亚洲一区二区欧美激情| 国产999精品久久久久久绿帽| 色综合网色综合| 风间由美性色一区二区三区| 欧美日韩免费观看一区三区| 午夜精品久久久久影视| 中文字幕成人网| 99精品欧美一区二区蜜桃免费| 欧美裸体一区二区三区| 日本不卡一区二区三区| 中文字幕乱码亚洲精品一区| 91成人在线免费观看| 国产精品理伦片| 欧美日韩精品系列| 高清av一区二区| 精品亚洲国内自在自线福利| 国产亚洲综合性久久久影院| 91.com在线观看| 精品av综合导航| 中文字幕一区二区不卡| 精品日韩在线观看| 精品成人在线观看| 欧美日韩成人在线一区| 一区二区高清视频在线观看| 懂色av一区二区三区免费看| 国产三区在线成人av| 国产精品99久久久久久有的能看| 久久日韩粉嫩一区二区三区| 亚洲天堂成人在线观看| 欧美日韩黄色一区二区| 成人av资源在线观看| 国产白丝精品91爽爽久久 | 欧美日韩aaa| 日本一区二区三区在线不卡| 在线视频国产一区| 欧美在线影院一区二区| 欧美群妇大交群的观看方式 | 中文字幕av在线一区二区三区| 日韩精品专区在线| xvideos.蜜桃一区二区| 亚洲视频一区二区在线| 日本免费新一区视频| 久久久久久日产精品| 久久一留热品黄| 午夜婷婷国产麻豆精品| 国产精品羞羞答答xxdd| 国产精品中文字幕一区二区三区| 色婷婷综合久久久久中文一区二区 | 国产欧美久久久精品影院| 成人av影视在线观看| 日本免费在线视频不卡一不卡二| 蜜臀精品一区二区三区在线观看| 国产伦精品一区二区三区免费| 欧美日韩国产乱码电影| 欧美成人精品3d动漫h| 色婷婷狠狠综合| 884aa四虎影成人精品一区| 亚洲精品亚洲人成人网| 香蕉久久夜色精品国产使用方法 | 欧美国产日本韩| 久久精品视频在线免费观看| 亚洲成av人综合在线观看| 久久国产精品无码网站| 精品一区二区三区在线播放视频 | 五月天视频一区| 欧美天天综合网| 国产综合色精品一区二区三区| 成人国产亚洲欧美成人综合网| 日韩欧美激情在线| 欧美成人三级在线| 国产日韩欧美a| 91影院在线免费观看| 亚洲午夜视频在线| 91麻豆精品国产91| 婷婷一区二区三区| 欧美自拍偷拍午夜视频| 激情五月播播久久久精品| 欧美大片在线观看一区| 成人丝袜18视频在线观看| 成人国产在线观看| 制服丝袜亚洲色图| 久久成人免费日本黄色| 亚洲最色的网站|