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

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

?? ide-cs.c

?? 講述linux的初始化過程
?? C
字號:
/*======================================================================    A driver for PCMCIA IDE/ATA disk cards    ide_cs.c 1.26 1999/11/16 02:10:49    The contents of this file are subject to the Mozilla Public    License Version 1.1 (the "License"); you may not use this file    except in compliance with the License. You may obtain a copy of    the License at http://www.mozilla.org/MPL/    Software distributed under the License is distributed on an "AS    IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or    implied. See the License for the specific language governing    rights and limitations under the License.    The initial developer of the original code is David A. Hinds    <dhinds@pcmcia.sourceforge.org>.  Portions created by David A. Hinds    are Copyright (C) 1999 David A. Hinds.  All Rights Reserved.    Alternatively, the contents of this file may be used under the    terms of the GNU Public License version 2 (the "GPL"), in which    case the provisions of the GPL are applicable instead of the    above.  If you wish to allow the use of your version of this file    only under the terms of the GPL and not to allow others to use    your version of this file under the MPL, indicate your decision    by deleting the provisions above and replace them with the notice    and other provisions required by the GPL.  If you do not delete    the provisions above, a recipient may use your version of this    file under either the MPL or the GPL.    ======================================================================*/#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/ptrace.h>#include <linux/malloc.h>#include <linux/string.h>#include <linux/timer.h>#include <linux/ioport.h>#include <linux/hdreg.h>#include <linux/major.h>#include <asm/io.h>#include <asm/system.h>#include <pcmcia/version.h>#include <pcmcia/cs_types.h>#include <pcmcia/cs.h>#include <pcmcia/cistpl.h>#include <pcmcia/ds.h>#include <pcmcia/cisreg.h>#ifdef PCMCIA_DEBUGstatic int pc_debug = PCMCIA_DEBUG;MODULE_PARM(pc_debug, "i");#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)static char *version ="ide_cs.c 1.26 1999/11/16 02:10:49 (David Hinds)";#else#define DEBUG(n, args...)#endif/*====================================================================*//* Parameters that can be set with 'insmod' *//* Bit map of interrupts to choose from */static u_int irq_mask = 0xdeb8;static int irq_list[4] = { -1 };MODULE_PARM(irq_mask, "i");MODULE_PARM(irq_list, "1-4i");/*====================================================================*/static const char ide_major[] = {    IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR,#ifdef IDE4_MAJOR    IDE4_MAJOR, IDE5_MAJOR#endif};typedef struct ide_info_t {    dev_link_t	link;    int		ndev;    dev_node_t	node;    int		hd;} ide_info_t;static void ide_config(dev_link_t *link);static void ide_release(u_long arg);static int ide_event(event_t event, int priority,		     event_callback_args_t *args);static dev_info_t dev_info = "ide_cs";static dev_link_t *ide_attach(void);static void ide_detach(dev_link_t *);static dev_link_t *dev_list = NULL;/*====================================================================*/static void cs_error(client_handle_t handle, int func, int ret){    error_info_t err = { func, ret };    CardServices(ReportError, handle, &err);}/*======================================================================    ide_attach() creates an "instance" of the driver, allocating    local data structures for one device.  The device is registered    with Card Services.======================================================================*/static dev_link_t *ide_attach(void){    ide_info_t *info;    dev_link_t *link;    client_reg_t client_reg;    int i, ret;        DEBUG(0, "ide_attach()\n");    /* Create new ide device */    info = kmalloc(sizeof(*info), GFP_KERNEL);    if (!info) return NULL;    memset(info, 0, sizeof(*info));    link = &info->link; link->priv = info;    link->release.function = &ide_release;    link->release.data = (u_long)link;    link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;    link->io.Attributes2 = IO_DATA_PATH_WIDTH_8;    link->io.IOAddrLines = 3;    link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;    link->irq.IRQInfo1 = IRQ_INFO2_VALID|IRQ_LEVEL_ID;    if (irq_list[0] == -1)	link->irq.IRQInfo2 = irq_mask;    else	for (i = 0; i < 4; i++)	    link->irq.IRQInfo2 |= 1 << irq_list[i];    link->conf.Attributes = CONF_ENABLE_IRQ;    link->conf.Vcc = 50;    link->conf.IntType = INT_MEMORY_AND_IO;        /* Register with Card Services */    link->next = dev_list;    dev_list = link;    client_reg.dev_info = &dev_info;    client_reg.Attributes = INFO_IO_CLIENT | INFO_CARD_SHARE;    client_reg.EventMask =	CS_EVENT_CARD_INSERTION | CS_EVENT_CARD_REMOVAL |	CS_EVENT_RESET_PHYSICAL | CS_EVENT_CARD_RESET |	CS_EVENT_PM_SUSPEND | CS_EVENT_PM_RESUME;    client_reg.event_handler = &ide_event;    client_reg.Version = 0x0210;    client_reg.event_callback_args.client_data = link;    ret = CardServices(RegisterClient, &link->handle, &client_reg);    if (ret != CS_SUCCESS) {	cs_error(link->handle, RegisterClient, ret);	ide_detach(link);	return NULL;    }        return link;} /* ide_attach *//*======================================================================    This deletes a driver "instance".  The device is de-registered    with Card Services.  If it has been released, all local data    structures are freed.  Otherwise, the structures will be freed    when the device is released.======================================================================*/static void ide_detach(dev_link_t *link){    dev_link_t **linkp;    int ret;    DEBUG(0, "ide_detach(0x%p)\n", link);        /* Locate device structure */    for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)	if (*linkp == link) break;    if (*linkp == NULL)	return;    del_timer(&link->release);    if (link->state & DEV_CONFIG)	ide_release((u_long)link);        if (link->handle) {	ret = CardServices(DeregisterClient, link->handle);	if (ret != CS_SUCCESS)	    cs_error(link->handle, DeregisterClient, ret);    }        /* Unlink, free device structure */    *linkp = link->next;    kfree(link->priv);    } /* ide_detach *//*======================================================================    ide_config() is scheduled to run after a CARD_INSERTION event    is received, to configure the PCMCIA socket, and to make the    ide device available to the system.======================================================================*/#define CS_CHECK(fn, args...) \while ((last_ret=CardServices(last_fn=(fn), args))!=0) goto cs_failed#define CFG_CHECK(fn, args...) \if (CardServices(fn, args) != 0) goto next_entryvoid ide_config(dev_link_t *link){    client_handle_t handle = link->handle;    ide_info_t *info = link->priv;    tuple_t tuple;    u_short buf[128];    cisparse_t parse;    config_info_t conf;    cistpl_cftable_entry_t *cfg = &parse.cftable_entry;    cistpl_cftable_entry_t dflt = { 0 };    int i, pass, last_ret, last_fn, hd=-1, io_base, ctl_base;    DEBUG(0, "ide_config(0x%p)\n", link);        tuple.TupleData = (cisdata_t *)buf;    tuple.TupleOffset = 0; tuple.TupleDataMax = 255;    tuple.Attributes = 0;    tuple.DesiredTuple = CISTPL_CONFIG;    CS_CHECK(GetFirstTuple, handle, &tuple);    CS_CHECK(GetTupleData, handle, &tuple);    CS_CHECK(ParseTuple, handle, &tuple, &parse);    link->conf.ConfigBase = parse.config.base;    link->conf.Present = parse.config.rmask[0];        /* Configure card */    link->state |= DEV_CONFIG;    /* Not sure if this is right... look up the current Vcc */    CS_CHECK(GetConfigurationInfo, handle, &conf);    link->conf.Vcc = conf.Vcc;        pass = io_base = ctl_base = 0;    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;    tuple.Attributes = 0;    CS_CHECK(GetFirstTuple, handle, &tuple);    while (1) {	CFG_CHECK(GetTupleData, handle, &tuple);	CFG_CHECK(ParseTuple, handle, &tuple, &parse);	/* Check for matching Vcc, unless we're desperate */	if (!pass) {	    if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {		if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM]/10000)		    goto next_entry;	    } else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {		if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM]/10000)		    goto next_entry;	    }	}		if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))	    link->conf.Vpp1 = link->conf.Vpp2 =		cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;	else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM))	    link->conf.Vpp1 = link->conf.Vpp2 =		dflt.vpp1.param[CISTPL_POWER_VNOM]/10000;		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {	    cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;	    link->conf.ConfigIndex = cfg->index;	    link->io.BasePort1 = io->win[0].base;	    link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;	    if (!(io->flags & CISTPL_IO_16BIT))		link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;	    if (io->nwin == 2) {		link->io.NumPorts1 = 8;		link->io.BasePort2 = io->win[1].base;		link->io.NumPorts2 = 1;		CFG_CHECK(RequestIO, link->handle, &link->io);		io_base = link->io.BasePort1;		ctl_base = link->io.BasePort2;	    } else if ((io->nwin == 1) && (io->win[0].len >= 16)) {		link->io.NumPorts1 = io->win[0].len;		link->io.NumPorts2 = 0;		CFG_CHECK(RequestIO, link->handle, &link->io);		io_base = link->io.BasePort1;		ctl_base = link->io.BasePort1+0x0e;	    } else goto next_entry;	    /* If we've got this far, we're done */	    break;	}	    next_entry:	if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;	if (pass) {	    CS_CHECK(GetNextTuple, handle, &tuple);	} else if (CardServices(GetNextTuple, handle, &tuple) != 0) {	    CS_CHECK(GetFirstTuple, handle, &tuple);	    memset(&dflt, 0, sizeof(dflt));	    pass++;	}    }        CS_CHECK(RequestIRQ, handle, &link->irq);    CS_CHECK(RequestConfiguration, handle, &link->conf);    /* deal with brain dead IDE resource management */    release_region(link->io.BasePort1, link->io.NumPorts1);    if (link->io.NumPorts2)	release_region(link->io.BasePort2, link->io.NumPorts2);    /* retry registration in case device is still spinning up */    for (i = 0; i < 10; i++) {	hd = ide_register(io_base, ctl_base, link->irq.AssignedIRQ);	if (hd >= 0) break;	if (link->io.NumPorts1 == 0x20) {	    hd = ide_register(io_base+0x10, ctl_base+0x10,			      link->irq.AssignedIRQ);	    if (hd >= 0) {		io_base += 0x10; ctl_base += 0x10;		break;	    }	}	__set_current_state(TASK_UNINTERRUPTIBLE);	schedule_timeout(HZ/10);    }        if (hd < 0) {	printk(KERN_NOTICE "ide_cs: ide_register() at 0x%03x & 0x%03x"	       ", irq %u failed\n", io_base, ctl_base,	       link->irq.AssignedIRQ);	goto failed;    }    MOD_INC_USE_COUNT;    info->ndev = 1;    sprintf(info->node.dev_name, "hd%c", 'a'+(hd*2));    info->node.major = ide_major[hd];    info->node.minor = 0;    info->hd = hd;    link->dev = &info->node;    printk(KERN_INFO "ide_cs: %s: Vcc = %d.%d, Vpp = %d.%d\n",	   info->node.dev_name, link->conf.Vcc/10, link->conf.Vcc%10,	   link->conf.Vpp1/10, link->conf.Vpp1%10);    link->state &= ~DEV_CONFIG_PENDING;    return;    cs_failed:    cs_error(link->handle, last_fn, last_ret);failed:    ide_release((u_long)link);} /* ide_config *//*======================================================================    After a card is removed, ide_release() will unregister the net    device, and release the PCMCIA configuration.  If the device is    still open, this will be postponed until it is closed.    ======================================================================*/void ide_release(u_long arg){    dev_link_t *link = (dev_link_t *)arg;    ide_info_t *info = link->priv;        DEBUG(0, "ide_release(0x%p)\n", link);    if (info->ndev) {	ide_unregister(info->hd);	MOD_DEC_USE_COUNT;    }    info->ndev = 0;    link->dev = NULL;        CardServices(ReleaseConfiguration, link->handle);    CardServices(ReleaseIO, link->handle, &link->io);    CardServices(ReleaseIRQ, link->handle, &link->irq);        link->state &= ~DEV_CONFIG;} /* ide_release *//*======================================================================    The card status event handler.  Mostly, this schedules other    stuff to run after an event is received.  A CARD_REMOVAL event    also sets some flags to discourage the ide drivers from    talking to the ports.    ======================================================================*/int ide_event(event_t event, int priority,	      event_callback_args_t *args){    dev_link_t *link = args->client_data;    DEBUG(1, "ide_event(0x%06x)\n", event);        switch (event) {    case CS_EVENT_CARD_REMOVAL:	link->state &= ~DEV_PRESENT;	if (link->state & DEV_CONFIG)	    mod_timer(&link->release, jiffies + HZ/20);	break;    case CS_EVENT_CARD_INSERTION:	link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;	ide_config(link);	break;    case CS_EVENT_PM_SUSPEND:	link->state |= DEV_SUSPEND;	/* Fall through... */    case CS_EVENT_RESET_PHYSICAL:	if (link->state & DEV_CONFIG)	    CardServices(ReleaseConfiguration, link->handle);	break;    case CS_EVENT_PM_RESUME:	link->state &= ~DEV_SUSPEND;	/* Fall through... */    case CS_EVENT_CARD_RESET:	if (DEV_OK(link))	    CardServices(RequestConfiguration, link->handle, &link->conf);	break;    }    return 0;} /* ide_event *//*====================================================================*/static int __init init_ide_cs(void){    servinfo_t serv;    DEBUG(0, "%s\n", version);    CardServices(GetCardServicesInfo, &serv);    if (serv.Revision != CS_RELEASE_CODE) {	printk(KERN_NOTICE "ide_cs: Card Services release "	       "does not match!\n");	return -1;    }    register_pccard_driver(&dev_info, &ide_attach, &ide_detach);    return 0;}static void __exit exit_ide_cs(void){    DEBUG(0, "ide_cs: unloading\n");    unregister_pccard_driver(&dev_info);    while (dev_list != NULL)	ide_detach(dev_list);}module_init(init_ide_cs);module_exit(exit_ide_cs);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品视频一区| 97久久超碰国产精品| 国产福利91精品一区| 成人一区二区三区视频| 欧洲色大大久久| 欧美一区二区高清| 中文字幕不卡在线观看| 亚洲一区二区四区蜜桃| 麻豆精品国产传媒mv男同| 成人动漫在线一区| 欧美乱妇20p| 国产日韩精品久久久| 亚洲国产一区二区在线播放| 久久er99热精品一区二区| 99精品一区二区三区| 在线观看91精品国产麻豆| 国产午夜精品一区二区三区嫩草| 亚洲激情av在线| 国产一区二三区| 欧美探花视频资源| 中文字幕精品三区| 日本在线不卡一区| av电影在线观看一区| 欧美一二三区精品| 亚洲人妖av一区二区| 久久成人久久爱| 欧美视频一区二区三区在线观看| 久久久高清一区二区三区| 亚洲777理论| 成人黄页毛片网站| 欧美一级二级在线观看| 一区二区三区日韩| 大尺度一区二区| 日韩一区二区精品在线观看| 亚洲综合色在线| jlzzjlzz亚洲女人18| 精品久久国产97色综合| 亚洲自拍偷拍麻豆| www.欧美亚洲| 精品久久人人做人人爽| 五月天激情小说综合| 91亚洲精品久久久蜜桃| 国产视频在线观看一区二区三区| 蜜臀av一区二区| 欧美精品色综合| 亚洲精品国久久99热| 成人免费福利片| 久久久不卡网国产精品一区| 蜜臀av在线播放一区二区三区| 在线亚洲欧美专区二区| 中文字幕亚洲区| 国产成人精品一区二区三区四区| 制服丝袜av成人在线看| 一区二区三区国产精华| jizz一区二区| 国产女主播在线一区二区| 九色|91porny| 日韩免费看的电影| 五月天丁香久久| 欧美精品丝袜久久久中文字幕| 亚洲欧美日韩中文字幕一区二区三区 | 激情综合网最新| 91精品国产一区二区| 亚洲bt欧美bt精品777| 欧美性视频一区二区三区| 亚洲欧美日韩在线| 色哟哟国产精品| 最新久久zyz资源站| youjizz国产精品| 成人欧美一区二区三区在线播放| 国产不卡视频在线观看| 国产午夜精品理论片a级大结局| 国产一区二区中文字幕| 久久新电视剧免费观看| 精品亚洲欧美一区| 久久免费精品国产久精品久久久久| 久久www免费人成看片高清| 精品国产亚洲在线| 国产在线精品不卡| 国产午夜精品一区二区三区视频| 国产69精品久久99不卡| 中文乱码免费一区二区| av电影在线观看一区| 亚洲欧美一区二区三区极速播放| 91蝌蚪porny| 亚洲国产一区二区三区| 5858s免费视频成人| 欧美a一区二区| 久久一日本道色综合| 国产成人午夜精品5599| 国产精品久久久久一区二区三区| av电影在线不卡| 亚洲福中文字幕伊人影院| 欧美一区二区三区在线视频| 激情综合色综合久久| 国产欧美日韩综合精品一区二区| 99久久久精品| 无码av免费一区二区三区试看| 欧美一二区视频| 国产成人精品免费视频网站| 国产精品免费看片| 欧美在线观看一二区| 蜜桃一区二区三区在线| 国产女同性恋一区二区| 色综合久久88色综合天天免费| 亚洲一级电影视频| 日韩免费观看高清完整版 | 国产免费观看久久| 一本色道亚洲精品aⅴ| 石原莉奈在线亚洲二区| 久久综合久久综合久久综合| 99国产精品久久久| 日韩精品国产精品| 国产精品女主播在线观看| 欧洲精品在线观看| 精品一区二区久久久| 亚洲人精品一区| 精品免费99久久| 色8久久精品久久久久久蜜| 麻豆精品在线观看| 国产精品国产三级国产aⅴ无密码| 欧美另类久久久品| 成人精品视频一区二区三区尤物| 亚洲大型综合色站| 国产丝袜欧美中文另类| 欧美日韩一区小说| 成人夜色视频网站在线观看| 日日夜夜精品免费视频| 中文字幕一区二区三区不卡| 欧美一区二区三区免费在线看| 成人av网站在线观看免费| 蜜臀av一区二区在线免费观看| 亚洲日韩欧美一区二区在线| 日韩女优av电影在线观看| 91久久久免费一区二区| 国产精品系列在线播放| 日日夜夜精品视频免费| 亚洲人成在线观看一区二区| 久久久精品蜜桃| 91精品国产色综合久久久蜜香臀| av中文字幕亚洲| 国产在线精品一区二区不卡了| 亚洲风情在线资源站| 国产精品女主播av| 久久综合九色综合欧美就去吻| 欧美日产在线观看| 91在线观看美女| 国产精品小仙女| 免费观看91视频大全| 亚洲一区二区三区在线看| 欧美高清在线精品一区| 精品动漫一区二区三区在线观看| 欧美日韩在线不卡| 色一情一伦一子一伦一区| 风间由美一区二区av101 | 久久综合精品国产一区二区三区 | 亚洲成人综合视频| 中文字幕一区不卡| 日本一区二区三区国色天香| 欧美变态tickle挠乳网站| 欧美日韩在线电影| 欧美在线视频日韩| 色综合天天在线| 成人美女视频在线观看18| 国内精品第一页| 麻豆国产精品777777在线| 午夜精品一区在线观看| 亚洲午夜免费视频| 亚洲另类色综合网站| 国产精品久久福利| 中文字幕高清不卡| 欧美激情中文字幕一区二区| 久久精品网站免费观看| 久久久久久久国产精品影院| 精品国产一区二区亚洲人成毛片| 欧美一卡二卡在线| 9191精品国产综合久久久久久| 欧美最猛性xxxxx直播| 欧美中文字幕一区| 在线观看一区二区视频| 日本韩国欧美三级| 91国产福利在线| 欧美视频在线观看一区二区| 欧美日韩综合不卡| 欧美日韩精品福利| 欧美一区二区视频免费观看| 日韩欧美区一区二| 精品国产成人在线影院| 欧美精品一区二区三| 久久久精品国产免费观看同学| 国产三级三级三级精品8ⅰ区| 久久精品视频免费观看| 国产精品天干天干在线综合| 国产精品久久久久久久久晋中 | 国产一区不卡视频| 国产老妇另类xxxxx| 国产成人自拍网| 国产.精品.日韩.另类.中文.在线.播放| 国产精品亚洲第一区在线暖暖韩国| 国产精品原创巨作av|