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

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

?? imm.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* imm.c   --  low level driver for the IOMEGA MatchMaker * parallel port SCSI host adapter. *  * (The IMM is the embedded controller in the ZIP Plus drive.) *  * Current Maintainer: David Campbell (Perth, Western Australia) *                     campbell@torque.net * * My unoffical company acronym list is 21 pages long: *      FLA:    Four letter acronym with built in facility for *              future expansion to five letters. */#include <linux/config.h>/* The following #define is to avoid a clash with hosts.c */#define IMM_CODE 1#define IMM_PROBE_SPP   0x0001#define IMM_PROBE_PS2   0x0002#define IMM_PROBE_ECR   0x0010#define IMM_PROBE_EPP17 0x0100#define IMM_PROBE_EPP19 0x0200void imm_reset_pulse(unsigned int base);static int device_check(int host_no);#include <linux/blk.h>#include <asm/io.h>#include <linux/parport.h>#include "sd.h"#include "hosts.h"typedef struct {    struct pardevice *dev;	/* Parport device entry         */    int base;			/* Actual port address          */    int base_hi;		/* Hi Base address for ECP-ISA chipset */    int mode;			/* Transfer mode                */    int host;			/* Host number (for proc)       */    Scsi_Cmnd *cur_cmd;		/* Current queued command       */    struct tq_struct imm_tq;	/* Polling interrupt stuff       */    unsigned long jstart;	/* Jiffies at start             */    unsigned failed:1;		/* Failure flag                 */    unsigned dp:1;		/* Data phase present           */    unsigned rd:1;		/* Read data in data phase      */    unsigned p_busy:1;		/* Parport sharing busy flag    */} imm_struct;#define IMM_EMPTY \{	dev:		NULL,		\	base:		-1,		\	base_hi:	0,		\	mode:		IMM_AUTODETECT,	\	host:		-1,		\	cur_cmd:	NULL,		\	imm_tq:		{ routine: imm_interrupt },    \	jstart:		0,		\	failed:		0,		\	dp:		0,		\	rd:		0,		\	p_busy:		0		\}#include "imm.h"#define NO_HOSTS 4static imm_struct imm_hosts[NO_HOSTS] ={IMM_EMPTY, IMM_EMPTY, IMM_EMPTY, IMM_EMPTY};#define IMM_BASE(x)	imm_hosts[(x)].base#define IMM_BASE_HI(x)     imm_hosts[(x)].base_hiint parbus_base[NO_HOSTS] ={0x03bc, 0x0378, 0x0278, 0x0000};void imm_wakeup(void *ref){    imm_struct *imm_dev = (imm_struct *) ref;    if (!imm_dev->p_busy)	return;    if (parport_claim(imm_dev->dev)) {	printk("imm: bug in imm_wakeup\n");	return;    }    imm_dev->p_busy = 0;    imm_dev->base = imm_dev->dev->port->base;    if (imm_dev->cur_cmd)	imm_dev->cur_cmd->SCp.phase++;    return;}int imm_release(struct Scsi_Host *host){    int host_no = host->unique_id;    printk("Releasing imm%i\n", host_no);    parport_unregister_device(imm_hosts[host_no].dev);    return 0;}static int imm_pb_claim(int host_no){    if (parport_claim(imm_hosts[host_no].dev)) {	imm_hosts[host_no].p_busy = 1;	return 1;    }    if (imm_hosts[host_no].cur_cmd)	imm_hosts[host_no].cur_cmd->SCp.phase++;    return 0;}#define imm_pb_release(x) parport_release(imm_hosts[(x)].dev)/*************************************************************************** *                   Parallel port probing routines                        * ***************************************************************************/static Scsi_Host_Template driver_template = IMM;#include  "scsi_module.c"int imm_detect(Scsi_Host_Template * host){    struct Scsi_Host *hreg;    int ports;    int i, nhosts, try_again;    struct parport *pb;    /*     * unlock to allow the lowlevel parport driver to probe     * the irqs     */    spin_unlock_irq(&io_request_lock);    pb = parport_enumerate();    printk("imm: Version %s\n", IMM_VERSION);    nhosts = 0;    try_again = 0;    if (!pb) {	printk("imm: parport reports no devices.\n");	spin_lock_irq(&io_request_lock);	return 0;    }  retry_entry:    for (i = 0; pb; i++, pb = pb->next) {	int modes, ppb;	imm_hosts[i].dev =	    parport_register_device(pb, "imm", NULL, imm_wakeup,				    NULL, 0, (void *) &imm_hosts[i]);	if (!imm_hosts[i].dev)	    continue;	/* Claim the bus so it remembers what we do to the control	 * registers. [ CTR and ECP ]	 */	if (imm_pb_claim(i)) {	    unsigned long now = jiffies;	    while (imm_hosts[i].p_busy) {		schedule();	/* We are safe to schedule here */		if (time_after(jiffies, now + 3 * HZ)) {		    printk(KERN_ERR "imm%d: failed to claim parport because a "		      "pardevice is owning the port for too longtime!\n",			   i);		    parport_unregister_device (imm_hosts[i].dev);		    spin_lock_irq(&io_request_lock);		    return 0;		}	    }	}	ppb = IMM_BASE(i) = imm_hosts[i].dev->port->base;	IMM_BASE_HI(i) = imm_hosts[i].dev->port->base_hi;	w_ctr(ppb, 0x0c);	modes = imm_hosts[i].dev->port->modes;	/* Mode detection works up the chain of speed	 * This avoids a nasty if-then-else-if-... tree	 */	imm_hosts[i].mode = IMM_NIBBLE;	if (modes & PARPORT_MODE_TRISTATE)	    imm_hosts[i].mode = IMM_PS2;	/* Done configuration */	imm_pb_release(i);	if (imm_init(i)) {	    parport_unregister_device(imm_hosts[i].dev);	    continue;	}	/* now the glue ... */	switch (imm_hosts[i].mode) {	case IMM_NIBBLE:	    ports = 3;	    break;	case IMM_PS2:	    ports = 3;	    break;	case IMM_EPP_8:	case IMM_EPP_16:	case IMM_EPP_32:	    ports = 8;	    break;	default:		/* Never gets here */	    continue;	}	host->can_queue = IMM_CAN_QUEUE;	host->sg_tablesize = imm_sg;	hreg = scsi_register(host, 0);	if(hreg == NULL)		continue;	hreg->io_port = pb->base;	hreg->n_io_port = ports;	hreg->dma_channel = -1;	hreg->unique_id = i;	imm_hosts[i].host = hreg->host_no;	nhosts++;    }    if (nhosts == 0) {	if (try_again == 1) {	    spin_lock_irq(&io_request_lock);	    return 0;	}	try_again = 1;	goto retry_entry;    } else {	spin_lock_irq (&io_request_lock);	return 1;		/* return number of hosts detected */    }}/* This is to give the imm driver a way to modify the timings (and other * parameters) by writing to the /proc/scsi/imm/0 file. * Very simple method really... (To simple, no error checking :( ) * Reason: Kernel hackers HATE having to unload and reload modules for * testing... * Also gives a method to use a script to obtain optimum timings (TODO) */static inline int imm_proc_write(int hostno, char *buffer, int length){    unsigned long x;    if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {	x = simple_strtoul(buffer + 5, NULL, 0);	imm_hosts[hostno].mode = x;	return length;    }    printk("imm /proc: invalid variable\n");    return (-EINVAL);}int imm_proc_info(char *buffer, char **start, off_t offset,		  int length, int hostno, int inout){    int i;    int len = 0;    for (i = 0; i < 4; i++)	if (imm_hosts[i].host == hostno)	    break;    if (inout)	return imm_proc_write(i, buffer, length);    len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION);    len += sprintf(buffer + len, "Parport : %s\n", imm_hosts[i].dev->port->name);    len += sprintf(buffer + len, "Mode    : %s\n", IMM_MODE_STRING[imm_hosts[i].mode]);    /* Request for beyond end of buffer */    if (offset > len)	return 0;    *start = buffer + offset;    len -= offset;    if (len > length)	len = length;    return len;}#if IMM_DEBUG > 0#define imm_fail(x,y) printk("imm: imm_fail(%i) from %s at line %d\n",\	   y, __FUNCTION__, __LINE__); imm_fail_func(x,y);static inline void imm_fail_func(int host_no, int error_code)#elsestatic inline void imm_fail(int host_no, int error_code)#endif{    /* If we fail a device then we trash status / message bytes */    if (imm_hosts[host_no].cur_cmd) {	imm_hosts[host_no].cur_cmd->result = error_code << 16;	imm_hosts[host_no].failed = 1;    }}/* * Wait for the high bit to be set. *  * In principle, this could be tied to an interrupt, but the adapter * doesn't appear to be designed to support interrupts.  We spin on * the 0x80 ready bit.  */static unsigned char imm_wait(int host_no){    int k;    unsigned short ppb = IMM_BASE(host_no);    unsigned char r;    w_ctr(ppb, 0x0c);    k = IMM_SPIN_TMO;    do {	r = r_str(ppb);	k--;	udelay(1);    }    while (!(r & 0x80) && (k));    /*     * STR register (LPT base+1) to SCSI mapping:     *     * STR      imm     imm     * ===================================     * 0x80     S_REQ   S_REQ     * 0x40     !S_BSY  (????)     * 0x20     !S_CD   !S_CD     * 0x10     !S_IO   !S_IO     * 0x08     (????)  !S_BSY     *     * imm      imm     meaning     * ==================================     * 0xf0     0xb8    Bit mask     * 0xc0     0x88    ZIP wants more data     * 0xd0     0x98    ZIP wants to send more data     * 0xe0     0xa8    ZIP is expecting SCSI command data     * 0xf0     0xb8    end of transfer, ZIP is sending status     */    w_ctr(ppb, 0x04);    if (k)	return (r & 0xb8);    /* Counter expired - Time out occurred */    imm_fail(host_no, DID_TIME_OUT);    printk("imm timeout in imm_wait\n");    return 0;			/* command timed out */}static int imm_negotiate(imm_struct * tmp){    /*     * The following is supposedly the IEEE 1284-1994 negotiate     * sequence. I have yet to obtain a copy of the above standard     * so this is a bit of a guess...     *     * A fair chunk of this is based on the Linux parport implementation     * of IEEE 1284.     *     * Return 0 if data available     *        1 if no data available     */    unsigned short base = tmp->base;    unsigned char a, mode;    switch (tmp->mode) {    case IMM_NIBBLE:	mode = 0x00;	break;    case IMM_PS2:	mode = 0x01;	break;    default:	return 0;    }    w_ctr(base, 0x04);    udelay(5);    w_dtr(base, mode);    udelay(100);    w_ctr(base, 0x06);    udelay(5);    a = (r_str(base) & 0x20) ? 0 : 1;    udelay(5);    w_ctr(base, 0x07);    udelay(5);    w_ctr(base, 0x06);    if (a) {	printk("IMM: IEEE1284 negotiate indicates no data available.\n");	imm_fail(tmp->host, DID_ERROR);    }    return a;}/*  * Clear EPP timeout bit.  */static inline void epp_reset(unsigned short ppb){    int i;    i = r_str(ppb);    w_str(ppb, i);    w_str(ppb, i & 0xfe);}/*  * Wait for empty ECP fifo (if we are in ECP fifo mode only) */static inline void ecp_sync(unsigned short hostno){    int i, ppb_hi=IMM_BASE_HI(hostno);    if (ppb_hi == 0) return;    if ((r_ecr(ppb_hi) & 0xe0) == 0x60) { /* mode 011 == ECP fifo mode */        for (i = 0; i < 100; i++) {	    if (r_ecr(ppb_hi) & 0x01)	        return;	    udelay(5);	}        printk("imm: ECP sync failed as data still present in FIFO.\n");    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97久久精品人人爽人人爽蜜臀| 91国内精品野花午夜精品| 亚洲人吸女人奶水| 欧美一区三区二区| 99精品欧美一区二区三区小说| 丝袜美腿亚洲一区二区图片| 日本一二三不卡| 欧美久久久久久蜜桃| 不卡的av在线播放| 蜜桃久久精品一区二区| 伊人一区二区三区| 国产精品欧美久久久久无广告| 欧美精品 日韩| 91理论电影在线观看| 国产剧情一区二区| 日韩激情在线观看| 亚洲乱码中文字幕| 国产精品区一区二区三| 久久综合久久99| 日韩视频中午一区| 欧美日韩www| 在线看日本不卡| 北岛玲一区二区三区四区| 激情文学综合插| 日本三级亚洲精品| 午夜精品久久久久久久久| 一区二区免费在线播放| 亚洲婷婷综合色高清在线| 久久久久久久久99精品| 欧美精品一区二区久久久| 3d成人动漫网站| 欧美精三区欧美精三区| 91久久免费观看| 色吧成人激情小说| 色呦呦一区二区三区| 91亚洲精品久久久蜜桃网站| 国产高清久久久| 国产电影一区在线| 成人免费视频一区二区| 国产精品18久久久| 国产成人夜色高潮福利影视| 激情五月婷婷综合| 国产精品一区二区三区网站| 激情六月婷婷久久| 国产乱码精品1区2区3区| 国产在线精品一区二区三区不卡| 久久av老司机精品网站导航| 捆绑调教美女网站视频一区| 蜜臀av在线播放一区二区三区| 日韩中文字幕一区二区三区| 日本不卡123| 狠狠色伊人亚洲综合成人| 极品少妇一区二区三区精品视频| 国产麻豆日韩欧美久久| 福利一区二区在线观看| 国产成都精品91一区二区三| 国产成人av影院| 色综合久久中文综合久久牛| 色噜噜狠狠成人中文综合| 精品污污网站免费看| 欧美男男青年gay1069videost| 91精品国产一区二区| 26uuu亚洲| 国产精品人成在线观看免费| 亚洲欧美日韩国产成人精品影院 | 欧美无人高清视频在线观看| 欧美自拍丝袜亚洲| 日韩三区在线观看| 中文字幕成人网| 成人欧美一区二区三区黑人麻豆| 亚洲曰韩产成在线| 精品一区中文字幕| 成人国产精品免费观看| 在线观看日韩一区| 日韩亚洲国产中文字幕欧美| 久久亚洲捆绑美女| 一区二区三区精品视频| 美女看a上一区| 成人免费毛片aaaaa**| 欧洲中文字幕精品| 久久先锋资源网| 亚洲靠逼com| 久久精品99国产精品日本| 成人三级在线视频| 777午夜精品免费视频| 国产日韩欧美麻豆| 香蕉久久夜色精品国产使用方法| 九九九精品视频| 色综合久久久久综合| 日韩欧美精品在线视频| 国产精品久久久久aaaa| 午夜精品久久一牛影视| 成人动漫精品一区二区| 日韩欧美一二区| 亚洲精品乱码久久久久久| 国模一区二区三区白浆| 日本高清成人免费播放| 久久久久久免费毛片精品| 亚洲国产美女搞黄色| 国产精品456| 在线综合视频播放| 自拍偷拍亚洲综合| 国产白丝精品91爽爽久久| 欧美一区二区三区四区久久| 亚洲欧美电影院| 高清av一区二区| 精品日韩一区二区三区免费视频| 一区二区三区欧美激情| 国产91精品在线观看| 日韩欧美一二三区| 日韩和的一区二区| 99精品热视频| 欧美激情一区不卡| 激情综合网av| 欧美一区二区三区四区五区| 亚洲午夜视频在线观看| 成人高清视频在线观看| 久久午夜老司机| 另类专区欧美蜜桃臀第一页| 欧美日韩一区二区三区在线看 | 五月天久久比比资源色| 色综合久久中文综合久久牛| 欧美激情中文不卡| 国产综合久久久久久久久久久久 | 欧美午夜精品免费| 亚洲免费高清视频在线| 99久久久精品| 亚洲欧洲日韩av| av网站一区二区三区| 国产欧美日韩精品在线| 国产成人免费9x9x人网站视频| 欧美va亚洲va| 极品少妇一区二区| 精品免费视频.| 国产一区二区三区最好精华液| 日韩欧美电影一二三| 久久成人免费网| 精品成人一区二区三区| 久久疯狂做爰流白浆xx| 日韩欧美高清一区| 精品一二三四在线| 久久综合九色综合久久久精品综合| 韩国一区二区视频| 国产亚洲一区二区三区在线观看| 国产在线精品一区在线观看麻豆| 久久久精品综合| 99视频热这里只有精品免费| 国产精品久久久久一区二区三区| 国产99久久久国产精品潘金| 国产色产综合产在线视频| 成人av在线播放网址| 亚洲人成网站在线| 欧美综合欧美视频| 日韩激情av在线| 日韩欧美国产麻豆| 粉嫩绯色av一区二区在线观看| 国产精品免费网站在线观看| 色综合天天天天做夜夜夜夜做| 一区二区三区电影在线播| 欧美日韩第一区日日骚| 久久成人av少妇免费| 国产喷白浆一区二区三区| av毛片久久久久**hd| 亚洲福利一区二区| 精品久久久久久久久久久久包黑料| 国产麻豆精品一区二区| 亚洲精品少妇30p| 91精品久久久久久久久99蜜臂| 久久99九九99精品| 国产精品久久久久久一区二区三区 | 日韩女优视频免费观看| 国产精品69久久久久水密桃| 亚洲三级免费电影| 91精品国产色综合久久不卡电影 | 国产一区二区三区高清播放| 1024精品合集| 日韩写真欧美这视频| 国产成a人亚洲| 天涯成人国产亚洲精品一区av| 日韩欧美在线不卡| 成人高清免费在线播放| 亚洲国产日韩在线一区模特| 久久久久久免费网| 欧美日韩国产美女| 成人污污视频在线观看| 日韩精品电影一区亚洲| 中文字幕在线免费不卡| 欧美一级黄色大片| 91蜜桃免费观看视频| 麻豆精品一区二区| 亚洲免费在线看| 717成人午夜免费福利电影| 成人精品鲁一区一区二区| 午夜电影一区二区三区| 国产精品久久一卡二卡| 日韩午夜激情av| 欧美日韩国产小视频在线观看| 不卡的av在线| 国产美女在线精品| 免费精品视频在线|