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

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

?? pt.c

?? 是關(guān)于linux2.5.1的完全源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*         pt.c    (c) 1998  Grant R. Guenther <grant@torque.net>                          Under the terms of the GNU General Public License.        This is the high-level driver for parallel port ATAPI tape        drives based on chips supported by the paride module.	The driver implements both rewinding and non-rewinding	devices, filemarks, and the rewind ioctl.  It allocates	a small internal "bounce buffer" for each open device, but        otherwise expects buffering and blocking to be done at the        user level.  As with most block-structured tapes, short	writes are padded to full tape blocks, so reading back a file        may return more data than was actually written.        By default, the driver will autoprobe for a single parallel        port ATAPI tape drive, but if their individual parameters are        specified, the driver can handle up to 4 drives.	The rewinding devices are named /dev/pt0, /dev/pt1, ...	while the non-rewinding devices are /dev/npt0, /dev/npt1, etc.        The behaviour of the pt driver can be altered by setting        some parameters from the insmod command line.  The following        parameters are adjustable:            drive0      These four arguments can be arrays of                   drive1      1-6 integers as follows:            drive2            drive3      <prt>,<pro>,<uni>,<mod>,<slv>,<dly>                        Where,                <prt>   is the base of the parallel port address for                        the corresponding drive.  (required)                <pro>   is the protocol number for the adapter that                        supports this drive.  These numbers are                        logged by 'paride' when the protocol modules                        are initialised.  (0 if not given)                <uni>   for those adapters that support chained                        devices, this is the unit selector for the                        chain of devices on the given port.  It should                        be zero for devices that don't support chaining.                        (0 if not given)                <mod>   this can be -1 to choose the best mode, or one                        of the mode numbers supported by the adapter.                        (-1 if not given)                <slv>   ATAPI devices can be jumpered to master or slave.                        Set this to 0 to choose the master drive, 1 to                        choose the slave, -1 (the default) to choose the                        first drive found.                <dly>   some parallel ports require the driver to                         go more slowly.  -1 sets a default value that                        should work with the chosen protocol.  Otherwise,                        set this to a small integer, the larger it is                        the slower the port i/o.  In some cases, setting                        this to zero will speed up the device. (default -1)	    major	You may use this parameter to overide the			default major number (96) that this driver			will use.  Be sure to change the device			name as well.	    name	This parameter is a character string that			contains the name the kernel will use for this			device (in /proc output, for instance).			(default "pt").            verbose     This parameter controls the amount of logging                        that the driver will do.  Set it to 0 for                        normal operation, 1 to see autoprobe progress                        messages, or 2 to see additional debugging                        output.  (default 0)         If this driver is built into the kernel, you can use         the following command line parameters, with the same values        as the corresponding module parameters listed above:            pt.drive0            pt.drive1            pt.drive2            pt.drive3        In addition, you can use the parameter pt.disable to disable        the driver entirely.*//*   Changes:	1.01	GRG 1998.05.06	Round up transfer size, fix ready_wait,			        loosed interpretation of ATAPI standard				for clearing error status.				Eliminate sti();	1.02    GRG 1998.06.16  Eliminate an Ugh.	1.03    GRG 1998.08.15  Adjusted PT_TMO, use HZ in loop timing,				extra debugging	1.04    GRG 1998.09.24  Repair minor coding error, added jumbo support	*/#define PT_VERSION      "1.04"#define PT_MAJOR	96#define PT_NAME		"pt"#define PT_UNITS	4/* Here are things one can override from the insmod command.   Most are autoprobed by paride unless set here.  Verbose is on   by default.*/static int	verbose = 0;static int	major = PT_MAJOR;static char	*name = PT_NAME;static int      disable = 0;static int drive0[6] = {0,0,0,-1,-1,-1};static int drive1[6] = {0,0,0,-1,-1,-1};static int drive2[6] = {0,0,0,-1,-1,-1};static int drive3[6] = {0,0,0,-1,-1,-1};static int (*drives[4])[6] = {&drive0,&drive1,&drive2,&drive3};static int pt_drive_count;#define D_PRT   0#define D_PRO   1#define D_UNI   2#define D_MOD   3#define D_SLV   4#define D_DLY   5#define DU              (*drives[unit])/* end of parameters */#include <linux/module.h>#include <linux/errno.h>#include <linux/fs.h>#include <linux/devfs_fs_kernel.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/slab.h>#include <linux/mtio.h>#include <linux/wait.h>#include <linux/smp_lock.h>#include <asm/uaccess.h>#ifndef MODULE#include "setup.h"static STT pt_stt[5] = {{"drive0",6,drive0},                        {"drive1",6,drive1},                        {"drive2",6,drive2},                        {"drive3",6,drive3},			{"disable",1,&disable}};void pt_setup( char *str, int *ints){       generic_setup(pt_stt,5,str);}#endifMODULE_PARM(verbose,"i");MODULE_PARM(major,"i");MODULE_PARM(name,"s");MODULE_PARM(drive0,"1-6i");MODULE_PARM(drive1,"1-6i");MODULE_PARM(drive2,"1-6i");MODULE_PARM(drive3,"1-6i");#include "paride.h"#define PT_MAX_RETRIES  5#define PT_TMO          3000            /* interrupt timeout in jiffies */#define PT_SPIN_DEL     50              /* spin delay in micro-seconds  */#define PT_RESET_TMO    30		/* 30 seconds */#define PT_READY_TMO	60		/* 60 seconds */#define PT_REWIND_TMO	1200		/* 20 minutes */#define PT_SPIN         ((1000000/(HZ*PT_SPIN_DEL))*PT_TMO)  #define STAT_ERR        0x00001#define STAT_INDEX      0x00002#define STAT_ECC        0x00004#define STAT_DRQ        0x00008#define STAT_SEEK       0x00010#define STAT_WRERR      0x00020#define STAT_READY      0x00040#define STAT_BUSY       0x00080#define STAT_SENSE	0x1f000#define ATAPI_TEST_READY	0x00#define ATAPI_REWIND		0x01#define ATAPI_REQ_SENSE		0x03#define ATAPI_READ_6		0x08#define ATAPI_WRITE_6		0x0a#define ATAPI_WFM		0x10#define ATAPI_IDENTIFY		0x12#define ATAPI_MODE_SENSE	0x1a#define ATAPI_LOG_SENSE		0x4dint pt_init(void);#ifdef MODULEvoid cleanup_module( void );#endifstatic int pt_open(struct inode *inode, struct file *file);static int pt_ioctl(struct inode *inode,struct file *file,                    unsigned int cmd, unsigned long arg);static int pt_release (struct inode *inode, struct file *file);static ssize_t pt_read(struct file * filp, char * buf,                        size_t count, loff_t *ppos);static ssize_t pt_write(struct file * filp, const char * buf,                         size_t count, loff_t *ppos);static int pt_detect(void);static int pt_identify (int unit);/* bits in PT.flags */#define PT_MEDIA	1#define PT_WRITE_OK	2#define PT_REWIND	4#define PT_WRITING      8#define PT_READING     16#define PT_EOF	       32#define PT_NAMELEN      8#define PT_BUFSIZE  16384struct pt_unit {	struct pi_adapter pia;    /* interface to paride layer */	struct pi_adapter *pi;	int flags;        	  /* various state flags */	int last_sense;		  /* result of last request sense */	int drive;		  /* drive */	atomic_t available;       /* 1 if access is available 0 otherwise */	int bs;			  /* block size */	int capacity;             /* Size of tape in KB */	int present;		  /* device present ? */	char *bufptr;	char name[PT_NAMELEN];	  /* pf0, pf1, ... */	};struct pt_unit pt[PT_UNITS];/*  'unit' must be defined in all functions - either as a local or a param */#define PT pt[unit]#define PI PT.pistatic char pt_scratch[512];            /* scratch block buffer *//* kernel glue structures */static struct file_operations pt_fops = {	owner:		THIS_MODULE,	read:		pt_read,	write:		pt_write,	ioctl:		pt_ioctl,	open:		pt_open,	release:	pt_release,};void pt_init_units( void ){       int     unit, j;        pt_drive_count = 0;        for (unit=0;unit<PT_UNITS;unit++) {                PT.pi = & PT.pia;                atomic_set( &PT.available, 1 );                PT.flags = 0;		PT.last_sense = 0;                PT.present = 0;		PT.bufptr = NULL;		PT.drive = DU[D_SLV];                j = 0;                while ((j < PT_NAMELEN-2) && (PT.name[j]=name[j])) j++;                PT.name[j++] = '0' + unit;                PT.name[j] = 0;                if (DU[D_PRT]) pt_drive_count++;        }} static devfs_handle_t devfs_handle;int pt_init (void)      /* preliminary initialisation */{       int unit;	if (disable) return -1;	pt_init_units();	if (pt_detect()) return -1;	if (devfs_register_chrdev(major,name,&pt_fops)) {                printk("pt_init: unable to get major number %d\n",                        major);	        for (unit=0;unit<PT_UNITS;unit++)        	  if (PT.present) pi_release(PI);                return -1;        }	devfs_handle = devfs_mk_dir (NULL, "pt", NULL);	devfs_register_series (devfs_handle, "%u", 4, DEVFS_FL_DEFAULT,			       major, 0, S_IFCHR | S_IRUSR | S_IWUSR,			       &pt_fops, NULL);	devfs_register_series (devfs_handle, "%un", 4, DEVFS_FL_DEFAULT,			       major, 128, S_IFCHR | S_IRUSR | S_IWUSR,			       &pt_fops, NULL);        return 0;}#ifdef MODULE/* Glue for modules ... */void    cleanup_module(void);int     init_module(void){       int     err;#ifdef PARIDE_JUMBO       { extern paride_init();         paride_init();       } #endif        err = pt_init();        return err;}void    cleanup_module(void){	int unit;	devfs_unregister (devfs_handle);	devfs_unregister_chrdev(major,name);	for (unit=0;unit<PT_UNITS;unit++)	  if (PT.present) pi_release(PI);}#endif#define	WR(c,r,v)	pi_write_regr(PI,c,r,v)#define	RR(c,r)		(pi_read_regr(PI,c,r))#define DRIVE           (0xa0+0x10*PT.drive)static int pt_wait( int unit, int go, int stop, char * fun, char * msg ){       int j, r, e, s, p;        j = 0;        while ((((r=RR(1,6))&go)||(stop&&(!(r&stop))))&&(j++<PT_SPIN))                udelay(PT_SPIN_DEL);        if ((r&(STAT_ERR&stop))||(j>=PT_SPIN)) {           s = RR(0,7);           e = RR(0,1);           p = RR(0,2);           if (j >= PT_SPIN) e |= 0x100;           if (fun) printk("%s: %s %s: alt=0x%x stat=0x%x err=0x%x"                           " loop=%d phase=%d\n",                            PT.name,fun,msg,r,s,e,j,p);           return (e<<8)+s;        }        return 0;}static int pt_command( int unit, char * cmd, int dlen, char * fun ){       pi_connect(PI);        WR(0,6,DRIVE);        if (pt_wait(unit,STAT_BUSY|STAT_DRQ,0,fun,"before command")) {                pi_disconnect(PI);                return -1;        }        WR(0,4,dlen % 256);        WR(0,5,dlen / 256);        WR(0,7,0xa0);          /* ATAPI packet command */        if (pt_wait(unit,STAT_BUSY,STAT_DRQ,fun,"command DRQ")) {                pi_disconnect(PI);                return -1;        }        if (RR(0,2) != 1) {           printk("%s: %s: command phase error\n",PT.name,fun);           pi_disconnect(PI);           return -1;        }        pi_write_block(PI,cmd,12);        return 0;}static int pt_completion( int unit, char * buf, char * fun ){       int r, s, n, p;        r = pt_wait(unit,STAT_BUSY,STAT_DRQ|STAT_READY|STAT_ERR,			fun,"completion");        if (RR(0,7)&STAT_DRQ) {            n = (((RR(0,4)+256*RR(0,5))+3)&0xfffc);	   p = RR(0,2)&3;	   if (p == 0) pi_write_block(PI,buf,n);	   if (p == 2) pi_read_block(PI,buf,n);        }        s = pt_wait(unit,STAT_BUSY,STAT_READY|STAT_ERR,fun,"data done");        pi_disconnect(PI);         return (r?r:s);}static void pt_req_sense( int unit, int quiet ){       char    rs_cmd[12] = { ATAPI_REQ_SENSE,0,0,0,16,0,0,0,0,0,0,0 };        char    buf[16];        int     r;        r = pt_command(unit,rs_cmd,16,"Request sense");        mdelay(1);        if (!r) pt_completion(unit,buf,"Request sense");	PT.last_sense = -1;        if (!r) {	    if (!quiet) printk("%s: Sense key: %x, ASC: %x, ASQ: %x\n",                                    PT.name,buf[2]&0xf,buf[12],buf[13]);	    PT.last_sense = (buf[2]&0xf) | ((buf[12]&0xff)<<8)					 | ((buf[13]&0xff)<<16) ;	} }static int pt_atapi( int unit, char * cmd, int dlen, char * buf, char * fun ){       int r;        r = pt_command(unit,cmd,dlen,fun);        mdelay(1);        if (!r) r = pt_completion(unit,buf,fun);        if (r) pt_req_sense(unit,!fun);                return r;}static void pt_sleep( int cs ){       current->state = TASK_INTERRUPTIBLE;        schedule_timeout(cs);}static int pt_poll_dsc( int unit, int pause, int tmo, char *msg ){	int	k, e, s;	k = 0; e = 0; s = 0;	while (k < tmo) {		pt_sleep(pause);		k++;		pi_connect(PI);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女国产一区二区| 99视频一区二区| 中文字幕在线不卡一区二区三区| 色欲综合视频天天天| 国产在线观看免费一区| 亚洲第四色夜色| 国产精品成人网| 久久久久久久久久久久久久久99| 欧美亚洲丝袜传媒另类| 成人高清视频免费观看| 久久成人麻豆午夜电影| 一区二区三区不卡视频在线观看 | 久久成人免费网站| 亚洲一区在线观看网站| 中文字幕一区二区三区不卡在线 | 日本韩国精品在线| 波多野结衣在线一区| 精品一区二区三区影院在线午夜| 一区二区三区丝袜| 国产精品久久久久婷婷二区次| 日韩一级高清毛片| 这里只有精品免费| 欧美日韩亚洲综合| 色猫猫国产区一区二在线视频| 国产v综合v亚洲欧| 国产精品一二三四| 激情综合色综合久久综合| 日韩激情一二三区| 丝袜美腿亚洲色图| 视频一区免费在线观看| 亚洲成人手机在线| 亚洲bt欧美bt精品| 日韩在线一区二区三区| 性做久久久久久免费观看欧美| 亚洲愉拍自拍另类高清精品| 亚洲精品视频免费看| 1区2区3区国产精品| 国产精品美女久久久久aⅴ| 国产日韩欧美a| 国产精品视频第一区| 国产精品久久久爽爽爽麻豆色哟哟| 国产欧美一区二区精品久导航 | 亚洲成精国产精品女| 亚洲综合色噜噜狠狠| 一区二区三区精品在线观看| 亚洲精品欧美激情| 亚洲va国产天堂va久久en| 五月婷婷久久综合| 麻豆传媒一区二区三区| 蜜臀av一区二区在线免费观看| 九九精品一区二区| 国产精品18久久久久久vr| 国产成人精品一区二区三区网站观看| 国产成人免费视频网站| k8久久久一区二区三区| av高清久久久| 欧美色综合久久| 欧美一区二区视频在线观看 | 国产精品入口麻豆原神| 综合久久久久综合| 亚洲激情男女视频| 水蜜桃久久夜色精品一区的特点| 日韩激情一区二区| 国产91综合网| 在线观看日韩毛片| 日韩女优视频免费观看| 国产欧美日韩在线视频| 一区二区三区日韩在线观看| 日本亚洲视频在线| www.日韩av| 欧美丰满高潮xxxx喷水动漫| 久久毛片高清国产| 一区二区三区日韩在线观看| 久久99久国产精品黄毛片色诱| 国产69精品一区二区亚洲孕妇| 日本电影欧美片| 欧美大片日本大片免费观看| 18成人在线视频| 美女在线一区二区| 91网站在线播放| 日韩网站在线看片你懂的| 国产精品久久久久久久蜜臀| 肉丝袜脚交视频一区二区| 东方欧美亚洲色图在线| 欧美日韩在线播放三区| 亚洲国产精华液网站w| 日韩主播视频在线| av一二三不卡影片| 日韩欧美视频在线| 亚洲激情校园春色| 国产精选一区二区三区| 在线播放国产精品二区一二区四区| 精品国产123| 亚洲国产综合人成综合网站| 高清日韩电视剧大全免费| 欧美日产国产精品| 亚洲视频每日更新| 精品亚洲欧美一区| 欧美日韩免费不卡视频一区二区三区| 久久久久久久精| 日韩高清欧美激情| 91免费版在线| 日本一区二区三区四区 | 99久久99久久综合| 26uuu久久综合| 丝袜美腿亚洲色图| 欧美中文字幕一区| 中文字幕第一区第二区| 精品一区二区三区日韩| 7777精品伊人久久久大香线蕉最新版| 中文字幕日本乱码精品影院| 国模一区二区三区白浆| 欧美精品日韩一本| 亚洲一二三四在线观看| 9i看片成人免费高清| 国产女人18毛片水真多成人如厕| 激情五月激情综合网| 91麻豆精品国产| 日韩高清不卡在线| 777a∨成人精品桃花网| 午夜久久久影院| 欧美四级电影在线观看| 亚洲美女视频在线| 91丨九色丨蝌蚪丨老版| 国产精品久久久久久久久果冻传媒| 国产美女精品人人做人人爽| 欧美电视剧在线看免费| 久久不见久久见免费视频7 | 在线观看日产精品| 亚洲视频一区二区在线| 91麻豆精品一区二区三区| 国产精品美日韩| 99精品久久只有精品| 亚洲欧美偷拍卡通变态| 日本久久电影网| 一区二区三区日韩欧美| 欧美在线免费观看亚洲| 亚洲福利视频一区二区| 欧美精品一二三| 蜜桃视频在线观看一区| 久久综合九色欧美综合狠狠 | 处破女av一区二区| 国产精品久久久久久妇女6080| 成人免费av资源| 国产精品久久久久久久裸模| 91小视频免费观看| 亚洲一卡二卡三卡四卡无卡久久| 欧美日本一区二区在线观看| 性欧美大战久久久久久久久| 日韩一区二区三区视频| 久久国产乱子精品免费女| 欧美精品一区二区三区在线播放| 国产麻豆成人精品| 中文字幕一区二区三区在线播放 | 福利视频网站一区二区三区| 国产女人18水真多18精品一级做| aaa欧美色吧激情视频| 亚洲综合无码一区二区| 日韩精品一区二区三区中文不卡 | 亚洲一区二区欧美激情| 6080午夜不卡| 国产一区二区在线电影| 亚洲欧美自拍偷拍色图| 精品婷婷伊人一区三区三| 久久99国产精品久久| 国产精品美女久久久久aⅴ国产馆| 色哟哟在线观看一区二区三区| 天天影视涩香欲综合网| 久久久三级国产网站| 91麻豆文化传媒在线观看| 丝袜美腿亚洲一区二区图片| 国产午夜精品理论片a级大结局 | 伊人色综合久久天天人手人婷| 欧美日韩国产一级二级| 国内成人免费视频| 一区二区三区欧美日| 日韩精品一区二区三区swag| 不卡一区二区中文字幕| 日本一区中文字幕| 国产精品国产三级国产三级人妇| 欧美视频完全免费看| 风间由美中文字幕在线看视频国产欧美| 自拍偷拍欧美激情| 日韩免费看的电影| 一本大道av伊人久久综合| 久久精品72免费观看| 亚洲综合视频在线| 国产日韩欧美不卡在线| 91精品国产91久久久久久最新毛片 | 亚洲成人三级小说| 国产精品视频一二三| 日韩欧美一区二区免费| 色噜噜狠狠色综合中国| 国产一区二区在线看| 五月激情丁香一区二区三区| 国产精品色噜噜| 欧美大片一区二区| 欧美日韩国产电影| 色婷婷亚洲综合| 国产91精品在线观看|