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

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

?? cm4040_cs.c

?? linux-2.6.15.6
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/* * A driver for the Omnikey PCMCIA smartcard reader CardMan 4040 * * (c) 2000-2004 Omnikey AG (http://www.omnikey.com/) * * (C) 2005 Harald Welte <laforge@gnumonks.org> * 	- add support for poll() * 	- driver cleanup * 	- add waitqueues * 	- adhere to linux kernel coding style and policies * 	- support 2.6.13 "new style" pcmcia interface * * The device basically is a USB CCID compliant device that has been * attached to an I/O-Mapped FIFO. * * All rights reserved, Dual BSD/GPL Licensed. *//* #define PCMCIA_DEBUG 6 */#include <linux/kernel.h>#include <linux/module.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/delay.h>#include <linux/poll.h>#include <linux/wait.h>#include <asm/uaccess.h>#include <asm/io.h>#include <pcmcia/cs_types.h>#include <pcmcia/cs.h>#include <pcmcia/cistpl.h>#include <pcmcia/cisreg.h>#include <pcmcia/ciscode.h>#include <pcmcia/ds.h>#include "cm4040_cs.h"#ifdef PCMCIA_DEBUG#define reader_to_dev(x)	(&handle_to_dev(x->link.handle))static int pc_debug = PCMCIA_DEBUG;module_param(pc_debug, int, 0600);#define DEBUGP(n, rdr, x, args...) do { 				\	if (pc_debug >= (n)) 						\		dev_printk(KERN_DEBUG, reader_to_dev(rdr), "%s:" x, 	\			   __FUNCTION__ , ##args); 			\	} while (0)#else#define DEBUGP(n, rdr, x, args...)#endifstatic char *version ="OMNIKEY CardMan 4040 v1.1.0gm4 - All bugs added by Harald Welte";#define	CCID_DRIVER_BULK_DEFAULT_TIMEOUT  	(150*HZ)#define	CCID_DRIVER_ASYNC_POWERUP_TIMEOUT 	(35*HZ)#define	CCID_DRIVER_MINIMUM_TIMEOUT 		(3*HZ)#define READ_WRITE_BUFFER_SIZE 512#define POLL_LOOP_COUNT				1000/* how often to poll for fifo status change */#define POLL_PERIOD 				msecs_to_jiffies(10)static void reader_release(dev_link_t *link);static void reader_detach(dev_link_t *link);static int major;#define		BS_READABLE	0x01#define		BS_WRITABLE	0x02struct reader_dev {	dev_link_t		link;	dev_node_t		node;	wait_queue_head_t	devq;	wait_queue_head_t	poll_wait;	wait_queue_head_t	read_wait;	wait_queue_head_t	write_wait;	unsigned long 	  	buffer_status;	unsigned long     	timeout;	unsigned char     	s_buf[READ_WRITE_BUFFER_SIZE];	unsigned char     	r_buf[READ_WRITE_BUFFER_SIZE];	struct timer_list 	poll_timer;};static dev_info_t dev_info = MODULE_NAME;static dev_link_t *dev_table[CM_MAX_DEV];#ifndef PCMCIA_DEBUG#define	xoutb	outb#define	xinb	inb#elsestatic inline void xoutb(unsigned char val, unsigned short port){	if (pc_debug >= 7)		printk(KERN_DEBUG "outb(val=%.2x,port=%.4x)\n", val, port);	outb(val, port);}static inline unsigned char xinb(unsigned short port){	unsigned char val;	val = inb(port);	if (pc_debug >= 7)		printk(KERN_DEBUG "%.2x=inb(%.4x)\n", val, port);	return val;}#endif/* poll the device fifo status register.  not to be confused with * the poll syscall. */static void cm4040_do_poll(unsigned long dummy){	struct reader_dev *dev = (struct reader_dev *) dummy;	unsigned int obs = xinb(dev->link.io.BasePort1				+ REG_OFFSET_BUFFER_STATUS);	if ((obs & BSR_BULK_IN_FULL)) {		set_bit(BS_READABLE, &dev->buffer_status);		DEBUGP(4, dev, "waking up read_wait\n");		wake_up_interruptible(&dev->read_wait);	} else		clear_bit(BS_READABLE, &dev->buffer_status);	if (!(obs & BSR_BULK_OUT_FULL)) {		set_bit(BS_WRITABLE, &dev->buffer_status);		DEBUGP(4, dev, "waking up write_wait\n");		wake_up_interruptible(&dev->write_wait);	} else		clear_bit(BS_WRITABLE, &dev->buffer_status);	if (dev->buffer_status)		wake_up_interruptible(&dev->poll_wait);	mod_timer(&dev->poll_timer, jiffies + POLL_PERIOD);}static void cm4040_stop_poll(struct reader_dev *dev){	del_timer_sync(&dev->poll_timer);}static int wait_for_bulk_out_ready(struct reader_dev *dev){	int i, rc;	int iobase = dev->link.io.BasePort1;	for (i = 0; i < POLL_LOOP_COUNT; i++) {		if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)		    & BSR_BULK_OUT_FULL) == 0) {			DEBUGP(4, dev, "BulkOut empty (i=%d)\n", i);			return 1;		}	}	DEBUGP(4, dev, "wait_event_interruptible_timeout(timeout=%ld\n",		dev->timeout);	rc = wait_event_interruptible_timeout(dev->write_wait,					      test_and_clear_bit(BS_WRITABLE,						       &dev->buffer_status),					      dev->timeout);	if (rc > 0)		DEBUGP(4, dev, "woke up: BulkOut empty\n");	else if (rc == 0)		DEBUGP(4, dev, "woke up: BulkOut full, returning 0 :(\n");	else if (rc < 0)		DEBUGP(4, dev, "woke up: signal arrived\n");	return rc;}/* Write to Sync Control Register */static int write_sync_reg(unsigned char val, struct reader_dev *dev){	int iobase = dev->link.io.BasePort1;	int rc;	rc = wait_for_bulk_out_ready(dev);	if (rc <= 0)		return rc;	xoutb(val, iobase + REG_OFFSET_SYNC_CONTROL);	rc = wait_for_bulk_out_ready(dev);	if (rc <= 0)		return rc;	return 1;}static int wait_for_bulk_in_ready(struct reader_dev *dev){	int i, rc;	int iobase = dev->link.io.BasePort1;	for (i = 0; i < POLL_LOOP_COUNT; i++) {		if ((xinb(iobase + REG_OFFSET_BUFFER_STATUS)		    & BSR_BULK_IN_FULL) == BSR_BULK_IN_FULL) {			DEBUGP(3, dev, "BulkIn full (i=%d)\n", i);			return 1;		}	}	DEBUGP(4, dev, "wait_event_interruptible_timeout(timeout=%ld\n",		dev->timeout);	rc = wait_event_interruptible_timeout(dev->read_wait,					      test_and_clear_bit(BS_READABLE,						 	&dev->buffer_status),					      dev->timeout);	if (rc > 0)		DEBUGP(4, dev, "woke up: BulkIn full\n");	else if (rc == 0)		DEBUGP(4, dev, "woke up: BulkIn not full, returning 0 :(\n");	else if (rc < 0)		DEBUGP(4, dev, "woke up: signal arrived\n");	return rc;}static ssize_t cm4040_read(struct file *filp, char __user *buf,			size_t count, loff_t *ppos){	struct reader_dev *dev = filp->private_data;	int iobase = dev->link.io.BasePort1;	size_t bytes_to_read;	unsigned long i;	size_t min_bytes_to_read;	int rc;	unsigned char uc;	DEBUGP(2, dev, "-> cm4040_read(%s,%d)\n", current->comm, current->pid);	if (count == 0)		return 0;	if (count < 10)		return -EFAULT;	if (filp->f_flags & O_NONBLOCK) {		DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");		DEBUGP(2, dev, "<- cm4040_read (failure)\n");		return -EAGAIN;	}	if ((dev->link.state & DEV_PRESENT)==0)		return -ENODEV;	for (i = 0; i < 5; i++) {		rc = wait_for_bulk_in_ready(dev);		if (rc <= 0) {			DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);			DEBUGP(2, dev, "<- cm4040_read (failed)\n");			if (rc == -ERESTARTSYS)				return rc;			return -EIO;		}	  	dev->r_buf[i] = xinb(iobase + REG_OFFSET_BULK_IN);#ifdef PCMCIA_DEBUG		if (pc_debug >= 6)			printk(KERN_DEBUG "%lu:%2x ", i, dev->r_buf[i]);	}	printk("\n");#else	}#endif	bytes_to_read = 5 + le32_to_cpu(*(__le32 *)&dev->r_buf[1]);	DEBUGP(6, dev, "BytesToRead=%lu\n", bytes_to_read);	min_bytes_to_read = min(count, bytes_to_read + 5);	DEBUGP(6, dev, "Min=%lu\n", min_bytes_to_read);	for (i = 0; i < (min_bytes_to_read-5); i++) {		rc = wait_for_bulk_in_ready(dev);		if (rc <= 0) {			DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);			DEBUGP(2, dev, "<- cm4040_read (failed)\n");			if (rc == -ERESTARTSYS)				return rc;			return -EIO;		}		dev->r_buf[i+5] = xinb(iobase + REG_OFFSET_BULK_IN);#ifdef PCMCIA_DEBUG		if (pc_debug >= 6)			printk(KERN_DEBUG "%lu:%2x ", i, dev->r_buf[i]);	}	printk("\n");#else	}#endif	*ppos = min_bytes_to_read;	if (copy_to_user(buf, dev->r_buf, min_bytes_to_read))		return -EFAULT;	rc = wait_for_bulk_in_ready(dev);	if (rc <= 0) {		DEBUGP(5, dev, "wait_for_bulk_in_ready rc=%.2x\n", rc);		DEBUGP(2, dev, "<- cm4040_read (failed)\n");		if (rc == -ERESTARTSYS)			return rc;		return -EIO;	}	rc = write_sync_reg(SCR_READER_TO_HOST_DONE, dev);	if (rc <= 0) {		DEBUGP(5, dev, "write_sync_reg c=%.2x\n", rc);		DEBUGP(2, dev, "<- cm4040_read (failed)\n");		if (rc == -ERESTARTSYS)			return rc;		else			return -EIO;	}	uc = xinb(iobase + REG_OFFSET_BULK_IN);	DEBUGP(2, dev, "<- cm4040_read (successfully)\n");	return min_bytes_to_read;}static ssize_t cm4040_write(struct file *filp, const char __user *buf,			 size_t count, loff_t *ppos){	struct reader_dev *dev = filp->private_data;	int iobase = dev->link.io.BasePort1;	ssize_t rc;	int i;	unsigned int bytes_to_write;	DEBUGP(2, dev, "-> cm4040_write(%s,%d)\n", current->comm, current->pid);	if (count == 0) {		DEBUGP(2, dev, "<- cm4040_write empty read (successfully)\n");		return 0;	}	if (count < 5) {		DEBUGP(2, dev, "<- cm4040_write buffersize=%Zd < 5\n", count);		return -EIO;	}	if (filp->f_flags & O_NONBLOCK) {		DEBUGP(4, dev, "filep->f_flags O_NONBLOCK set\n");		DEBUGP(4, dev, "<- cm4040_write (failure)\n");		return -EAGAIN;	}	if ((dev->link.state & DEV_PRESENT) == 0)		return -ENODEV;	bytes_to_write = count;	if (copy_from_user(dev->s_buf, buf, bytes_to_write))		return -EFAULT;	switch (dev->s_buf[0]) {		case CMD_PC_TO_RDR_XFRBLOCK:		case CMD_PC_TO_RDR_SECURE:		case CMD_PC_TO_RDR_TEST_SECURE:		case CMD_PC_TO_RDR_OK_SECURE:			dev->timeout = CCID_DRIVER_BULK_DEFAULT_TIMEOUT;			break;		case CMD_PC_TO_RDR_ICCPOWERON:			dev->timeout = CCID_DRIVER_ASYNC_POWERUP_TIMEOUT;			break;		case CMD_PC_TO_RDR_GETSLOTSTATUS:		case CMD_PC_TO_RDR_ICCPOWEROFF:		case CMD_PC_TO_RDR_GETPARAMETERS:		case CMD_PC_TO_RDR_RESETPARAMETERS:		case CMD_PC_TO_RDR_SETPARAMETERS:		case CMD_PC_TO_RDR_ESCAPE:		case CMD_PC_TO_RDR_ICCCLOCK:		default:			dev->timeout = CCID_DRIVER_MINIMUM_TIMEOUT;			break;	}	rc = write_sync_reg(SCR_HOST_TO_READER_START, dev);	if (rc <= 0) {		DEBUGP(5, dev, "write_sync_reg c=%.2Zx\n", rc);		DEBUGP(2, dev, "<- cm4040_write (failed)\n");		if (rc == -ERESTARTSYS)			return rc;		else			return -EIO;	}	DEBUGP(4, dev, "start \n");	for (i = 0; i < bytes_to_write; i++) {		rc = wait_for_bulk_out_ready(dev);		if (rc <= 0) {			DEBUGP(5, dev, "wait_for_bulk_out_ready rc=%.2Zx\n",			       rc);			DEBUGP(2, dev, "<- cm4040_write (failed)\n");			if (rc == -ERESTARTSYS)				return rc;			else				return -EIO;		}		xoutb(dev->s_buf[i],iobase + REG_OFFSET_BULK_OUT);	}	DEBUGP(4, dev, "end\n");	rc = write_sync_reg(SCR_HOST_TO_READER_DONE, dev);	if (rc <= 0) {		DEBUGP(5, dev, "write_sync_reg c=%.2Zx\n", rc);		DEBUGP(2, dev, "<- cm4040_write (failed)\n");		if (rc == -ERESTARTSYS)			return rc;		else			return -EIO;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
激情欧美一区二区| 国产一区二区三区美女| 精品国产伦一区二区三区观看方式 | 欧美日韩在线免费视频| 极品尤物av久久免费看| 一区二区日韩电影| 国产婷婷色一区二区三区| 欧美视频一区二区三区| 成人三级伦理片| 男女男精品网站| 夜夜爽夜夜爽精品视频| 国产精品色一区二区三区| 91精品国产入口| 在线观看免费视频综合| 风间由美一区二区av101| 秋霞影院一区二区| 一区二区免费在线播放| 国产精品久久影院| 久久久久久免费毛片精品| 欧美肥大bbwbbw高潮| 色综合久久中文综合久久97| 国产精品系列在线观看| 久久成人免费网| 秋霞电影一区二区| 亚洲成av人片在线观看无码| 亚洲欧美在线视频观看| 国产欧美一区二区精品性| 精品久久久久久亚洲综合网| 欧美日韩精品三区| 欧美在线影院一区二区| 91久久精品一区二区三| av一区二区久久| voyeur盗摄精品| www.成人在线| 91亚洲永久精品| 不卡av在线网| 91网站在线播放| 99riav久久精品riav| 99精品桃花视频在线观看| 不卡的av电影在线观看| 成年人午夜久久久| 成人福利在线看| 97精品电影院| 91日韩一区二区三区| 日本道精品一区二区三区| 91国在线观看| 欧美视频在线不卡| 制服丝袜成人动漫| 日韩一级大片在线| 26uuu久久天堂性欧美| 国产午夜亚洲精品不卡| 国产亚洲成年网址在线观看| 国产欧美一区视频| 中文字幕亚洲欧美在线不卡| 亚洲视频在线观看三级| 亚洲愉拍自拍另类高清精品| 亚洲成av人片在线| 免费在线观看一区| 久久成人精品无人区| 国产麻豆91精品| 99综合电影在线视频| 欧美在线三级电影| 欧美精品三级日韩久久| 精品久久久久一区| 国产精品久久久久天堂| 亚洲成a人在线观看| 久久91精品国产91久久小草| 东方欧美亚洲色图在线| 色成人在线视频| 日韩一区二区三区观看| 日本一区二区免费在线 | 日韩一区欧美一区| 亚洲国产中文字幕| 精彩视频一区二区| 99久久99久久久精品齐齐| 制服丝袜一区二区三区| 亚洲国产成人午夜在线一区| 一区二区三区色| 九色|91porny| 91在线免费视频观看| 91精品国产色综合久久不卡蜜臀 | 国产精品乱码妇女bbbb| 一区av在线播放| 激情五月激情综合网| 色94色欧美sute亚洲13| 欧美成人官网二区| 尤物在线观看一区| 狠狠色综合日日| 欧日韩精品视频| 久久精品网站免费观看| 一区二区三区不卡视频 | 不卡av免费在线观看| 3d成人h动漫网站入口| 国产欧美日韩另类一区| 天天操天天色综合| 成人激情免费视频| 日韩精品一区二区三区视频| 成人欧美一区二区三区白人| 久久av资源站| 欧美视频自拍偷拍| 中文字幕乱码一区二区免费| 免费一级片91| 欧美系列在线观看| 国产精品你懂的在线欣赏| 久久国产免费看| 欧美日韩免费在线视频| 国产精品国产三级国产aⅴ原创| 久久精品国内一区二区三区| 欧美少妇xxx| 中文字幕日本不卡| 国产一区不卡精品| 欧美一级高清片在线观看| 一区二区三区免费看视频| 成人小视频免费在线观看| 精品久久久网站| 日本一区中文字幕| 欧美午夜不卡视频| 亚洲欧美另类图片小说| 成人国产视频在线观看| 国产午夜亚洲精品理论片色戒| 麻豆91免费观看| 日韩一区二区三| 五月天久久比比资源色| 欧美系列亚洲系列| 亚洲精品成人悠悠色影视| 99精品在线免费| 最近日韩中文字幕| 99久久久国产精品免费蜜臀| 国产精品乱码一区二三区小蝌蚪| 国产精品亚洲一区二区三区妖精| 精品国一区二区三区| 麻豆成人在线观看| 欧美大度的电影原声| 老司机免费视频一区二区| 欧美一区二区成人| 久久精品国产久精国产| 欧美不卡一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ| 91精品国产色综合久久久蜜香臀| 日本亚洲欧美天堂免费| 欧美一级日韩不卡播放免费| 另类小说色综合网站| 欧美成人一级视频| 国模大尺度一区二区三区| 久久久久久免费网| 成人美女在线观看| 亚洲视频免费看| 在线一区二区三区四区五区| 亚洲国产精品久久久久秋霞影院| 欧美日本精品一区二区三区| 秋霞电影网一区二区| 精品国产不卡一区二区三区| 国产河南妇女毛片精品久久久| 久久精品一二三| av一区二区三区在线| 亚洲最新视频在线观看| 欧美一区二区私人影院日本| 麻豆一区二区99久久久久| 久久久美女艺术照精彩视频福利播放| 国产精品一区二区久久精品爱涩| 国产精品女上位| 欧美日本一区二区三区| 激情欧美一区二区三区在线观看| 国产精品无遮挡| 在线观看欧美黄色| 久久99国产乱子伦精品免费| 亚洲国产激情av| 欧美性xxxxx极品少妇| 寂寞少妇一区二区三区| 亚洲人123区| 欧美一区二区三区播放老司机| 国产一区二区女| 一区二区三区在线观看欧美| 日韩欧美国产1| 91蜜桃在线观看| 麻豆精品国产91久久久久久| 国产精品免费视频观看| 3d成人动漫网站| 成人国产视频在线观看| 日韩电影在线免费观看| 国产精品免费aⅴ片在线观看| 欧美日韩一区二区三区四区五区| 国产乱人伦精品一区二区在线观看| 亚洲免费高清视频在线| 精品国产乱码久久| 在线精品视频免费播放| 国产美女在线精品| 亚洲1区2区3区4区| 欧美国产欧美综合| 91精品国模一区二区三区| www.av亚洲| 久久 天天综合| 无吗不卡中文字幕| 国产精品美女久久久久aⅴ | 国产精品私人自拍| 69久久99精品久久久久婷婷| av中文字幕不卡| 极品尤物av久久免费看| 亚洲不卡在线观看| 专区另类欧美日韩|