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

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

?? usbatm.c

?? 底層驅動開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
	clear_bit(ATM_VF_READY, &vcc->flags);	clear_bit(ATM_VF_PARTIAL, &vcc->flags);	clear_bit(ATM_VF_ADDR, &vcc->flags);	up(&instance->serialize);	atm_dbg(instance, "%s successful\n", __func__);}static int usbatm_atm_ioctl(struct atm_dev *dev, unsigned int cmd,			  void __user * arg){	switch (cmd) {	case ATM_QUERYLOOP:		return put_user(ATM_LM_NONE, (int __user *)arg) ? -EFAULT : 0;	default:		return -ENOIOCTLCMD;	}}static int usbatm_atm_init(struct usbatm_data *instance){	struct atm_dev *atm_dev;	int ret, i;	/* ATM init */	atm_dev = atm_dev_register(instance->driver_name, &usbatm_atm_devops, -1, NULL);	if (!atm_dev) {		usb_dbg(instance, "%s: failed to register ATM device!\n", __func__);		return -1;	}	instance->atm_dev = atm_dev;	atm_dev->ci_range.vpi_bits = ATM_CI_MAX;	atm_dev->ci_range.vci_bits = ATM_CI_MAX;	atm_dev->signal = ATM_PHY_SIG_UNKNOWN;	/* temp init ATM device, set to 128kbit */	atm_dev->link_rate = 128 * 1000 / 424;	if (instance->driver->atm_start && ((ret = instance->driver->atm_start(instance, atm_dev)) < 0)) {		atm_dbg(instance, "%s: atm_start failed: %d!\n", __func__, ret);		goto fail;	}	/* ready for ATM callbacks */	usbatm_get_instance(instance);	/* dropped in usbatm_atm_dev_close */	mb();	atm_dev->dev_data = instance;	/* submit all rx URBs */	for (i = 0; i < num_rcv_urbs; i++)		usbatm_submit_urb(instance->urbs[i]);	return 0; fail:	instance->atm_dev = NULL;	shutdown_atm_dev(atm_dev); /* usbatm_atm_dev_close will eventually be called */	return ret;}/************  USB  ************/static int usbatm_do_heavy_init(void *arg){	struct usbatm_data *instance = arg;	int ret;	daemonize(instance->driver->driver_name);	allow_signal(SIGTERM);	complete(&instance->thread_started);	ret = instance->driver->heavy_init(instance, instance->usb_intf);	if (!ret)		ret = usbatm_atm_init(instance);	down(&instance->serialize);	instance->thread_pid = -1;	up(&instance->serialize);	complete_and_exit(&instance->thread_exited, ret);}static int usbatm_heavy_init(struct usbatm_data *instance){	int ret = kernel_thread(usbatm_do_heavy_init, instance, CLONE_KERNEL);	if (ret < 0) {		usb_dbg(instance, "%s: failed to create kernel_thread (%d)!\n", __func__, ret);		return ret;	}	down(&instance->serialize);	instance->thread_pid = ret;	up(&instance->serialize);	wait_for_completion(&instance->thread_started);	return 0;}static void usbatm_tasklet_schedule(unsigned long data){	tasklet_schedule((struct tasklet_struct *) data);}static inline void usbatm_init_channel(struct usbatm_channel *channel){	spin_lock_init(&channel->lock);	INIT_LIST_HEAD(&channel->list);	channel->delay.function = usbatm_tasklet_schedule;	channel->delay.data = (unsigned long) &channel->tasklet;	init_timer(&channel->delay);}int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,		     struct usbatm_driver *driver){	struct device *dev = &intf->dev;	struct usb_device *usb_dev = interface_to_usbdev(intf);	struct usbatm_data *instance;	char *buf;	int error = -ENOMEM;	int i, length;	int need_heavy;	dev_dbg(dev, "%s: trying driver %s with vendor=0x%x, product=0x%x, ifnum %d\n",			__func__, driver->driver_name,			le16_to_cpu(usb_dev->descriptor.idVendor),			le16_to_cpu(usb_dev->descriptor.idProduct),			intf->altsetting->desc.bInterfaceNumber);	/* instance init */	instance = kzalloc(sizeof(*instance) + sizeof(struct urb *) * (num_rcv_urbs + num_snd_urbs), GFP_KERNEL);	if (!instance) {		dev_dbg(dev, "%s: no memory for instance data!\n", __func__);		return -ENOMEM;	}	/* public fields */	instance->driver = driver;	snprintf(instance->driver_name, sizeof(instance->driver_name), driver->driver_name);	instance->usb_dev = usb_dev;	instance->usb_intf = intf;	buf = instance->description;	length = sizeof(instance->description);	if ((i = usb_string(usb_dev, usb_dev->descriptor.iProduct, buf, length)) < 0)		goto bind;	buf += i;	length -= i;	i = scnprintf(buf, length, " (");	buf += i;	length -= i;	if (length <= 0 || (i = usb_make_path(usb_dev, buf, length)) < 0)		goto bind;	buf += i;	length -= i;	snprintf(buf, length, ")"); bind:	need_heavy = 1;	if (driver->bind && (error = driver->bind(instance, intf, id, &need_heavy)) < 0) {			dev_dbg(dev, "%s: bind failed: %d!\n", __func__, error);			goto fail_free;	}	/* private fields */	kref_init(&instance->refcount);		/* dropped in usbatm_usb_disconnect */	init_MUTEX(&instance->serialize);	instance->thread_pid = -1;	init_completion(&instance->thread_started);	init_completion(&instance->thread_exited);	INIT_LIST_HEAD(&instance->vcc_list);	usbatm_init_channel(&instance->rx_channel);	usbatm_init_channel(&instance->tx_channel);	tasklet_init(&instance->rx_channel.tasklet, usbatm_rx_process, (unsigned long)instance);	tasklet_init(&instance->tx_channel.tasklet, usbatm_tx_process, (unsigned long)instance);	instance->rx_channel.endpoint = usb_rcvbulkpipe(usb_dev, driver->in);	instance->tx_channel.endpoint = usb_sndbulkpipe(usb_dev, driver->out);	instance->rx_channel.stride = ATM_CELL_SIZE + driver->rx_padding;	instance->tx_channel.stride = ATM_CELL_SIZE + driver->tx_padding;	instance->rx_channel.buf_size = rcv_buf_size * instance->rx_channel.stride;	instance->tx_channel.buf_size = snd_buf_size * instance->tx_channel.stride;	instance->rx_channel.usbatm = instance->tx_channel.usbatm = instance;	skb_queue_head_init(&instance->sndqueue);	for (i = 0; i < num_rcv_urbs + num_snd_urbs; i++) {		struct urb *urb;		u8 *buffer;		unsigned int iso_packets = 0, iso_size = 0;		struct usbatm_channel *channel = i < num_rcv_urbs ?			&instance->rx_channel : &instance->tx_channel;		if (usb_pipeisoc(channel->endpoint)) {			/* don't expect iso out endpoints */			iso_size = usb_maxpacket(instance->usb_dev, channel->endpoint, 0);			iso_size -= iso_size % channel->stride;	/* alignment */			BUG_ON(!iso_size);			iso_packets = (channel->buf_size - 1) / iso_size + 1;		}		urb = usb_alloc_urb(iso_packets, GFP_KERNEL);		if (!urb) {			dev_dbg(dev, "%s: no memory for urb %d!\n", __func__, i);			goto fail_unbind;		}		instance->urbs[i] = urb;		buffer = kmalloc(channel->buf_size, GFP_KERNEL);		if (!buffer) {			dev_dbg(dev, "%s: no memory for buffer %d!\n", __func__, i);			goto fail_unbind;		}		memset(buffer, 0, channel->buf_size);		usb_fill_bulk_urb(urb, instance->usb_dev, channel->endpoint,				  buffer, channel->buf_size, usbatm_complete, channel);		if (iso_packets) {			int j;			urb->interval = 1;			urb->transfer_flags = URB_ISO_ASAP;			urb->number_of_packets = iso_packets;			for (j = 0; j < iso_packets; j++) {				urb->iso_frame_desc[j].offset = iso_size * j;				urb->iso_frame_desc[j].length = min_t(int, iso_size,								      channel->buf_size - urb->iso_frame_desc[j].offset);			}		}		/* put all tx URBs on the list of spares */		if (i >= num_rcv_urbs)			list_add_tail(&urb->urb_list, &channel->list);		vdbg("%s: alloced buffer 0x%p buf size %u urb 0x%p",		     __func__, urb->transfer_buffer, urb->transfer_buffer_length, urb);	}	if (need_heavy && driver->heavy_init) {		error = usbatm_heavy_init(instance);	} else {		complete(&instance->thread_exited);	/* pretend that heavy_init was run */		error = usbatm_atm_init(instance);	}	if (error < 0)		goto fail_unbind;	usb_get_dev(usb_dev);	usb_set_intfdata(intf, instance);	return 0; fail_unbind:	if (instance->driver->unbind)		instance->driver->unbind(instance, intf); fail_free:	for (i = 0; i < num_rcv_urbs + num_snd_urbs; i++) {		if (instance->urbs[i])			kfree(instance->urbs[i]->transfer_buffer);		usb_free_urb(instance->urbs[i]);	}	kfree (instance);	return error;}EXPORT_SYMBOL_GPL(usbatm_usb_probe);void usbatm_usb_disconnect(struct usb_interface *intf){	struct device *dev = &intf->dev;	struct usbatm_data *instance = usb_get_intfdata(intf);	int i;	dev_dbg(dev, "%s entered\n", __func__);	if (!instance) {		dev_dbg(dev, "%s: NULL instance!\n", __func__);		return;	}	usb_set_intfdata(intf, NULL);	down(&instance->serialize);	if (instance->thread_pid >= 0)		kill_proc(instance->thread_pid, SIGTERM, 1);	up(&instance->serialize);	wait_for_completion(&instance->thread_exited);	tasklet_disable(&instance->rx_channel.tasklet);	tasklet_disable(&instance->tx_channel.tasklet);	for (i = 0; i < num_rcv_urbs + num_snd_urbs; i++)		usb_kill_urb(instance->urbs[i]);	del_timer_sync(&instance->rx_channel.delay);	del_timer_sync(&instance->tx_channel.delay);	if (instance->atm_dev && instance->driver->atm_stop)		instance->driver->atm_stop(instance, instance->atm_dev);	if (instance->driver->unbind)		instance->driver->unbind(instance, intf);	instance->driver_data = NULL;	/* turn usbatm_[rt]x_process into noop */	/* no need to take the spinlock */	INIT_LIST_HEAD(&instance->rx_channel.list);	INIT_LIST_HEAD(&instance->tx_channel.list);	tasklet_enable(&instance->rx_channel.tasklet);	tasklet_enable(&instance->tx_channel.tasklet);	for (i = 0; i < num_rcv_urbs + num_snd_urbs; i++) {		kfree(instance->urbs[i]->transfer_buffer);		usb_free_urb(instance->urbs[i]);	}	/* ATM finalize */	if (instance->atm_dev)		shutdown_atm_dev(instance->atm_dev);	usbatm_put_instance(instance);	/* taken in usbatm_usb_probe */}EXPORT_SYMBOL_GPL(usbatm_usb_disconnect);/*************  init  *************/static int __init usbatm_usb_init(void){	dbg("%s: driver version %s", __func__, DRIVER_VERSION);	if (sizeof(struct usbatm_control) > sizeof(((struct sk_buff *) 0)->cb)) {		printk(KERN_ERR "%s unusable with this kernel!\n", usbatm_driver_name);		return -EIO;	}	if ((num_rcv_urbs > UDSL_MAX_RCV_URBS)	    || (num_snd_urbs > UDSL_MAX_SND_URBS)	    || (rcv_buf_size < 1)	    || (rcv_buf_size > UDSL_MAX_RCV_BUF_SIZE)	    || (snd_buf_size < 1)	    || (snd_buf_size > UDSL_MAX_SND_BUF_SIZE))		return -EINVAL;	return 0;}module_init(usbatm_usb_init);static void __exit usbatm_usb_exit(void){	dbg("%s", __func__);}module_exit(usbatm_usb_exit);MODULE_AUTHOR(DRIVER_AUTHOR);MODULE_DESCRIPTION(DRIVER_DESC);MODULE_LICENSE("GPL");MODULE_VERSION(DRIVER_VERSION);/**************  debug  **************/#ifdef VERBOSE_DEBUGstatic int usbatm_print_packet(const unsigned char *data, int len){	unsigned char buffer[256];	int i = 0, j = 0;	for (i = 0; i < len;) {		buffer[0] = '\0';		sprintf(buffer, "%.3d :", i);		for (j = 0; (j < 16) && (i < len); j++, i++) {			sprintf(buffer, "%s %2.2x", buffer, data[i]);		}		dbg("%s", buffer);	}	return i;}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色偷偷久久一区二区三区| 国产成人丝袜美腿| 午夜av区久久| 国产精品一品二品| 欧美精品色综合| 国产精品青草综合久久久久99| 亚洲一区在线视频观看| 国产高清精品在线| 欧美精品久久天天躁| 国产成a人无v码亚洲福利| 欧美性一级生活| 中文字幕高清一区| 久久99久久久欧美国产| 欧美精品日韩精品| 亚洲风情在线资源站| 波多野结衣亚洲一区| 久久精品视频在线看| 精品一二线国产| 91精品国产综合久久精品app | 91麻豆自制传媒国产之光| 精品国产欧美一区二区| 天堂va蜜桃一区二区三区漫画版| 91网上在线视频| 日本一区二区三区四区| 国v精品久久久网| 国产色产综合色产在线视频| 激情图片小说一区| 精品福利一区二区三区免费视频| 免费在线欧美视频| 欧美一级夜夜爽| 三级精品在线观看| 欧美一区二区三区四区五区| 香港成人在线视频| 欧美一区二区三区四区视频| 日韩中文字幕1| 欧美一区二区三区在线电影| 免费在线观看精品| 26uuu国产一区二区三区| 国产麻豆精品在线观看| 国产亚洲综合色| a级精品国产片在线观看| 亚洲欧美精品午睡沙发| 欧洲国内综合视频| 日本一区中文字幕| 欧美白人最猛性xxxxx69交| 国产精品小仙女| 亚洲欧美在线视频| 欧美日精品一区视频| 麻豆91免费看| 国产精品美女久久久久久久久 | 日韩欧美激情在线| 精品写真视频在线观看| 国产欧美va欧美不卡在线| 丁香婷婷综合网| 亚洲一区二区偷拍精品| 精品久久久久久久久久久院品网 | 日韩欧美国产一二三区| 国产一区二区三区在线看麻豆| 国产亚洲成av人在线观看导航| 99re视频精品| 热久久久久久久| 国产精品美女www爽爽爽| 久久久精品综合| 国产三区在线成人av| 丁香另类激情小说| 午夜精品视频在线观看| 久久蜜臀精品av| 欧美少妇bbb| 国产一区二区电影| 亚洲电影激情视频网站| 国产蜜臀av在线一区二区三区| 欧美三级日本三级少妇99| 国内精品国产成人| 亚洲国产精品久久人人爱| 久久午夜国产精品| 精品视频123区在线观看| 国产成人精品免费| 秋霞电影一区二区| 亚洲区小说区图片区qvod| 2021国产精品久久精品| 欧美日韩国产精品成人| 成人精品国产福利| 美女免费视频一区二区| 亚洲国产日韩综合久久精品| 亚洲国产精品黑人久久久| 欧美老女人在线| 色综合久久久久综合体桃花网| 精品一区二区免费看| 天天综合色天天综合| 亚洲人一二三区| 日本三级亚洲精品| 午夜国产精品一区| 中文字幕精品综合| 日韩欧美国产综合一区| 欧美性极品少妇| 99re这里只有精品6| 国产不卡在线视频| 久久99精品一区二区三区| 日韩不卡一区二区| 亚洲一级二级三级| 亚洲欧美偷拍卡通变态| 国产精品三级av在线播放| 精品福利一二区| 精品国产一区二区在线观看| 欧美一区永久视频免费观看| 欧美日韩精品一区二区天天拍小说 | 久久亚洲免费视频| 欧美成人高清电影在线| 日韩手机在线导航| 日韩一区二区在线免费观看| 欧美精品久久一区二区三区| 91麻豆免费观看| 色播五月激情综合网| 在线免费观看视频一区| 在线观看91视频| 欧美综合亚洲图片综合区| 在线观看日韩电影| 欧美片网站yy| 欧美一区二区大片| 欧美一区二区免费视频| 日韩一区二区免费在线观看| 欧美一级午夜免费电影| 欧美本精品男人aⅴ天堂| 2014亚洲片线观看视频免费| 久久免费精品国产久精品久久久久| 欧美成人三级在线| 亚洲国产成人午夜在线一区| 国产精品久久久久久久久免费相片| 亚洲欧洲99久久| 亚洲亚洲人成综合网络| 蜜臀av性久久久久蜜臀aⅴ| 免费在线看成人av| 国产福利一区在线观看| 91丨porny丨户外露出| 欧美伊人久久大香线蕉综合69| 欧美日韩免费电影| 精品99一区二区三区| 中文字幕一区二区日韩精品绯色| 欧美伊人久久久久久久久影院 | 丁香一区二区三区| 岛国av在线一区| 色欧美乱欧美15图片| 欧美三级电影网| 精品日韩av一区二区| 国产精品色呦呦| 亚洲国产cao| 国产综合成人久久大片91| 成人午夜电影久久影院| 欧美午夜精品一区二区三区| 欧美一区二区三区在线观看| 国产精品你懂的在线欣赏| 亚洲制服丝袜av| 国产一区二区调教| 欧美色综合网站| 国产精品毛片久久久久久久| 午夜精品久久久久久久99樱桃| 国产精品一区二区在线观看网站| 91猫先生在线| 国产日韩视频一区二区三区| 一区二区三区国产精华| 国产美女娇喘av呻吟久久| 欧美三级韩国三级日本一级| 美女久久久精品| 久久激情五月婷婷| 成人h版在线观看| 91精品国产综合久久蜜臀| 国产精品久久久久一区二区三区 | 亚洲国产电影在线观看| 日韩专区一卡二卡| 91在线播放网址| 久久在线观看免费| 日本成人超碰在线观看| 欧美影院午夜播放| 国产精品国产三级国产| 黑人巨大精品欧美黑白配亚洲| 欧美色图免费看| 亚洲视频小说图片| 成人黄色777网| 久久久久国色av免费看影院| 日本不卡高清视频| 欧美三级韩国三级日本三斤| **性色生活片久久毛片| 国产成人午夜视频| 欧美精品一区二区三区蜜桃| 午夜电影久久久| 欧美日韩卡一卡二| 亚洲精品乱码久久久久| 国产a级毛片一区| 欧美精品一区二| 久久se这里有精品| 欧美不卡123| 免费人成黄页网站在线一区二区| 欧美最猛性xxxxx直播| 一区二区三区在线视频播放| 成人激情综合网站| 国产精品情趣视频| 91蜜桃网址入口| 亚洲精品免费播放| 欧美性猛片aaaaaaa做受| 亚洲电影在线免费观看|