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

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

?? ircomm_tty.c

?? 優龍2410linux2.6.8內核源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
		self->settings.dte |= (IRCOMM_RTS|IRCOMM_DELTA_RTS);		ircomm_param_request(self, IRCOMM_DTE, TRUE);		IRDA_DEBUG(1, "%s(), FLOW_START\n", __FUNCTION__ );	}        ircomm_flow_request(self->ircomm, FLOW_START);}/* * Function ircomm_tty_chars_in_buffer (tty) * *    Indicates if there are any data in the buffer * */static int ircomm_tty_chars_in_buffer(struct tty_struct *tty){	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;	unsigned long flags;	int len = 0;	ASSERT(self != NULL, return -1;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);	spin_lock_irqsave(&self->spinlock, flags);	if (self->tx_skb)		len = self->tx_skb->len;	spin_unlock_irqrestore(&self->spinlock, flags);	return len;}static void ircomm_tty_shutdown(struct ircomm_tty_cb *self){	unsigned long flags;	ASSERT(self != NULL, return;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);	IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );	if (!test_and_clear_bit(ASYNC_B_INITIALIZED, &self->flags))		return;	ircomm_tty_detach_cable(self);	spin_lock_irqsave(&self->spinlock, flags);	del_timer(&self->watchdog_timer);		/* Free parameter buffer */	if (self->ctrl_skb) {		dev_kfree_skb(self->ctrl_skb);		self->ctrl_skb = NULL;	}	/* Free transmit buffer */	if (self->tx_skb) {		dev_kfree_skb(self->tx_skb);		self->tx_skb = NULL;	}	if (self->ircomm) {		ircomm_close(self->ircomm);		self->ircomm = NULL;	}	spin_unlock_irqrestore(&self->spinlock, flags);}/* * Function ircomm_tty_hangup (tty) * *    This routine notifies the tty driver that it should hangup the tty *    device. *  */static void ircomm_tty_hangup(struct tty_struct *tty){	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;	unsigned long	flags;	IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );	ASSERT(self != NULL, return;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);	if (!tty)		return;	/* ircomm_tty_flush_buffer(tty); */	ircomm_tty_shutdown(self);	/* I guess we need to lock here - Jean II */	spin_lock_irqsave(&self->spinlock, flags);	self->flags &= ~ASYNC_NORMAL_ACTIVE;	self->tty = NULL;	self->open_count = 0;	spin_unlock_irqrestore(&self->spinlock, flags);	wake_up_interruptible(&self->open_wait);}/* * Function ircomm_tty_send_xchar (tty, ch) * *    This routine is used to send a high-priority XON/XOFF character to *    the device. */static void ircomm_tty_send_xchar(struct tty_struct *tty, char ch){	IRDA_DEBUG(0, "%s(), not impl\n", __FUNCTION__ );}/* * Function ircomm_tty_start (tty) * *    This routine notifies the tty driver that it resume sending *    characters to the tty device.   */void ircomm_tty_start(struct tty_struct *tty){	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;	ircomm_flow_request(self->ircomm, FLOW_START);}/* * Function ircomm_tty_stop (tty) * *     This routine notifies the tty driver that it should stop outputting *     characters to the tty device.  */void ircomm_tty_stop(struct tty_struct *tty) {	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) tty->driver_data;	ASSERT(self != NULL, return;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);	ircomm_flow_request(self->ircomm, FLOW_STOP);}/* * Function ircomm_check_modem_status (self) * *    Check for any changes in the DCE's line settings. This function should *    be called whenever the dce parameter settings changes, to update the *    flow control settings and other things */void ircomm_tty_check_modem_status(struct ircomm_tty_cb *self){	struct tty_struct *tty;	int status;	IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );	ASSERT(self != NULL, return;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);	tty = self->tty;	status = self->settings.dce;	if (status & IRCOMM_DCE_DELTA_ANY) {		/*wake_up_interruptible(&self->delta_msr_wait);*/	}	if ((self->flags & ASYNC_CHECK_CD) && (status & IRCOMM_DELTA_CD)) {		IRDA_DEBUG(2, 			   "%s(), ircomm%d CD now %s...\n", __FUNCTION__ , self->line,			   (status & IRCOMM_CD) ? "on" : "off");		if (status & IRCOMM_CD) {			wake_up_interruptible(&self->open_wait);		} else {			IRDA_DEBUG(2, 				   "%s(), Doing serial hangup..\n", __FUNCTION__ );			if (tty)				tty_hangup(tty);			/* Hangup will remote the tty, so better break out */			return;		}	}	if (self->flags & ASYNC_CTS_FLOW) {		if (tty->hw_stopped) {			if (status & IRCOMM_CTS) {				IRDA_DEBUG(2, 					   "%s(), CTS tx start...\n", __FUNCTION__ );				tty->hw_stopped = 0;								/* Wake up processes blocked on open */				wake_up_interruptible(&self->open_wait);				schedule_work(&self->tqueue);				return;			}		} else {			if (!(status & IRCOMM_CTS)) {				IRDA_DEBUG(2, 					   "%s(), CTS tx stop...\n", __FUNCTION__ );				tty->hw_stopped = 1;			}		}	}}/* * Function ircomm_tty_data_indication (instance, sap, skb) * *    Handle incoming data, and deliver it to the line discipline * */static int ircomm_tty_data_indication(void *instance, void *sap,				      struct sk_buff *skb){	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);	ASSERT(skb != NULL, return -1;);	if (!self->tty) {		IRDA_DEBUG(0, "%s(), no tty!\n", __FUNCTION__ );		return 0;	}	/* 	 * If we receive data when hardware is stopped then something is wrong.	 * We try to poll the peers line settings to check if we are up todate.	 * Devices like WinCE can do this, and since they don't send any 	 * params, we can just as well declare the hardware for running.	 */	if (self->tty->hw_stopped && (self->flow == FLOW_START)) {		IRDA_DEBUG(0, "%s(), polling for line settings!\n", __FUNCTION__ );		ircomm_param_request(self, IRCOMM_POLL, TRUE);		/* We can just as well declare the hardware for running */		ircomm_tty_send_initial_parameters(self);		ircomm_tty_link_established(self);	}	/* 	 * Just give it over to the line discipline. There is no need to	 * involve the flip buffers, since we are not running in an interrupt 	 * handler	 */	self->tty->ldisc.receive_buf(self->tty, skb->data, NULL, skb->len);	/* No need to kfree_skb - see ircomm_ttp_data_indication() */	return 0;}/* * Function ircomm_tty_control_indication (instance, sap, skb) * *    Parse all incoming parameters (easy!) * */static int ircomm_tty_control_indication(void *instance, void *sap,					 struct sk_buff *skb){	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;	int clen;	IRDA_DEBUG(4, "%s()\n", __FUNCTION__ );		ASSERT(self != NULL, return -1;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return -1;);	ASSERT(skb != NULL, return -1;);	clen = skb->data[0];	irda_param_extract_all(self, skb->data+1, IRDA_MIN(skb->len-1, clen), 			       &ircomm_param_info);	/* No need to kfree_skb - see ircomm_control_indication() */	return 0;}/* * Function ircomm_tty_flow_indication (instance, sap, cmd) * *    This function is called by IrTTP when it wants us to slow down the *    transmission of data. We just mark the hardware as stopped, and wait *    for IrTTP to notify us that things are OK again. */static void ircomm_tty_flow_indication(void *instance, void *sap, 				       LOCAL_FLOW cmd){	struct ircomm_tty_cb *self = (struct ircomm_tty_cb *) instance;	struct tty_struct *tty;	ASSERT(self != NULL, return;);	ASSERT(self->magic == IRCOMM_TTY_MAGIC, return;);	tty = self->tty;	switch (cmd) {	case FLOW_START:		IRDA_DEBUG(2, "%s(), hw start!\n", __FUNCTION__ );		tty->hw_stopped = 0;		/* ircomm_tty_do_softint will take care of the rest */		schedule_work(&self->tqueue);		break;	default:  /* If we get here, something is very wrong, better stop */	case FLOW_STOP:		IRDA_DEBUG(2, "%s(), hw stopped!\n", __FUNCTION__ );		tty->hw_stopped = 1;		break;	}	self->flow = cmd;}static int ircomm_tty_line_info(struct ircomm_tty_cb *self, char *buf){        int  ret=0;	ret += sprintf(buf+ret, "State: %s\n", ircomm_tty_state[self->state]);	ret += sprintf(buf+ret, "Service type: ");	if (self->service_type & IRCOMM_9_WIRE)		ret += sprintf(buf+ret, "9_WIRE");	else if (self->service_type & IRCOMM_3_WIRE)		ret += sprintf(buf+ret, "3_WIRE");	else if (self->service_type & IRCOMM_3_WIRE_RAW)		ret += sprintf(buf+ret, "3_WIRE_RAW");	else		ret += sprintf(buf+ret, "No common service type!\n");        ret += sprintf(buf+ret, "\n");	ret += sprintf(buf+ret, "Port name: %s\n", self->settings.port_name);	ret += sprintf(buf+ret, "DTE status: ");	        if (self->settings.dte & IRCOMM_RTS)                ret += sprintf(buf+ret, "RTS|");        if (self->settings.dte & IRCOMM_DTR)                ret += sprintf(buf+ret, "DTR|");	if (self->settings.dte)		ret--; /* remove the last | */        ret += sprintf(buf+ret, "\n");	ret += sprintf(buf+ret, "DCE status: ");        if (self->settings.dce & IRCOMM_CTS)                ret += sprintf(buf+ret, "CTS|");        if (self->settings.dce & IRCOMM_DSR)                ret += sprintf(buf+ret, "DSR|");        if (self->settings.dce & IRCOMM_CD)                ret += sprintf(buf+ret, "CD|");        if (self->settings.dce & IRCOMM_RI)                 ret += sprintf(buf+ret, "RI|");	if (self->settings.dce)		ret--; /* remove the last | */        ret += sprintf(buf+ret, "\n");	ret += sprintf(buf+ret, "Configuration: ");	if (!self->settings.null_modem)		ret += sprintf(buf+ret, "DTE <-> DCE\n");	else		ret += sprintf(buf+ret, 			       "DTE <-> DTE (null modem emulation)\n");	ret += sprintf(buf+ret, "Data rate: %d\n", self->settings.data_rate);	ret += sprintf(buf+ret, "Flow control: ");	if (self->settings.flow_control & IRCOMM_XON_XOFF_IN)		ret += sprintf(buf+ret, "XON_XOFF_IN|");	if (self->settings.flow_control & IRCOMM_XON_XOFF_OUT)		ret += sprintf(buf+ret, "XON_XOFF_OUT|");	if (self->settings.flow_control & IRCOMM_RTS_CTS_IN)		ret += sprintf(buf+ret, "RTS_CTS_IN|");	if (self->settings.flow_control & IRCOMM_RTS_CTS_OUT)		ret += sprintf(buf+ret, "RTS_CTS_OUT|");	if (self->settings.flow_control & IRCOMM_DSR_DTR_IN)		ret += sprintf(buf+ret, "DSR_DTR_IN|");	if (self->settings.flow_control & IRCOMM_DSR_DTR_OUT)		ret += sprintf(buf+ret, "DSR_DTR_OUT|");	if (self->settings.flow_control & IRCOMM_ENQ_ACK_IN)		ret += sprintf(buf+ret, "ENQ_ACK_IN|");	if (self->settings.flow_control & IRCOMM_ENQ_ACK_OUT)		ret += sprintf(buf+ret, "ENQ_ACK_OUT|");	if (self->settings.flow_control)		ret--; /* remove the last | */        ret += sprintf(buf+ret, "\n");	ret += sprintf(buf+ret, "Flags: ");	if (self->flags & ASYNC_CTS_FLOW)		ret += sprintf(buf+ret, "ASYNC_CTS_FLOW|");	if (self->flags & ASYNC_CHECK_CD)		ret += sprintf(buf+ret, "ASYNC_CHECK_CD|");	if (self->flags & ASYNC_INITIALIZED)		ret += sprintf(buf+ret, "ASYNC_INITIALIZED|");	if (self->flags & ASYNC_LOW_LATENCY)		ret += sprintf(buf+ret, "ASYNC_LOW_LATENCY|");	if (self->flags & ASYNC_CLOSING)		ret += sprintf(buf+ret, "ASYNC_CLOSING|");	if (self->flags & ASYNC_NORMAL_ACTIVE)		ret += sprintf(buf+ret, "ASYNC_NORMAL_ACTIVE|");	if (self->flags)		ret--; /* remove the last | */	ret += sprintf(buf+ret, "\n");	ret += sprintf(buf+ret, "Role: %s\n", self->client ? 		       "client" : "server");	ret += sprintf(buf+ret, "Open count: %d\n", self->open_count);	ret += sprintf(buf+ret, "Max data size: %d\n", self->max_data_size);	ret += sprintf(buf+ret, "Max header size: %d\n", self->max_header_size);			if (self->tty)		ret += sprintf(buf+ret, "Hardware: %s\n", 			       self->tty->hw_stopped ? "Stopped" : "Running");        ret += sprintf(buf+ret, "\n");        return ret;}/* * Function ircomm_tty_read_proc (buf, start, offset, len, eof, unused) * *     * */#ifdef CONFIG_PROC_FSstatic int ircomm_tty_read_proc(char *buf, char **start, off_t offset, int len,				int *eof, void *unused){	struct ircomm_tty_cb *self;        int count = 0, l;        off_t begin = 0;	unsigned long flags;	spin_lock_irqsave(&ircomm_tty->hb_spinlock, flags);	self = (struct ircomm_tty_cb *) hashbin_get_first(ircomm_tty);	while ((self != NULL) && (count < 4000)) {		if (self->magic != IRCOMM_TTY_MAGIC)			break;                l = ircomm_tty_line_info(self, buf + count);                count += l;                if (count+begin > offset+len)                        goto done;                if (count+begin < offset) {                        begin += count;                        count = 0;                }						self = (struct ircomm_tty_cb *) hashbin_get_next(ircomm_tty);        }        *eof = 1;done:	spin_unlock_irqrestore(&ircomm_tty->hb_spinlock, flags);        if (offset >= count+begin)                return 0;        *start = buf + (offset-begin);        return ((len < begin+count-offset) ? len : begin+count-offset);}#endif /* CONFIG_PROC_FS */MODULE_AUTHOR("Dag Brattli <dagb@cs.uit.no>");MODULE_DESCRIPTION("IrCOMM serial TTY driver");MODULE_LICENSE("GPL");MODULE_ALIAS_CHARDEV_MAJOR(IRCOMM_TTY_MAJOR);module_init(ircomm_tty_init);module_exit(ircomm_tty_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区四区五区中文 | 91久久精品国产91性色tv| 色偷偷久久人人79超碰人人澡| 91精品国产综合久久久蜜臀图片| 国产日产欧美精品一区二区三区| 日本欧美一区二区在线观看| 在线观看日韩电影| 国产亚洲美州欧州综合国| 免费欧美在线视频| 欧美片在线播放| 一区二区三区在线观看视频| 成人少妇影院yyyy| 久久你懂得1024| 美日韩一区二区三区| 欧美日韩一区二区在线观看| 亚洲激情成人在线| 91在线porny国产在线看| 国产日韩视频一区二区三区| 激情六月婷婷综合| 欧美电影免费观看高清完整版在线观看| 亚洲一区二区三区免费视频| 在线视频你懂得一区| 综合自拍亚洲综合图不卡区| 国产福利精品一区二区| 337p粉嫩大胆噜噜噜噜噜91av| 另类的小说在线视频另类成人小视频在线| 91麻豆精品视频| 亚洲免费av高清| 色婷婷精品大在线视频| 亚洲精品视频在线| 在线观看亚洲a| 亚洲bdsm女犯bdsm网站| 欧美久久久影院| 久久不见久久见中文字幕免费| 欧美成人女星排行榜| 国产在线精品一区二区三区不卡| 国产亚洲1区2区3区| 成人午夜视频福利| 亚洲欧洲日韩av| 色婷婷国产精品| 日韩国产高清影视| 精品国产乱码久久久久久闺蜜| 国产综合色在线| 中文字幕av一区二区三区高 | 欧美一区二区三区免费在线看 | 欧美一区二区成人6969| 日韩av一区二区在线影视| 日韩午夜电影av| 国产综合色产在线精品| 国产精品狼人久久影院观看方式| 99国内精品久久| 亚洲aaa精品| 久久精品亚洲精品国产欧美| 99综合电影在线视频| 视频在线观看91| 精品电影一区二区| 97久久人人超碰| 麻豆精品在线观看| 国产精品激情偷乱一区二区∴| 在线观看免费视频综合| 久久er99热精品一区二区| 国产精品久久三区| 欧美一卡二卡在线观看| 欧美少妇性性性| av福利精品导航| 夜色激情一区二区| 欧美tickling挠脚心丨vk| 成人av免费在线| 人人精品人人爱| 国产精品美女久久久久久久久| 欧美精品久久一区二区三区| 国产99久久久国产精品潘金| 午夜伦理一区二区| 中文字幕综合网| 日韩一二在线观看| 色婷婷国产精品综合在线观看| 黑人精品欧美一区二区蜜桃| 一区二区三区在线播| 日本一区二区三区视频视频| 777a∨成人精品桃花网| 成人黄页毛片网站| 国产一区在线不卡| 人禽交欧美网站| 亚洲一区av在线| 亚洲欧美视频在线观看视频| 国产日韩欧美a| 国产裸体歌舞团一区二区| 久久99精品久久只有精品| 国产精品无遮挡| 日韩欧美国产一区二区在线播放| 99久久99久久免费精品蜜臀| 国产一区欧美日韩| 蜜桃久久精品一区二区| 亚洲国产精品久久久男人的天堂| 亚洲欧洲中文日韩久久av乱码| 国产欧美一区二区精品性| 日韩欧美一级在线播放| 制服丝袜亚洲网站| 欧美另类变人与禽xxxxx| 粉嫩嫩av羞羞动漫久久久| 国产一区二区三区精品视频| 亚洲v中文字幕| 亚洲欧洲在线观看av| 国产女主播一区| 久久久久久久久久久久电影| 日韩精品一区二区三区蜜臀| 6080日韩午夜伦伦午夜伦| 精品视频1区2区| 欧美日韩精品欧美日韩精品一综合| 97se亚洲国产综合自在线 | 欧美综合视频在线观看| 91啪九色porn原创视频在线观看| 岛国av在线一区| 成人动漫av在线| 一本到三区不卡视频| 色综合久久综合网欧美综合网| 99精品国产91久久久久久 | 一区二区三区.www| 国产精品久久三| 中文天堂在线一区| 国产精品午夜久久| 亚洲色图20p| 亚洲在线视频一区| 偷拍日韩校园综合在线| 免费高清在线一区| 国产电影一区在线| 99久久精品国产毛片| 欧美影视一区在线| 日韩一级成人av| 久久日韩粉嫩一区二区三区| 国产精品久久久久影院亚瑟| 亚洲精品一卡二卡| 日韩国产高清影视| 国产一区二区不卡老阿姨| www.视频一区| 欧美日韩和欧美的一区二区| 日韩欧美一卡二卡| 中文字幕欧美日韩一区| 亚洲丰满少妇videoshd| 久久精品国产亚洲高清剧情介绍 | 久久久亚洲精品一区二区三区| 国产精品激情偷乱一区二区∴| 亚洲精选视频在线| 日本亚洲免费观看| 成人国产亚洲欧美成人综合网| 在线免费观看成人短视频| 日韩精品一区二区三区在线| 亚洲丝袜精品丝袜在线| 免费看精品久久片| 懂色av一区二区夜夜嗨| 欧美日韩免费观看一区三区| 久久综合色播五月| 亚洲一区二区三区视频在线播放| 久久成人羞羞网站| 欧美亚洲一区三区| 国产日韩视频一区二区三区| 午夜私人影院久久久久| 成人av电影观看| 精品国产一区二区三区久久影院| 亚洲视频你懂的| 国产精品一线二线三线精华| 欧美唯美清纯偷拍| 中文字幕一区二区三| 精品写真视频在线观看| 欧美在线制服丝袜| 国产精品美日韩| 国产九色sp调教91| 91精品国产91综合久久蜜臀| 一区二区在线观看免费| 粉嫩高潮美女一区二区三区| 日韩视频免费观看高清完整版 | 久久激情综合网| 欧美视频第二页| 亚洲蜜臀av乱码久久精品蜜桃| 国产又黄又大久久| 欧美日高清视频| 日韩美女视频一区| 成人爱爱电影网址| 中文字幕精品三区| 国产成人aaa| 国产欧美视频在线观看| 狠狠v欧美v日韩v亚洲ⅴ| 日韩一区二区在线免费观看| 性做久久久久久免费观看欧美| 波多野结衣的一区二区三区| 久久先锋资源网| 激情图片小说一区| 日韩精品资源二区在线| 日本系列欧美系列| 91精品国产综合久久婷婷香蕉| 亚洲午夜精品网| 91蜜桃传媒精品久久久一区二区| 国产精品天美传媒| 国产99一区视频免费| 国产亚洲一区二区三区在线观看| 久久电影网站中文字幕| 精品剧情在线观看| 国产一二三精品| 久久久精品黄色| www.在线欧美|