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

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

?? ide-cs.c

?? h內核
?? C
字號:
/*======================================================================    A driver for PCMCIA IDE/ATA disk cards    ide-cs.c 1.3 2002/10/26 05:45:31    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    <dahinds@users.sourceforge.net>.  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 General 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/slab.h>#include <linux/string.h>#include <linux/timer.h>#include <linux/ioport.h>#include <linux/ide.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>#include <pcmcia/ciscode.h>/*====================================================================*//* Module parameters */MODULE_AUTHOR("David Hinds <dahinds@users.sourceforge.net>");MODULE_DESCRIPTION("PCMCIA ATA/IDE card driver");MODULE_LICENSE("Dual MPL/GPL");#define INT_MODULE_PARM(n, v) static int n = v; module_param(n, int, 0)#ifdef PCMCIA_DEBUGINT_MODULE_PARM(pc_debug, PCMCIA_DEBUG);#define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args)static char *version ="ide-cs.c 1.3 2002/10/26 05:45:31 (David Hinds)";#else#define DEBUG(n, args...)#endif/*====================================================================*/static const char ide_major[] = {    IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR,    IDE4_MAJOR, IDE5_MAJOR};typedef struct ide_info_t {    dev_link_t	link;    int		ndev;    dev_node_t	node;    int		hd;} ide_info_t;static void ide_release(dev_link_t *);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;/*======================================================================    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 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->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_LEVEL_ID;    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.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 = pcmcia_register_client(&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;    if (link->state & DEV_CONFIG)	ide_release(link);        if (link->handle) {	ret = pcmcia_deregister_client(link->handle);	if (ret != CS_SUCCESS)	    cs_error(link->handle, DeregisterClient, ret);    }        /* Unlink, free device structure */    *linkp = link->next;    kfree(link->priv);    } /* ide_detach */static int idecs_register(unsigned long io, unsigned long ctl, unsigned long irq){    hw_regs_t hw;    memset(&hw, 0, sizeof(hw));    ide_init_hwif_ports(&hw, io, ctl, NULL);    hw.irq = irq;    hw.chipset = ide_pci;    return ide_register_hw_with_fixup(&hw, NULL, ide_undecoded_slave);}/*======================================================================    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, ret) \do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0)static void ide_config(dev_link_t *link){    client_handle_t handle = link->handle;    ide_info_t *info = link->priv;    tuple_t tuple;    struct {	u_short		buf[128];	cisparse_t	parse;	config_info_t	conf;	cistpl_cftable_entry_t dflt;    } *stk = NULL;    cistpl_cftable_entry_t *cfg;    int i, pass, last_ret = 0, last_fn = 0, hd, is_kme = 0;    unsigned long io_base, ctl_base;    DEBUG(0, "ide_config(0x%p)\n", link);    stk = kmalloc(sizeof(*stk), GFP_KERNEL);    if (!stk) goto err_mem;    memset(stk, 0, sizeof(*stk));    cfg = &stk->parse.cftable_entry;    tuple.TupleData = (cisdata_t *)&stk->buf;    tuple.TupleOffset = 0;    tuple.TupleDataMax = 255;    tuple.Attributes = 0;    tuple.DesiredTuple = CISTPL_CONFIG;    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));    CS_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &stk->parse));    link->conf.ConfigBase = stk->parse.config.base;    link->conf.Present = stk->parse.config.rmask[0];    tuple.DesiredTuple = CISTPL_MANFID;    if (!pcmcia_get_first_tuple(handle, &tuple) &&	!pcmcia_get_tuple_data(handle, &tuple) &&	!pcmcia_parse_tuple(handle, &tuple, &stk->parse))	is_kme = ((stk->parse.manfid.manf == MANFID_KME) &&		  ((stk->parse.manfid.card == PRODID_KME_KXLC005_A) ||		   (stk->parse.manfid.card == PRODID_KME_KXLC005_B)));    /* Configure card */    link->state |= DEV_CONFIG;    /* Not sure if this is right... look up the current Vcc */    CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &stk->conf));    link->conf.Vcc = stk->conf.Vcc;    pass = io_base = ctl_base = 0;    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;    tuple.Attributes = 0;    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));    while (1) {    	if (pcmcia_get_tuple_data(handle, &tuple) != 0) goto next_entry;	if (pcmcia_parse_tuple(handle, &tuple, &stk->parse) != 0) goto next_entry;	/* Check for matching Vcc, unless we're desperate */	if (!pass) {	    if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {		if (stk->conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000)		    goto next_entry;	    } else if (stk->dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {		if (stk->conf.Vcc != stk->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 (stk->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))	    link->conf.Vpp1 = link->conf.Vpp2 =		stk->dflt.vpp1.param[CISTPL_POWER_VNOM] / 10000;	if ((cfg->io.nwin > 0) || (stk->dflt.io.nwin > 0)) {	    cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &stk->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 = (is_kme) ? 2 : 1;		if (pcmcia_request_io(link->handle, &link->io) != 0)			goto next_entry;		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;		if (pcmcia_request_io(link->handle, &link->io) != 0)			goto next_entry;		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)	    memcpy(&stk->dflt, cfg, sizeof(stk->dflt));	if (pass) {	    CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));	} else if (pcmcia_get_next_tuple(handle, &tuple) != 0) {	    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));	    memset(&stk->dflt, 0, sizeof(stk->dflt));	    pass++;	}    }    CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));    /* disable drive interrupts during IDE probe */    outb(0x02, ctl_base);    /* special setup for KXLC005 card */    if (is_kme)	outb(0x81, ctl_base+1);    /* retry registration in case device is still spinning up */    for (hd = -1, i = 0; i < 10; i++) {	hd = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ);	if (hd >= 0) break;	if (link->io.NumPorts1 == 0x20) {	    outb(0x02, ctl_base + 0x10);	    hd = idecs_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%3lx & 0x%3lx"	       ", irq %u failed\n", io_base, ctl_base,	       link->irq.AssignedIRQ);	goto failed;    }    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;    kfree(stk);    return;err_mem:    printk(KERN_NOTICE "ide-cs: ide_config failed memory allocation\n");    goto failed;cs_failed:    cs_error(link->handle, last_fn, last_ret);failed:    kfree(stk);    ide_release(link);    link->state &= ~DEV_CONFIG_PENDING;} /* 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(dev_link_t *link){    ide_info_t *info = link->priv;        DEBUG(0, "ide_release(0x%p)\n", link);    if (info->ndev) {	/* FIXME: if this fails we need to queue the cleanup somehow	   -- need to investigate the required PCMCIA magic */	ide_unregister(info->hd);    }    info->ndev = 0;    link->dev = NULL;        pcmcia_release_configuration(link->handle);    pcmcia_release_io(link->handle, &link->io);    pcmcia_release_irq(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)		ide_release(link);	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)	    pcmcia_release_configuration(link->handle);	break;    case CS_EVENT_PM_RESUME:	link->state &= ~DEV_SUSPEND;	/* Fall through... */    case CS_EVENT_CARD_RESET:	if (DEV_OK(link))	    pcmcia_request_configuration(link->handle, &link->conf);	break;    }    return 0;} /* ide_event */static struct pcmcia_driver ide_cs_driver = {	.owner		= THIS_MODULE,	.drv		= {		.name	= "ide-cs",	},	.attach		= ide_attach,	.detach		= ide_detach,};static int __init init_ide_cs(void){	return pcmcia_register_driver(&ide_cs_driver);}static void __exit exit_ide_cs(void){	pcmcia_unregister_driver(&ide_cs_driver);	BUG_ON(dev_list != NULL);}module_init(init_ide_cs);module_exit(exit_ide_cs);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲特级片在线| 国模无码大尺度一区二区三区| 欧美电视剧在线观看完整版| 欧美一级xxx| 国产欧美一区二区三区在线看蜜臀| 亚洲欧美日韩中文字幕一区二区三区| 一区二区三区在线播放| 蜜臂av日日欢夜夜爽一区| 国产精品亚洲午夜一区二区三区 | 678五月天丁香亚洲综合网| 久久亚洲精华国产精华液| 日韩伦理免费电影| 另类小说图片综合网| 色综合天天视频在线观看| 日韩一级在线观看| 亚洲精品欧美专区| 国产尤物一区二区| 欧美美女一区二区三区| 欧美韩国日本不卡| 美女网站色91| 欧美在线啊v一区| 亚洲欧美日韩电影| 成人综合在线观看| 中文字幕精品三区| 国产成人免费在线视频| 制服.丝袜.亚洲.另类.中文| 最新成人av在线| 国产精品99久久久久久似苏梦涵 | 日韩一卡二卡三卡四卡| 亚洲精品视频免费观看| 成人sese在线| 国产亚洲一区二区三区四区| 欧美aaa在线| 欧美猛男男办公室激情| 亚洲激情在线激情| caoporn国产一区二区| 久久精品视频一区二区三区| 亚洲黄色在线视频| 色噜噜狠狠色综合欧洲selulu| 国产欧美日韩亚州综合| 免费不卡在线视频| 欧美精品一区二区精品网| 蜜桃视频一区二区三区在线观看| 欧美人伦禁忌dvd放荡欲情| 亚洲精品乱码久久久久久黑人| 国内精品免费**视频| 日韩情涩欧美日韩视频| 日韩av午夜在线观看| 欧美高清视频一二三区 | 亚洲视频图片小说| av电影天堂一区二区在线观看| 日韩欧美国产综合| 久久国产精品99久久久久久老狼 | 久久久九九九九| 久久国产乱子精品免费女| 久久午夜老司机| 91蜜桃视频在线| 丝袜亚洲另类欧美| 国产亚洲婷婷免费| 色94色欧美sute亚洲线路一久 | 91精品国产一区二区| 国产一区二区三区美女| 成人免费在线播放视频| 欧美伦理影视网| 国产高清精品在线| 亚洲一区二区三区免费视频| 欧美一区二区三区免费观看视频| 国产乱子伦视频一区二区三区 | 国产乱子轮精品视频| 亚洲美女视频一区| 精品国产伦一区二区三区免费| 成人av在线电影| 免费美女久久99| 亚洲欧美一区二区久久| 精品剧情在线观看| 91九色最新地址| 国产精品一区二区在线看| 一区二区激情视频| 国产欧美日韩激情| 欧美一区二区国产| 在线免费av一区| 国产成人亚洲综合a∨婷婷 | 日韩免费高清av| 色天天综合久久久久综合片| 国产乱对白刺激视频不卡 | 中文字幕在线观看不卡| 日韩一级黄色大片| 91电影在线观看| 成人免费视频视频在线观看免费 | 亚洲妇女屁股眼交7| 久久久www成人免费毛片麻豆| 欧美日韩国产一二三| 成人免费高清视频| 久久99国产精品久久99| 亚洲国产视频在线| 亚洲欧美电影一区二区| 久久久国产综合精品女国产盗摄| 91精品国产综合久久福利软件| 91亚洲精华国产精华精华液| 国产九色精品成人porny| 免费国产亚洲视频| 亚洲成a人v欧美综合天堂下载| 亚洲精品视频在线| 中文字幕一区二区三区精华液| 久久亚洲捆绑美女| 久久久久久97三级| 精品国产一区久久| 91精品免费观看| 欧美日韩第一区日日骚| 色妹子一区二区| 99精品久久只有精品| 国产二区国产一区在线观看 | 日韩国产欧美在线视频| 一区二区高清在线| 亚洲午夜电影在线| 亚洲综合色丁香婷婷六月图片| 中文字幕日韩欧美一区二区三区| 国产日韩av一区| 亚洲国产精品二十页| 精品精品欲导航| 久久免费电影网| 国产婷婷一区二区| 国产欧美综合在线观看第十页| 国产精品人人做人人爽人人添| 久久久99免费| 中文字幕不卡的av| 国产精品久久久久久久久免费丝袜 | 欧美精品一区在线观看| 久久久影视传媒| 欧美国产日本韩| 亚洲欧美一区二区三区极速播放| 依依成人综合视频| 日韩中文字幕不卡| 麻豆精品一区二区av白丝在线| 蜜桃一区二区三区在线观看| 国产高清在线精品| 91在线观看视频| 欧美日韩三级一区| 日韩欧美一区二区三区在线| 亚洲精品在线免费播放| 国产日韩精品一区二区浪潮av| 亚洲色图色小说| 亚洲成人资源网| 久久精品国产99久久6| 国产黄色精品视频| 色婷婷亚洲精品| 91精品国产免费| 欧美精彩视频一区二区三区| 一区二区成人在线| 理论电影国产精品| 成人免费高清在线观看| 欧美日韩国产影片| 国产欧美日韩精品一区| 亚洲福利视频一区| 国产一区二区不卡老阿姨| 99久久免费精品| 欧美一级日韩一级| 国产精品全国免费观看高清| 亚洲一区二区三区四区在线免费观看| 六月丁香婷婷色狠狠久久| 成人黄色在线视频| 欧美一卡二卡在线| 亚洲天堂a在线| 久久97超碰国产精品超碰| 91浏览器打开| 久久久精品国产免费观看同学| 一区二区三区成人在线视频| 韩国三级中文字幕hd久久精品| 91精品福利视频| 久久精品亚洲一区二区三区浴池 | 国产精品天干天干在观线| 亚洲国产欧美在线| 丰满岳乱妇一区二区三区| 欧美片网站yy| 亚洲人成网站色在线观看| 国内精品久久久久影院色| 欧美午夜宅男影院| 中文字幕中文在线不卡住| 黑人巨大精品欧美一区| 欧美精品自拍偷拍| 亚洲精品欧美在线| 成人黄色一级视频| 国产欧美精品一区二区三区四区 | 国产精品午夜在线| 久久精品理论片| 69堂成人精品免费视频| 亚洲另类中文字| 成a人片亚洲日本久久| 久久女同精品一区二区| 日韩成人一区二区| 欧美情侣在线播放| 午夜精品一区二区三区三上悠亚| av在线播放一区二区三区| 久久久99久久| 国产精品99久久久久久久女警| 精品99一区二区三区| 免费亚洲电影在线| 日韩一区二区中文字幕| 日本vs亚洲vs韩国一区三区二区| 欧美日韩国产综合一区二区三区|