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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? mxpcdrv.c

?? isa總線設(shè)備
?? C
?? 第 1 頁(yè) / 共 5 頁(yè)
字號(hào):
		MX_MOD_INC;	if ( (line < 0) || (line > MXPCDRV_PORTS) )	    return(-ENODEV);	info = mxvar_table + line;	if ( !info->base )	    return(-ENODEV);	tty->driver_data = info;	info->tty = tty;	if ( !mxvar_tmp_buf ) {	    page = GET_FPAGE(GFP_KERNEL);	    if ( !page )		return(-ENOMEM);	    if ( mxvar_tmp_buf )		free_page(page);	    else		mxvar_tmp_buf = (unsigned char *)page;	}	/*	 * Start up serial port	 */	info->count++;	retval = mxpcdrv_startup(info);	if ( retval )	    return(retval);	retval = mxpcdrv_block_til_ready(tty, filp, info);	if ( retval )	    return(retval);	if ( (info->count == 1) && (info->flags & ASYNC_SPLIT_TERMIOS) ) {	    if ( MX_TTY_DRV(subtype) == SERIAL_TYPE_NORMAL )		*tty->termios = info->normal_termios;	    else		*tty->termios = info->callout_termios;	    mxpcdrv_change_speed(info, 0);	}	info->session = MX_SESSION();	info->pgrp = MX_CGRP();#ifdef TTY_DONT_FLIP	clear_bit(TTY_DONT_FLIP, &tty->flags);#endif/* unmark here for very high baud rate (ex. 921600 bps) used*/#if (LINUX_VERSION_CODE >= VERSION_CODE(2,1,0))	tty->low_latency = 1;#endif	return(0);}/* * This routine is called when the serial port gets closed.  First, we * wait for the last remaining data to be sent.  Then, we unlink its * async structure from the interrupt chain if necessary, and we free * that IRQ if nothing is left in the chain. */static void mxpcdrv_close(struct tty_struct * tty, struct file * filp){	struct mxpcdrv_struct * info = (struct mxpcdrv_struct *)tty->driver_data;#if (LINUX_VERSION_CODE > VERSION_CODE(2,6,9))	struct tty_ldisc *ld;#endif	unsigned long	timeout;	MX_LOCK_INIT();	if ( PORTNO(tty) == MXPCDRV_PORTS )	    return;	if ( !info ){			MX_MOD_DEC;	    return;	}	MX_LOCK(&info->slock);	if ( tty_hung_up_p(filp) ) {	    MX_UNLOCK(&info->slock);	    MX_MOD_DEC;	    return;	}#ifndef SP1	if ( (tty->count == 1) && (info->count != 1) ) {#else#if (LINUX_VERSION_CODE < VERSION_CODE(2,4,21))	if ( (tty->count == 1) && (info->count != 1) ) {#else	if ((atomic_read(&tty->count) == 1) && (info->count != 1)) {#endif#endif	    /*	     * Uh, oh.	tty->count is 1, which means that the tty	     * structure will be freed.  Info->count should always	     * be one in these conditions.  If it's greater than	     * one, we've got real problems, since it means the	     * serial port won't be shutdown.	     */	    printk("mxpcdrv_close: bad serial port count; tty->count is 1, "		   "info->count is %d\n", info->count);	    info->count = 1;	}	if ( --info->count < 0 ) {	    printk("mxpcdrv_close: bad serial port count for ttys%d: %d\n",		   info->port, info->count);	    info->count = 0;	}	if ( info->count ) {	    MX_UNLOCK(&info->slock);	    MX_MOD_DEC;	    return;	}	info->flags |= ASYNC_CLOSING;	MX_UNLOCK(&info->slock);	// add by Victor Yu. 09-26-2002	/*	 * Save the termios structure, since this port may have	 * separate termios for callout and dialin.	 */	if ( info->flags & ASYNC_NORMAL_ACTIVE )	    info->normal_termios = *tty->termios;	if ( info->flags & ASYNC_CALLOUT_ACTIVE )	    info->callout_termios = *tty->termios;	/*	 * Now we wait for the transmit buffer to clear; and we notify	 * the line discipline to only process XON/XOFF characters.	 */	tty->closing = 1;	if ( info->closing_wait != ASYNC_CLOSING_WAIT_NONE )	    tty_wait_until_sent(tty, info->closing_wait);	/*	 * At this point we stop accepting input.  To do this, we	 * disable the receive line status interrupts, and tell the	 * interrupt driver to stop checking the data ready bit in the	 * line status register.	 */	info->IER &= ~UART_IER_RLSI;	if ( info->IsMoxaMustChipFlag )		info->IER &= ~MOXA_MUST_RECV_ISR;/* by William	info->read_status_mask &= ~UART_LSR_DR;*/	if ( info->flags & ASYNC_INITIALIZED ) {	    outb(info->IER, info->base + UART_IER);	    /*	     * Before we drop DTR, make sure the UART transmitter	     * has completely drained; this is especially	     * important if there is a transmit FIFO!	     */	    timeout = jiffies + HZ;	    while ( !(inb(info->base + UART_LSR) & UART_LSR_TEMT) ) {#if (LINUX_VERSION_CODE >= VERSION_CODE(2,3,0))				set_current_state(TASK_INTERRUPTIBLE);#else				current->state = TASK_INTERRUPTIBLE;#endif		schedule_timeout(5);		if ( time_after(jiffies, timeout) )		    break;	    }	}	mxpcdrv_shutdown(info);	// following add by Victor Yu. 09-23-2002	/*	if ( info->IsMoxaMustChipFlag )		SET_MOXA_MUST_NO_SOFTWARE_FLOW_CONTROL(info->base);	*/	// above add by Victor Yu. 09-23-2002	if ( MX_TTY_DRV(flush_buffer) )	    MX_TTY_DRV(flush_buffer)(tty);	    #if (LINUX_VERSION_CODE < VERSION_CODE(2,6,10))	if ( tty->ldisc.flush_buffer )	    tty->ldisc.flush_buffer(tty);#else    	ld = tty_ldisc_ref(tty);	if (ld) {		if(ld->flush_buffer)			ld->flush_buffer(tty);		tty_ldisc_deref(ld);	}#endif	tty->closing = 0;	info->event = 0;	info->tty = 0;	if ( info->blocked_open ) {	    if ( info->close_delay ) {#if (LINUX_VERSION_CODE >= VERSION_CODE(2,3,0))				set_current_state(TASK_INTERRUPTIBLE);#else				current->state = TASK_INTERRUPTIBLE;#endif		schedule_timeout(info->close_delay);	    }	    wake_up_interruptible(&info->open_wait);	}	info->flags &= ~(ASYNC_NORMAL_ACTIVE | ASYNC_CALLOUT_ACTIVE |			 ASYNC_CLOSING);	wake_up_interruptible(&info->close_wait);//	MX_UNLOCK(&info->slock);	// mask by Vicror Yu. 09-26-2002	MX_MOD_DEC;}#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,10))static int mxpcdrv_write(struct tty_struct * tty, int from_user,		       const unsigned char * buf, int count)#elsestatic int mxpcdrv_write(struct tty_struct * tty, 		       const unsigned char * buf, int count)#endif{	int		c, total = 0;	struct mxpcdrv_struct *info = (struct mxpcdrv_struct *)tty->driver_data;	MX_LOCK_INIT();	if ( !tty || !info->xmit_buf || !mxvar_tmp_buf )	    return(0);#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,10))	if ( from_user )	    down(&mxvar_tmp_buf_sem);#endif	while ( 1 ) {	    c = MIN(count, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,			       SERIAL_XMIT_SIZE - info->xmit_head));	    if ( c <= 0 )		break;#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,10))	    if ( from_user ) {		/*		copy_from_user(mxvar_tmp_buf, buf, c);		c = MIN(c, MIN(SERIAL_XMIT_SIZE - info->xmit_cnt - 1,			       SERIAL_XMIT_SIZE - info->xmit_head));		memcpy(info->xmit_buf + info->xmit_head, mxvar_tmp_buf, c);	    */		if(copy_from_user(info->xmit_buf+info->xmit_head, buf, c)==c){		    total = -EFAULT;			    break;		}	    } else		memcpy(info->xmit_buf + info->xmit_head, buf, c);#else		memcpy(info->xmit_buf + info->xmit_head, buf, c);#endif	    MX_LOCK(&info->slock);    	    info->xmit_head = (info->xmit_head + c) & (SERIAL_XMIT_SIZE - 1);	    info->xmit_cnt += c;	    MX_UNLOCK(&info->slock);	    buf += c;	    count -= c;	    total += c;	}#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,10))	if ( from_user )	    up(&mxvar_tmp_buf_sem);#endif	if ( info->xmit_cnt && !tty->stopped ){         	    MX_LOCK(&info->slock);			        info->IER &= ~UART_IER_THRI;	            outb(info->IER, info->base + UART_IER);	            info->IER |= UART_IER_THRI;	            outb(info->IER, info->base + UART_IER);	            MX_UNLOCK(&info->slock);	}	return(total);}static void mxpcdrv_put_char(struct tty_struct * tty, unsigned char ch){	struct mxpcdrv_struct *info = (struct mxpcdrv_struct *)tty->driver_data;	MX_LOCK_INIT();	if ( !tty || !info->xmit_buf )	    return;	if ( info->xmit_cnt >= SERIAL_XMIT_SIZE - 1 ) {	    return;	}	MX_LOCK(&info->slock);	info->xmit_buf[info->xmit_head++] = ch;	info->xmit_head &= SERIAL_XMIT_SIZE - 1;	info->xmit_cnt++;	MX_UNLOCK(&info->slock);	if ( !tty->stopped/* && !(info->IER & UART_IER_THRI) */) {        		MX_LOCK(&info->slock);		        info->IER &= ~UART_IER_THRI	;            outb(info->IER, info->base + UART_IER);		    		info->IER |= UART_IER_THRI;		    		outb(info->IER, info->base + UART_IER);	  	  		MX_UNLOCK(&info->slock);	}}static void mxpcdrv_flush_chars(struct tty_struct * tty){	struct mxpcdrv_struct *info = (struct mxpcdrv_struct *)tty->driver_data;	MX_LOCK_INIT();	if ( info->xmit_cnt <= 0 || tty->stopped || !info->xmit_buf || 	     (tty->hw_stopped && (info->type!=PORT_16550A) && (!info->IsMoxaMustChipFlag)))	    return;	MX_LOCK(&info->slock);  info->IER &= ~UART_IER_THRI	;  outb(info->IER, info->base + UART_IER);	info->IER |= UART_IER_THRI;	outb(info->IER, info->base + UART_IER);	MX_UNLOCK(&info->slock);}static int mxpcdrv_write_room(struct tty_struct * tty){	struct mxpcdrv_struct *info = (struct mxpcdrv_struct *)tty->driver_data;	int	ret;	ret = SERIAL_XMIT_SIZE - info->xmit_cnt - 1;	if ( ret < 0 )	    ret = 0;	return(ret);}static int mxpcdrv_chars_in_buffer(struct tty_struct * tty){	int len;	struct mxpcdrv_struct *info = (struct mxpcdrv_struct *)tty->driver_data;	len = info->xmit_cnt;	if(!(inb(info->base + UART_LSR) & UART_LSR_THRE))  		len++;			return len;}static void mxpcdrv_flush_buffer(struct tty_struct * tty){	struct mxpcdrv_struct *info = (struct mxpcdrv_struct *)tty->driver_data;	char fcr;	MX_LOCK_INIT();	MX_LOCK(&info->slock);	info->xmit_cnt = info->xmit_head = info->xmit_tail = 0;	MX_UNLOCK(&info->slock);	fcr = inb(info->base + UART_FCR);	outb((fcr | UART_FCR_CLEAR_RCVR | UART_FCR_CLEAR_XMIT), 		info->base + UART_FCR);	outb(fcr, info->base+UART_FCR);	wake_up_interruptible(&tty->write_wait);	if ( (tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&	     tty->ldisc.write_wakeup )	    (tty->ldisc.write_wakeup)(tty);}static int mxpcdrv_ioctl(struct tty_struct * tty, struct file * file,		       unsigned int cmd, unsigned long arg){	int			error;	struct mxpcdrv_struct *	info = (struct mxpcdrv_struct *)tty->driver_data;	int			retval;	struct async_icount	cprev, cnow;	    /* kernel counter temps */	struct serial_icounter_struct *p_cuser;     /* user space */	unsigned long 		templ;	MX_LOCK_INIT();		if ( PORTNO(tty) == MXPCDRV_PORTS )	    return(mxpcdrv_ioctl_special(cmd, arg));	if ( (cmd != TIOCGSERIAL) && (cmd != TIOCMIWAIT) &&	     (cmd != TIOCGICOUNT) ) {	    if ( tty->flags & (1 << TTY_IO_ERROR) )		return(-EIO);	}	switch ( cmd ) {	case TCSBRK:	/* SVID version: non-zero arg --> no break */	    retval = tty_check_change(tty);	    if ( retval )		return(retval);	    tty_wait_until_sent(tty, 0);	    if ( !arg )		mxpcdrv_send_break(info, HZ/4);		/* 1/4 second */	    return(0);	case TCSBRKP:	/* support for POSIX tcsendbreak() */	    retval = tty_check_change(tty);	    if ( retval )		return(retval);	    tty_wait_until_sent(tty, 0);	    mxpcdrv_send_break(info, arg ? arg*(HZ/10) : HZ/4);	    return(0);	case TIOCGSOFTCAR:	    error = MX_ACCESS_CHK(VERIFY_WRITE, (void *)arg, sizeof(long));	    if ( MX_ERR(error) )		return(error);	    put_to_user(C_CLOCAL(tty) ? 1 : 0, (unsigned long *)arg);	    return 0;	case TIOCSSOFTCAR:	    error = MX_ACCESS_CHK(VERIFY_READ, (void *)arg, sizeof(long));	    if ( MX_ERR(error) )		return(error);	    get_from_user(templ,(unsigned long *)arg);	    arg = templ;	    tty->termios->c_cflag = ((tty->termios->c_cflag & ~CLOCAL) |				    (arg ? CLOCAL : 0));	    return(0);#if (LINUX_VERSION_CODE < VERSION_CODE(2,6,0))	case TIOCMGET:	    error = MX_ACCESS_CHK(VERIFY_WRITE, (void *)arg,				sizeof(unsigned int));	    if ( MX_ERR(error) )		return(error);	    return(mxpcdrv_get_modem_info(info, (unsigned int *)arg));	case TIOCMBIS:	case TIOCMBIC:	case TIOCMSET:	    return(mxpcdrv_set_modem_info(info, cmd, (unsigned int *)arg));#endif	case TIOCGSERIAL:	    error = MX_ACCESS_CHK(VERIFY_WRITE, (void *)arg,				sizeof(struct serial_struct));	    if ( MX_ERR(error) )		return(error);	    return(mxpcdrv_get_serial_info(info, (struct serial_struct *)arg));	case TIOCSSERIAL:	    error = MX_ACCESS_CHK(VERIFY_READ, (void *)arg,				sizeof(struct serial_struct));	    if ( MX_ERR(error) )		return(error);	    return(mxpcdrv_set_serial_info(info, (struct serial_struct *)arg));	case TIOCSERGETLSR: /* Get line status register */	    error = MX_ACCESS_CHK(VERIFY_WRITE, (void *)arg,				sizeof(unsigned int));	    if ( MX_ERR(error) )		return(error);	    else		return(mxpcdrv_get_lsr_info(info, (unsigned int *)arg));	/*	 * Wait for any of the 4 modem inputs (DCD,RI,DSR,CTS) to change	 * - mask passed in arg for lines of interest	 *   (use |'ed TIOCM_RNG/DSR/CD/CTS for masking)	 * Caller should use TIOCGICOUNT to see which one it was	 */	case TIOCMIWAIT:	    MX_LOCK(&info->slock);	    cprev = info->icount;   /* note the counters on entry */	    MX_UNLOCK(&info->slock);	    while ( 1 ) {		//interruptible_sleep_on(&info->delta_msr_wait);		/* see if a signal did it */		if ( signal_pending(current) )		    return(-ERESTARTSYS);	    MX_LOCK(&info->slock);

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产在线不卡视频| 欧美成人三级电影在线| 欧美一区二区三区电影| 午夜精品免费在线观看| 99精品一区二区| 一本色道亚洲精品aⅴ| 国产精品免费久久| 国产很黄免费观看久久| 欧美日本一区二区三区四区| 日韩av不卡在线观看| 欧美日韩免费高清一区色橹橹| 日韩一本二本av| 狠狠色综合日日| 日韩一区二区电影在线| 国产一区二区三区av电影 | 51精品视频一区二区三区| 免费观看一级特黄欧美大片| 色8久久精品久久久久久蜜 | 在线免费观看日本欧美| 午夜电影网亚洲视频| 欧美三级电影在线观看| 另类小说欧美激情| 亚洲精品一区二区三区福利| 成人av网站在线观看免费| 日韩一区在线免费观看| 99re在线精品| 性做久久久久久久久| 久久综合狠狠综合久久综合88| 精品一区二区在线播放| 亚洲精品国产精品乱码不99| 欧美亚洲高清一区| 国产精品自拍一区| 成人免费小视频| 国产精品久久免费看| 国产精品一色哟哟哟| 亚洲国产精品一区二区www | 波波电影院一区二区三区| 亚洲日本在线天堂| 91国偷自产一区二区三区观看 | 日韩av电影一区| 国产精品久久久久久户外露出 | 免费人成在线不卡| 欧美一区二区成人| 国产毛片精品视频| 日本一二三不卡| 欧美精品在欧美一区二区少妇| 亚洲高清三级视频| 精品国产亚洲一区二区三区在线观看| 久久99久久精品| 中文字幕一区在线| 精品国内片67194| 成人app软件下载大全免费| 偷拍自拍另类欧美| 欧美一级艳片视频免费观看| 9色porny自拍视频一区二区| 亚洲精品久久7777| 国产精品久久午夜夜伦鲁鲁| 欧美在线免费观看亚洲| 国产精品99久久久久久似苏梦涵 | 五月开心婷婷久久| 亚洲色图一区二区三区| 精品日韩一区二区三区免费视频| 欧美日韩电影一区| 国产成人激情av| 九九视频精品免费| 一区二区三区成人在线视频| 国产精品丝袜一区| 在线91免费看| 欧美精品久久天天躁| 国产黄人亚洲片| 欧美色综合网站| 狠狠色综合日日| 黄色日韩网站视频| 亚洲人123区| 欧美日韩在线免费视频| 岛国一区二区在线观看| 日日摸夜夜添夜夜添精品视频| 日韩小视频在线观看专区| 国产69精品久久777的优势| 国产精品一线二线三线| 亚洲另类在线一区| 夜夜嗨av一区二区三区网页| 欧美偷拍一区二区| 欧美日韩日日摸| av激情亚洲男人天堂| a在线播放不卡| 国产一区二区三区最好精华液| 极品销魂美女一区二区三区| 国产精品传媒在线| 伊人色综合久久天天| 国产午夜精品一区二区三区视频| 欧美极品aⅴ影院| 日韩免费一区二区| 久久久久国产精品麻豆ai换脸 | 成人午夜视频在线观看| 韩国精品一区二区| 成人综合激情网| 久久99国产精品免费| 国产精品1024久久| 理论电影国产精品| 国产精品一区二区三区乱码| 狠狠色狠狠色综合日日91app| 国产主播一区二区三区| 日韩和欧美一区二区| 极品少妇xxxx精品少妇偷拍| 亚洲国产精品视频| 久久精品国产99国产精品| 蜜桃视频第一区免费观看| 久久99精品国产91久久来源| 蜜桃免费网站一区二区三区| 美日韩黄色大片| 日韩综合小视频| 亚洲www啪成人一区二区麻豆| 亚洲第一综合色| 无码av免费一区二区三区试看| 日韩av午夜在线观看| 日韩国产在线一| 久久成人免费网| 麻豆91精品视频| 国内一区二区在线| 国产.精品.日韩.另类.中文.在线.播放 | 欧美体内she精视频| 在线中文字幕不卡| 69久久夜色精品国产69蝌蚪网 | 欧美日韩国产小视频| 欧美一区二区三区色| 日韩欧美成人激情| 亚洲欧美另类久久久精品2019| 中文字幕永久在线不卡| 美女看a上一区| 国产一本一道久久香蕉| 在线欧美日韩精品| 制服丝袜激情欧洲亚洲| 亚洲色图在线播放| 久久免费的精品国产v∧| 亚洲一二三区在线观看| 欧美三级电影在线看| 欧美高清精品3d| 91精品福利在线一区二区三区| 精品电影一区二区| 26uuu精品一区二区三区四区在线| 国产欧美日本一区视频| 日韩成人av影视| 黄网站免费久久| 欧美精三区欧美精三区| 国产丝袜在线精品| 狠狠久久亚洲欧美| av一本久道久久综合久久鬼色| 久久久精品国产免费观看同学| 久久蜜桃一区二区| 麻豆精品一区二区综合av| 94-欧美-setu| 日韩精品一区二区三区在线| 亚洲二区在线观看| 国产精品综合在线视频| 精品裸体舞一区二区三区| 国产精品久久一卡二卡| 国产毛片精品国产一区二区三区| 色欧美乱欧美15图片| 亚洲视频资源在线| 欧美96一区二区免费视频| 欧美猛男gaygay网站| 国产欧美精品一区二区三区四区| 久久99精品久久久久婷婷| 日韩欧美国产一二三区| 亚洲精品久久嫩草网站秘色| 99国产精品久久久久久久久久| 欧美精品一二三| 蜜桃av一区二区| 欧美日韩亚洲综合在线| 爽好久久久欧美精品| 国产精品一二三四五| 中文字幕精品—区二区四季| 懂色av一区二区夜夜嗨| 日韩一区二区三区四区五区六区 | 在线观看日韩国产| 久久久一区二区三区捆绑**| 亚洲宅男天堂在线观看无病毒| 国产一区二区三区四区五区美女| 精品国产伦理网| 久久毛片高清国产| 国产二区国产一区在线观看| 欧美tickling网站挠脚心| 国产精品美女久久久久aⅴ国产馆| 亚洲午夜影视影院在线观看| 成人综合在线视频| 亚洲乱码国产乱码精品精可以看 | 欧美视频一二三区| 日韩国产精品91| 欧美在线制服丝袜| 蜜桃精品在线观看| 精品视频免费在线| 久久99这里只有精品| 欧美美女网站色| 国产成+人+日韩+欧美+亚洲| 色婷婷久久久久swag精品| 日本一区中文字幕| 久久看人人爽人人| 国产老妇另类xxxxx| 亚洲黄色av一区|