您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ CS_CHECK函数代码示例

51自学网 2021-06-01 20:06:29
  C++
这篇教程C++ CS_CHECK函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中CS_CHECK函数的典型用法代码示例。如果您正苦于以下问题:C++ CS_CHECK函数的具体用法?C++ CS_CHECK怎么用?C++ CS_CHECK使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了CS_CHECK函数的25个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: spectrum_reset

/* * Reset the card using configuration registers COR and CCSR. * If IDLE is 1, stop the firmware, so that it can be safely rewritten. */static intspectrum_reset(struct pcmcia_device *link, int idle){	int last_ret, last_fn;	conf_reg_t reg;	u_int save_cor;	/* Doing it if hardware is gone is guaranteed crash */	if (!pcmcia_dev_present(link))		return -ENODEV;	/* Save original COR value */	reg.Function = 0;	reg.Action = CS_READ;	reg.Offset = CISREG_COR;	CS_CHECK(AccessConfigurationRegister,		 pcmcia_access_configuration_register(link, &reg));	save_cor = reg.Value;	/* Soft-Reset card */	reg.Action = CS_WRITE;	reg.Offset = CISREG_COR;	reg.Value = (save_cor | COR_SOFT_RESET);	CS_CHECK(AccessConfigurationRegister,		 pcmcia_access_configuration_register(link, &reg));	udelay(1000);	/* Read CCSR */	reg.Action = CS_READ;	reg.Offset = CISREG_CCSR;	CS_CHECK(AccessConfigurationRegister,		 pcmcia_access_configuration_register(link, &reg));	/*	 * Start or stop the firmware.  Memory width bit should be	 * preserved from the value we've just read.	 */	reg.Action = CS_WRITE;	reg.Offset = CISREG_CCSR;	reg.Value = (idle ? HCR_IDLE : HCR_RUN) | (reg.Value & HCR_MEM16);	CS_CHECK(AccessConfigurationRegister,		 pcmcia_access_configuration_register(link, &reg));	udelay(1000);	/* Restore original COR configuration index */	reg.Action = CS_WRITE;	reg.Offset = CISREG_COR;	reg.Value = (save_cor & ~COR_SOFT_RESET);	CS_CHECK(AccessConfigurationRegister,		 pcmcia_access_configuration_register(link, &reg));	udelay(1000);	return 0;      cs_failed:	cs_error(link, last_fn, last_ret);	return -ENODEV;}
开发者ID:johnny,项目名称:CobraDroidBeta,代码行数:61,


示例2: qlogic_config

static int qlogic_config(struct pcmcia_device * link){	scsi_info_t *info = link->priv;	int last_ret, last_fn;	struct Scsi_Host *host;	DEBUG(0, "qlogic_config(0x%p)/n", link);	last_ret = pcmcia_loop_config(link, qlogic_config_check, NULL);	if (last_ret) {		cs_error(link, RequestIO, last_ret);		goto failed;	}	CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));	if ((info->manf_id == MANFID_MACNICA) || (info->manf_id == MANFID_PIONEER) || (info->manf_id == 0x0098)) {		/* set ATAcmd */		outb(0xb4, link->io.BasePort1 + 0xd);		outb(0x24, link->io.BasePort1 + 0x9);		outb(0x04, link->io.BasePort1 + 0xd);	}	/* The KXL-810AN has a bigger IO port window */	if (link->io.NumPorts1 == 32)		host = qlogic_detect(&qlogicfas_driver_template, link,			link->io.BasePort1 + 16, link->irq.AssignedIRQ);	else		host = qlogic_detect(&qlogicfas_driver_template, link,			link->io.BasePort1, link->irq.AssignedIRQ);		if (!host) {		printk(KERN_INFO "%s: no SCSI devices found/n", qlogic_name);		goto cs_failed;	}	sprintf(info->node.dev_name, "scsi%d", host->host_no);	link->dev_node = &info->node;	info->host = host;	return 0;cs_failed:	cs_error(link, last_fn, last_ret);	pcmcia_disable_device(link);failed:	return -ENODEV;}				/* qlogic_config */
开发者ID:325116067,项目名称:semc-qsd8x50,代码行数:50,


示例3: nsp_cs_config

static void nsp_cs_config(dev_link_t *link){	client_handle_t	  handle = link->handle;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));cs_failed:	return;}
开发者ID:9060,项目名称:spdiff,代码行数:7,


示例4: parport_config

static int parport_config(struct pcmcia_device *link){    parport_info_t *info = link->priv;    struct parport *p;    int last_ret, last_fn;    DEBUG(0, "parport_config(0x%p)/n", link);    last_ret = pcmcia_loop_config(link, parport_config_check, NULL);    if (last_ret) {	    cs_error(link, RequestIO, last_ret);	    goto failed;    }    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));    p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2,			      link->irq.AssignedIRQ, PARPORT_DMA_NONE,			      &link->dev);    if (p == NULL) {	printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "	       "0x%3x, irq %u failed/n", link->io.BasePort1,	       link->irq.AssignedIRQ);	goto failed;    }    p->modes |= PARPORT_MODE_PCSPP;    if (epp_mode)	p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP;    info->ndev = 1;    info->node.major = LP_MAJOR;    info->node.minor = p->number;    info->port = p;    strcpy(info->node.dev_name, p->name);    link->dev_node = &info->node;    return 0;cs_failed:    cs_error(link, last_fn, last_ret);failed:    parport_cs_release(link);    return -ENODEV;} /* parport_config */
开发者ID:johnny,项目名称:CobraDroidBeta,代码行数:45,


示例5: pdacf_config

static void pdacf_config(dev_link_t *link){	client_handle_t handle = link->handle;	struct snd_pdacf *pdacf = link->priv;	tuple_t tuple;	cisparse_t *parse = NULL;	config_info_t conf;	u_short buf[32];	int last_fn, last_ret;	snd_printdd(KERN_DEBUG "pdacf_config called/n");	parse = kmalloc(sizeof(*parse), GFP_KERNEL);	if (! parse) {		snd_printk(KERN_ERR "pdacf_config: cannot allocate/n");		return;	}	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	tuple.Attributes = 0;	tuple.TupleData = (cisdata_t *)buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 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, parse));	link->conf.ConfigBase = parse->config.base;	link->conf.ConfigIndex = 0x5;	kfree(parse);	CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &conf));	link->conf.Vcc = conf.Vcc;	/* Configure card */	link->state |= DEV_CONFIG;	CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io));	CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));	if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0)		goto failed;	link->dev = &pdacf->node;	link->state &= ~DEV_CONFIG_PENDING;	return;cs_failed:	cs_error(link->handle, last_fn, last_ret);failed:	pcmcia_release_configuration(link->handle);	pcmcia_release_io(link->handle, &link->io);	pcmcia_release_irq(link->handle, &link->irq);}
开发者ID:canalplus,项目名称:r7oss,代码行数:53,


示例6: pdacf_config

static int pdacf_config(struct pcmcia_device *link){	struct snd_pdacf *pdacf = link->priv;	int last_fn, last_ret;	snd_printdd(KERN_DEBUG "pdacf_config called/n");	link->conf.ConfigIndex = 0x5;	CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));	CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));	if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0)		goto failed;	link->dev_node = &pdacf->node;	return 0;cs_failed:	cs_error(link, last_fn, last_ret);failed:	pcmcia_disable_device(link);	return -ENODEV;}
开发者ID:3sOx,项目名称:asuswrt-merlin,代码行数:24,


示例7: load

        bool load(Geometry& _geometry, const char* _path, dm::StackAllocatorI* _stack, void* _inData, OutDataHeader** _outData, bx::ReallocatorI* _outDataAlloc = dm::mainAlloc)        {            dm::CrtFileReader fileReader;            if (fileReader.open(_path))            {                CS_CHECK(false, "Could not open file %s for reading.", _path);                return false;            }            const char* ext = dm::fileExt(_path);            const bool result = load(_geometry, &fileReader, ext, _stack, _inData, _outData, _outDataAlloc);            fileReader.close();            return result;        }
开发者ID:bobbyzhu,项目名称:cmftStudio,代码行数:16,


示例8: pdacf_config

static int pdacf_config(struct pcmcia_device *link){	struct snd_pdacf *pdacf = link->priv;	tuple_t tuple;	cisparse_t *parse = NULL;	u_short buf[32];	int last_fn, last_ret;	snd_printdd(KERN_DEBUG "pdacf_config called/n");	parse = kmalloc(sizeof(*parse), GFP_KERNEL);	if (! parse) {		snd_printk(KERN_ERR "pdacf_config: cannot allocate/n");		return -ENOMEM;	}	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	tuple.Attributes = 0;	tuple.TupleData = (cisdata_t *)buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 0;	tuple.DesiredTuple = CISTPL_CONFIG;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));	CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));	CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, parse));	link->conf.ConfigBase = parse->config.base;	link->conf.ConfigIndex = 0x5;	kfree(parse);	CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));	CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));	if (snd_pdacf_assign_resources(pdacf, link->io.BasePort1, link->irq.AssignedIRQ) < 0)		goto failed;	link->dev_node = &pdacf->node;	return 0;cs_failed:	cs_error(link, last_fn, last_ret);failed:	pcmcia_disable_device(link);	return -ENODEV;}
开发者ID:BackupTheBerlios,项目名称:arp2-svn,代码行数:43,


示例9: sl811_cs_config

static void sl811_cs_config(dev_link_t *link){	client_handle_t		handle = link->handle;	struct device		*parent = &handle_to_dev(handle);	local_info_t		*dev = link->priv;	tuple_t			tuple;	cisparse_t		parse;	int			last_fn, last_ret;	u_char			buf[64];	config_info_t		conf;	cistpl_cftable_entry_t	dflt = { 0 };	DBG(0, "sl811_cs_config(0x%p)/n", link);	tuple.DesiredTuple = CISTPL_CONFIG;	tuple.Attributes = 0;	tuple.TupleData = buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 0;	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, &parse));	link->conf.ConfigBase = parse.config.base;	link->conf.Present = parse.config.rmask[0];	/* Configure card */	link->state |= DEV_CONFIG;	/* Look up the current Vcc */	CS_CHECK(GetConfigurationInfo,			pcmcia_get_configuration_info(handle, &conf));	link->conf.Vcc = conf.Vcc;	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));	while (1) {		cistpl_cftable_entry_t	*cfg = &(parse.cftable_entry);		if (pcmcia_get_tuple_data(handle, &tuple) != 0				|| pcmcia_parse_tuple(handle, &tuple, &parse)						!= 0)			goto next_entry;		if (cfg->flags & CISTPL_CFTABLE_DEFAULT) {			dflt = *cfg;		}		if (cfg->index == 0)			goto next_entry;		link->conf.ConfigIndex = cfg->index;		/* Use power settings for Vcc and Vpp if present */		/*  Note that the CIS values need to be rescaled */		if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {			if (cfg->vcc.param[CISTPL_POWER_VNOM]/10000					!= conf.Vcc)				goto next_entry;		} else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {			if (dflt.vcc.param[CISTPL_POWER_VNOM]/10000					!= conf.Vcc)				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;		/* we need an interrupt */		if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)			link->conf.Attributes |= CONF_ENABLE_IRQ;		/* IO window settings */		link->io.NumPorts1 = link->io.NumPorts2 = 0;		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;			link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;			link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;			link->io.BasePort1 = io->win[0].base;			link->io.NumPorts1 = io->win[0].len;			if (pcmcia_request_io(link->handle, &link->io) != 0)				goto next_entry;		}		break;next_entry:		if (link->io.NumPorts1)			pcmcia_release_io(link->handle, &link->io);		last_ret = pcmcia_get_next_tuple(handle, &tuple);	}	/* require an IRQ and two registers */	if (!link->io.NumPorts1 || link->io.NumPorts1 < 2)		goto cs_failed;	if (link->conf.Attributes & CONF_ENABLE_IRQ)//.........这里部分代码省略.........
开发者ID:kzlin129,项目名称:tt-gpl,代码行数:101,


示例10: parport_config

void parport_config(dev_link_t *link){    client_handle_t handle = link->handle;    parport_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 };    struct parport *p;    int last_ret, last_fn;        DEBUG(0, "parport_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);        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);	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;	    if (epp_mode)		link->conf.ConfigIndex |= FORCE_EPP_MODE;	    link->io.BasePort1 = io->win[0].base;	    link->io.NumPorts1 = io->win[0].len;	    link->io.IOAddrLines = io->flags & CISTPL_IO_LINES_MASK;	    if (io->nwin == 2) {		link->io.BasePort2 = io->win[1].base;		link->io.NumPorts2 = io->win[1].len;	    }	    CFG_CHECK(RequestIO, link->handle, &link->io);	    /* If we've got this far, we're done */	    break;	}	    next_entry:	if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;	CS_CHECK(GetNextTuple, handle, &tuple);    }        CS_CHECK(RequestIRQ, handle, &link->irq);    CS_CHECK(RequestConfiguration, handle, &link->conf);    release_region(link->io.BasePort1, link->io.NumPorts1);    if (link->io.NumPorts2)	release_region(link->io.BasePort2, link->io.NumPorts2);    p = parport_pc_probe_port(link->io.BasePort1, link->io.BasePort2,			      link->irq.AssignedIRQ, PARPORT_DMA_NONE,			      NULL);    if (p == NULL) {	printk(KERN_NOTICE "parport_cs: parport_pc_probe_port() at "	       "0x%3x, irq %u failed/n", link->io.BasePort1,	       link->irq.AssignedIRQ);	goto failed;    }    p->modes |= PARPORT_MODE_PCSPP;    if (epp_mode)	p->modes |= PARPORT_MODE_TRISTATE | PARPORT_MODE_EPP;    info->ndev = 1;    info->node.major = LP_MAJOR;    info->node.minor = p->number;    info->port = p;    strcpy(info->node.dev_name, p->name);    link->dev = &info->node;    link->state &= ~DEV_CONFIG_PENDING;    return;    cs_failed:    cs_error(link->handle, last_fn, last_ret);failed:    parport_cs_release((u_long)link);    link->state &= ~DEV_CONFIG_PENDING;} /* parport_config */
开发者ID:GunioRobot,项目名称:MI424WR_GEN2_Rev_E-F,代码行数:96,


示例11: fdomain_config

static void fdomain_config(dev_link_t *link){    client_handle_t handle = link->handle;    scsi_info_t *info = link->priv;    tuple_t tuple;    cisparse_t parse;    int i, last_ret, last_fn;    u_char tuple_data[64];    char str[16];    struct Scsi_Host *host;    DEBUG(0, "fdomain_config(0x%p)/n", link);    tuple.DesiredTuple = CISTPL_CONFIG;    tuple.TupleData = tuple_data;    tuple.TupleDataMax = 64;    tuple.TupleOffset = 0;    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, &parse));    link->conf.ConfigBase = parse.config.base;    /* Configure card */    link->state |= DEV_CONFIG;        tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));    while (1) {	if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||		pcmcia_parse_tuple(handle, &tuple, &parse) != 0)	    goto next_entry;	link->conf.ConfigIndex = parse.cftable_entry.index;	link->io.BasePort1 = parse.cftable_entry.io.win[0].base;	i = pcmcia_request_io(handle, &link->io);	if (i == CS_SUCCESS) break;    next_entry:	CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));    }    CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));        /* A bad hack... */    release_region(link->io.BasePort1, link->io.NumPorts1);    /* Set configuration options for the fdomain driver */    sprintf(str, "%d,%d", link->io.BasePort1, link->irq.AssignedIRQ);    fdomain_setup(str);        host = __fdomain_16x0_detect(&fdomain_driver_template);    if (!host) {        printk(KERN_INFO "fdomain_cs: no SCSI devices found/n");	goto cs_failed;    }     scsi_add_host(host, NULL); /* XXX handle failure */    scsi_scan_host(host);    sprintf(info->node.dev_name, "scsi%d", host->host_no);    link->dev = &info->node;    info->host = host;        link->state &= ~DEV_CONFIG_PENDING;    return;    cs_failed:    cs_error(link->handle, last_fn, last_ret);    fdomain_release(link);    return;    } /* fdomain_config */
开发者ID:Antonio-Zhou,项目名称:Linux-2.6.11,代码行数:71,


示例12: ixj_get_serial

static void ixj_get_serial(dev_link_t * link, IXJ * j){	client_handle_t handle;	tuple_t tuple;	u_short buf[128];	char *str;	int last_ret, last_fn, i, place;	handle = link->handle;	DEBUG(0, "ixj_get_serial(0x%p)/n", link);	tuple.TupleData = (cisdata_t *) buf;	tuple.TupleOffset = 0;	tuple.TupleDataMax = 80;	tuple.Attributes = 0;	tuple.DesiredTuple = CISTPL_VERS_1;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));	CS_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));	str = (char *) buf;	printk("PCMCIA Version %d.%d/n", str[0], str[1]);	str += 2;	printk("%s", str);	str = str + strlen(str) + 1;	printk(" %s", str);	str = str + strlen(str) + 1;	place = 1;	for (i = strlen(str) - 1; i >= 0; i--) {		switch (str[i]) {		case '0':		case '1':		case '2':		case '3':		case '4':		case '5':		case '6':		case '7':		case '8':		case '9':			j->serial += (str[i] - 48) * place;			break;		case 'A':		case 'B':		case 'C':		case 'D':		case 'E':		case 'F':			j->serial += (str[i] - 55) * place;			break;		case 'a':		case 'b':		case 'c':		case 'd':		case 'e':		case 'f':			j->serial += (str[i] - 87) * place;			break;		}		place = place * 0x10;	}	str = str + strlen(str) + 1;	printk(" version %s/n", str);      cs_failed:	return;}
开发者ID:ena30,项目名称:snake-os,代码行数:62,


示例13: ixj_config

static int ixj_config(struct pcmcia_device * link){	IXJ *j;	ixj_info_t *info;	tuple_t tuple;	u_short buf[128];	cisparse_t parse;	cistpl_cftable_entry_t *cfg = &parse.cftable_entry;	cistpl_cftable_entry_t dflt =	{		0	};	int last_ret, last_fn;	info = link->priv;	DEBUG(0, "ixj_config(0x%p)/n", link);	tuple.TupleData = (cisdata_t *) buf;	tuple.TupleOffset = 0;	tuple.TupleDataMax = 255;	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	tuple.Attributes = 0;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));	while (1) {		if (pcmcia_get_tuple_data(link, &tuple) != 0 ||				pcmcia_parse_tuple(link, &tuple, &parse) != 0)			goto next_entry;		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.NumPorts1 = io->win[0].len;			if (io->nwin == 2) {				link->io.BasePort2 = io->win[1].base;				link->io.NumPorts2 = io->win[1].len;			}			if (pcmcia_request_io(link, &link->io) != 0)				goto next_entry;			/* If we've got this far, we're done */			break;		}	      next_entry:		if (cfg->flags & CISTPL_CFTABLE_DEFAULT)			dflt = *cfg;		CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(link, &tuple));	}	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));	/* 	 *	Register the card with the core. 	 */		j=ixj_pcmcia_probe(link->io.BasePort1,link->io.BasePort1 + 0x10);	info->ndev = 1;	info->node.major = PHONE_MAJOR;	link->dev_node = &info->node;	ixj_get_serial(link, j);	return 0;      cs_failed:	cs_error(link, last_fn, last_ret);	ixj_cs_release(link);	return -ENODEV;}
开发者ID:3sOx,项目名称:asuswrt-merlin,代码行数:62,


示例14: tc589_config

static int tc589_config(struct pcmcia_device *link){    struct net_device *dev = link->priv;    struct el3_private *lp = netdev_priv(dev);    tuple_t tuple;    __le16 buf[32];    __be16 *phys_addr;    int last_fn, last_ret, i, j, multi = 0, fifo;    unsigned int ioaddr;    char *ram_split[] = {"5:3", "3:1", "1:1", "3:5"};    DECLARE_MAC_BUF(mac);        DEBUG(0, "3c589_config(0x%p)/n", link);    phys_addr = (__be16 *)dev->dev_addr;    tuple.Attributes = 0;    tuple.TupleData = (cisdata_t *)buf;    tuple.TupleDataMax = sizeof(buf);    tuple.TupleOffset = 0;    tuple.Attributes = TUPLE_RETURN_COMMON;    /* Is this a 3c562? */    if (link->manf_id != MANFID_3COM)	    printk(KERN_INFO "3c589_cs: hmmm, is this really a "		   "3Com card??/n");    multi = (link->card_id == PRODID_3COM_3C562);    /* For the 3c562, the base address must be xx00-xx7f */    link->io.IOAddrLines = 16;    for (i = j = 0; j < 0x400; j += 0x10) {	if (multi && (j & 0x80)) continue;	link->io.BasePort1 = j ^ 0x300;	i = pcmcia_request_io(link, &link->io);	if (i == CS_SUCCESS) break;    }    if (i != CS_SUCCESS) {	cs_error(link, RequestIO, i);	goto failed;    }    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));	    dev->irq = link->irq.AssignedIRQ;    dev->base_addr = link->io.BasePort1;    ioaddr = dev->base_addr;    EL3WINDOW(0);    /* The 3c589 has an extra EEPROM for configuration info, including       the hardware address.  The 3c562 puts the address in the CIS. */    tuple.DesiredTuple = 0x88;    if (pcmcia_get_first_tuple(link, &tuple) == CS_SUCCESS) {	pcmcia_get_tuple_data(link, &tuple);	for (i = 0; i < 3; i++)	    phys_addr[i] = htons(le16_to_cpu(buf[i]));    } else {	for (i = 0; i < 3; i++)	    phys_addr[i] = htons(read_eeprom(ioaddr, i));	if (phys_addr[0] == htons(0x6060)) {	    printk(KERN_ERR "3c589_cs: IO port conflict at 0x%03lx"		   "-0x%03lx/n", dev->base_addr, dev->base_addr+15);	    goto failed;	}    }    /* The address and resource configuration register aren't loaded from       the EEPROM and *must* be set to 0 and IRQ3 for the PCMCIA version. */    outw(0x3f00, ioaddr + 8);    fifo = inl(ioaddr);    /* The if_port symbol can be set when the module is loaded */    if ((if_port >= 0) && (if_port <= 3))	dev->if_port = if_port;    else	printk(KERN_ERR "3c589_cs: invalid if_port requested/n");        link->dev_node = &lp->node;    SET_NETDEV_DEV(dev, &handle_to_dev(link));    if (register_netdev(dev) != 0) {	printk(KERN_ERR "3c589_cs: register_netdev() failed/n");	link->dev_node = NULL;	goto failed;    }    strcpy(lp->node.dev_name, dev->name);    printk(KERN_INFO "%s: 3Com 3c%s, io %#3lx, irq %d, "	   "hw_addr %s/n",	   dev->name, (multi ? "562" : "589"), dev->base_addr, dev->irq,	   print_mac(mac, dev->dev_addr));    printk(KERN_INFO "  %dK FIFO split %s Rx:Tx, %s xcvr/n",	   (fifo & 7) ? 32 : 8, ram_split[(fifo >> 16) & 3],	   if_names[dev->if_port]);    return 0;cs_failed:    cs_error(link, last_fn, last_ret);failed:    tc589_release(link);    return -ENODEV;//.........这里部分代码省略.........
开发者ID:LouZiffer,项目名称:m900_kernel_cupcake-SDX,代码行数:101,


示例15: ide_config

static int ide_config(struct pcmcia_device *link){    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 = kzalloc(sizeof(*stk), GFP_KERNEL);    if (!stk) goto err_mem;    cfg = &stk->parse.cftable_entry;    tuple.TupleData = (cisdata_t *)&stk->buf;    tuple.TupleOffset = 0;    tuple.TupleDataMax = 255;    tuple.Attributes = 0;    is_kme = ((link->manf_id == MANFID_KME) &&	      ((link->card_id == PRODID_KME_KXLC005_A) ||	       (link->card_id == PRODID_KME_KXLC005_B)));    /* Not sure if this is right... look up the current Vcc */    CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(link, &stk->conf));    pass = io_base = ctl_base = 0;    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;    tuple.Attributes = 0;    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));    while (1) {    	if (pcmcia_get_tuple_data(link, &tuple) != 0) goto next_entry;	if (pcmcia_parse_tuple(link, &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.Vpp =		cfg->vpp1.param[CISTPL_POWER_VNOM] / 10000;	else if (stk->dflt.vpp1.present & (1 << CISTPL_POWER_VNOM))	    link->conf.Vpp =		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, &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, &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(link, &tuple));	} else if (pcmcia_get_next_tuple(link, &tuple) != 0) {	    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));	    memset(&stk->dflt, 0, sizeof(stk->dflt));	    pass++;	}    }    CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));//.........这里部分代码省略.........
开发者ID:cilynx,项目名称:dd-wrt,代码行数:101,


示例16: orinoco_cs_config

static intorinoco_cs_config(struct pcmcia_device *link){	struct net_device *dev = link->priv;	struct orinoco_private *priv = netdev_priv(dev);	struct orinoco_pccard *card = priv->card;	hermes_t *hw = &priv->hw;	int last_fn, last_ret;	void __iomem *mem;	/*	 * In this loop, we scan the CIS for configuration table	 * entries, each of which describes a valid card	 * configuration, including voltage, IO window, memory window,	 * and interrupt settings.	 *	 * We make no assumptions about the card to be configured: we	 * use just the information available in the CIS.  In an ideal	 * world, this would work for any PCMCIA card, but it requires	 * a complete and accurate CIS.  In practice, a driver usually	 * "knows" most of these things without consulting the CIS,	 * and most client drivers will only use the CIS to fill in	 * implementation-defined details.	 */	last_ret = pcmcia_loop_config(link, orinoco_cs_config_check, NULL);	if (last_ret) {		if (!ignore_cis_vcc)			printk(KERN_ERR PFX "GetNextTuple(): No matching "			       "CIS configuration.  Maybe you need the "			       "ignore_cis_vcc=1 parameter./n");		cs_error(link, RequestIO, last_ret);		goto failed;	}	/*	 * Allocate an interrupt line.  Note that this does not assign	 * a handler to the interrupt, unless the 'Handler' member of	 * the irq structure is initialized.	 */	CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));	/* We initialize the hermes structure before completing PCMCIA	 * configuration just in case the interrupt handler gets	 * called. */	mem = ioport_map(link->io.BasePort1, link->io.NumPorts1);	if (!mem)		goto cs_failed;	hermes_struct_init(hw, mem, HERMES_16BIT_REGSPACING);	/*	 * This actually configures the PCMCIA socket -- setting up	 * the I/O windows and the interrupt mapping, and putting the	 * card and host interface into "Memory and IO" mode.	 */	CS_CHECK(RequestConfiguration,		 pcmcia_request_configuration(link, &link->conf));	/* Ok, we have the configuration, prepare to register the netdev */	dev->base_addr = link->io.BasePort1;	dev->irq = link->irq.AssignedIRQ;	card->node.major = card->node.minor = 0;	SET_NETDEV_DEV(dev, &handle_to_dev(link));	/* Tell the stack we exist */	if (register_netdev(dev) != 0) {		printk(KERN_ERR PFX "register_netdev() failed/n");		goto failed;	}	/* At this point, the dev_node_t structure(s) needs to be	 * initialized and arranged in a linked list at link->dev_node. */	strcpy(card->node.dev_name, dev->name);	link->dev_node = &card->node; /* link->dev_node being non-NULL is also				       * used to indicate that the				       * net_device has been registered */	/* Finally, report what we've done */	printk(KERN_DEBUG "%s: " DRIVER_NAME " at %s, irq %d, io "	       "0x%04x-0x%04x/n", dev->name, dev_name(dev->dev.parent),	       link->irq.AssignedIRQ, link->io.BasePort1,	       link->io.BasePort1 + link->io.NumPorts1 - 1);	return 0; cs_failed:	cs_error(link, last_fn, last_ret); failed:	orinoco_cs_release(link);	return -ENODEV;}				/* orinoco_cs_config */
开发者ID:AppEngine,项目名称:linux-2.6,代码行数:91,


示例17: prism2_cs_probe

static int prism2_cs_probe(struct pcmcia_device *pdev){	int rval = 0;	struct wlandevice *wlandev = NULL;	hfa384x_t *hw = NULL;        config_info_t socketconf;        cisparse_t *parse = NULL;	tuple_t tuple;	uint8_t	buf[64];        int last_fn, last_ret;        cistpl_cftable_entry_t dflt = { 0 };#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)	dev_link_t *link;#endif	DBFENTER;#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16)	/* Set up interrupt type */        pdev->conf.IntType = INT_MEMORY_AND_IO;#else        link = kmalloc(sizeof(dev_link_t), GFP_KERNEL);        if (link == NULL)                return -ENOMEM;        memset(link, 0, sizeof(dev_link_t));        link->conf.Vcc = 33;        link->conf.IntType = INT_MEMORY_AND_IO;        link->handle = pdev;        pdev->instance = link;        link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;#endif	// VCC crap?        parse = kmalloc(sizeof(cisparse_t), GFP_KERNEL);	wlandev = create_wlan();	if (!wlandev || !parse) {		WLAN_LOG_ERROR("%s: Memory allocation failure./n", dev_info);		rval = -EIO;		goto failed;	}	hw = wlandev->priv;	if ( wlan_setup(wlandev) != 0 ) {		WLAN_LOG_ERROR("%s: wlan_setup() failed./n", dev_info);		rval = -EIO;		goto failed;	}	/* Initialize the hw struct for now */	hfa384x_create(hw, 0, 0, NULL);	hw->wlandev = wlandev;#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16)	hw->pdev = pdev;	pdev->priv = wlandev;#else	hw->link = link;	link->priv = wlandev;#endif        tuple.DesiredTuple = CISTPL_CONFIG;        tuple.Attributes = 0;        tuple.TupleData = buf;        tuple.TupleDataMax = sizeof(buf);        tuple.TupleOffset = 0;        CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(pdev, &tuple));        CS_CHECK(GetTupleData, pcmcia_get_tuple_data(pdev, &tuple));        CS_CHECK(ParseTuple, pcmcia_parse_tuple(pdev, &tuple, parse));#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16)        pdev->conf.ConfigBase = parse->config.base;        pdev->conf.Present = parse->config.rmask[0];#else        link->conf.ConfigBase = parse->config.base;        link->conf.Present = parse->config.rmask[0];	link->conf.Vcc = socketconf.Vcc;#endif        CS_CHECK(GetConfigurationInfo,                 pcmcia_get_configuration_info(pdev, &socketconf));	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(pdev, &tuple));        for (;;) {		cistpl_cftable_entry_t *cfg = &(parse->cftable_entry);                CFG_CHECK(GetTupleData,                           pcmcia_get_tuple_data(pdev, &tuple));                CFG_CHECK(ParseTuple,                           pcmcia_parse_tuple(pdev, &tuple, parse));                if (cfg->flags & CISTPL_CFTABLE_DEFAULT)                        dflt = *cfg;                if (cfg->index == 0)                        goto next_entry;#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,16)//.........这里部分代码省略.........
开发者ID:kizukukoto,项目名称:WDN900_GPL,代码行数:101,


示例18: ide_config

void 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, is_kme = 0;    unsigned long 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];    tuple.DesiredTuple = CISTPL_MANFID;    if (!CardServices(GetFirstTuple, handle, &tuple) &&	!CardServices(GetTupleData, handle, &tuple) &&	!CardServices(ParseTuple, handle, &tuple, &parse))	is_kme = ((parse.manfid.manf == MANFID_KME) &&		  ((parse.manfid.card == PRODID_KME_KXLC005_A) ||		   (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, 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 = (is_kme) ? 2 : 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++;	}//.........这里部分代码省略.........
开发者ID:sarnobat,项目名称:knoppix,代码行数:101,


示例19: orinoco_cs_config

static voidorinoco_cs_config(dev_link_t *link){	struct net_device *dev = link->priv;	client_handle_t handle = link->handle;	struct orinoco_private *priv = netdev_priv(dev);	struct orinoco_pccard *card = priv->card;	hermes_t *hw = &priv->hw;	int last_fn, last_ret;	u_char buf[64];	config_info_t conf;	cisinfo_t info;	tuple_t tuple;	cisparse_t parse;	void __iomem *mem;	CS_CHECK(ValidateCIS, pcmcia_validate_cis(handle, &info));	/*	 * This reads the card's CONFIG tuple to find its	 * configuration registers.	 */	tuple.DesiredTuple = CISTPL_CONFIG;	tuple.Attributes = 0;	tuple.TupleData = buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 0;	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, &parse));	link->conf.ConfigBase = parse.config.base;	link->conf.Present = parse.config.rmask[0];	/* Configure card */	link->state |= DEV_CONFIG;	/* Look up the current Vcc */	CS_CHECK(GetConfigurationInfo,		 pcmcia_get_configuration_info(handle, &conf));	link->conf.Vcc = conf.Vcc;	/*	 * In this loop, we scan the CIS for configuration table	 * entries, each of which describes a valid card	 * configuration, including voltage, IO window, memory window,	 * and interrupt settings.	 *	 * We make no assumptions about the card to be configured: we	 * use just the information available in the CIS.  In an ideal	 * world, this would work for any PCMCIA card, but it requires	 * a complete and accurate CIS.  In practice, a driver usually	 * "knows" most of these things without consulting the CIS,	 * and most client drivers will only use the CIS to fill in	 * implementation-defined details.	 */	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));	while (1) {		cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);		cistpl_cftable_entry_t dflt = { .index = 0 };		if ( (pcmcia_get_tuple_data(handle, &tuple) != 0)		    || (pcmcia_parse_tuple(handle, &tuple, &parse) != 0))			goto next_entry;		if (cfg->flags & CISTPL_CFTABLE_DEFAULT)			dflt = *cfg;		if (cfg->index == 0)			goto next_entry;		link->conf.ConfigIndex = cfg->index;		/* Does this card need audio output? */		if (cfg->flags & CISTPL_CFTABLE_AUDIO) {			link->conf.Attributes |= CONF_ENABLE_SPKR;			link->conf.Status = CCSR_AUDIO_ENA;		}		/* Use power settings for Vcc and Vpp if present */		/* Note that the CIS values need to be rescaled */		if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {			if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {				DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, CIS = %d)/n",  conf.Vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);				if (!ignore_cis_vcc)					goto next_entry;			}		} else if (dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {			if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM] / 10000) {				DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, CIS = %d)/n",  conf.Vcc, dflt.vcc.param[CISTPL_POWER_VNOM] / 10000);				if(!ignore_cis_vcc)					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;		//.........这里部分代码省略.........
开发者ID:Dronevery,项目名称:JetsonTK1-kernel,代码行数:101,


示例20: prism2sta_config

void prism2sta_config(dev_link_t *link){	client_handle_t		handle;	wlandevice_t		*wlandev;	hfa384x_t               *hw;	int			last_fn;	int			last_ret;	tuple_t			tuple;	cisparse_t		parse;	config_info_t		socketconf;	UINT8			buf[64];	int			minVcc = 0;	int			maxVcc = 0;	cistpl_cftable_entry_t	dflt = { 0 };	DBFENTER;	handle = link->handle;	wlandev = (wlandevice_t*)link->priv;	hw = wlandev->priv;	/* Collect the config register info */	tuple.DesiredTuple = CISTPL_CONFIG;	tuple.Attributes = 0;	tuple.TupleData = buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 0;	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, &parse));	link->conf.ConfigBase = parse.config.base;	link->conf.Present = parse.config.rmask[0];	/* Configure card */	link->state |= DEV_CONFIG;	/* Acquire the current socket config (need Vcc setting) */	CS_CHECK(GetConfigurationInfo, pcmcia_get_configuration_info(handle, &socketconf));	/* Loop through the config table entries until we find one that works */	/* Assumes a complete and valid CIS */	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));	while (1) {		cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);		CFG_CHECK(GetTupleData, pcmcia_get_tuple_data(handle, &tuple));		CFG_CHECK(ParseTuple, pcmcia_parse_tuple(handle, &tuple, &parse));		if (cfg->index == 0) goto next_entry;		link->conf.ConfigIndex = cfg->index;		/* Lets print out the Vcc that the controller+pcmcia-cs set		 * for us, cause that's what we're going to use.		 */		WLAN_LOG_DEBUG(1,"Initial Vcc=%d/10v/n", socketconf.Vcc);		if (prism2_ignorevcc) {			link->conf.Vcc = socketconf.Vcc;			goto skipvcc;		}		/* Use power settings for Vcc and Vpp if present */		/* Note that the CIS values need to be rescaled */		if (cfg->vcc.present & (1<<CISTPL_POWER_VNOM)) {			WLAN_LOG_DEBUG(1, "Vcc obtained from curtupl.VNOM/n");			minVcc = maxVcc =				cfg->vcc.param[CISTPL_POWER_VNOM]/10000;		} else if (dflt.vcc.present & (1<<CISTPL_POWER_VNOM)) {			WLAN_LOG_DEBUG(1, "Vcc set from dflt.VNOM/n");			minVcc = maxVcc =				dflt.vcc.param[CISTPL_POWER_VNOM]/10000;		} else if ((cfg->vcc.present & (1<<CISTPL_POWER_VMAX)) &&			   (cfg->vcc.present & (1<<CISTPL_POWER_VMIN)) ) {			WLAN_LOG_DEBUG(1, "Vcc set from curtupl(VMIN,VMAX)/n");			minVcc = cfg->vcc.param[CISTPL_POWER_VMIN]/10000;			maxVcc = cfg->vcc.param[CISTPL_POWER_VMAX]/10000;		} else if ((dflt.vcc.present & (1<<CISTPL_POWER_VMAX)) &&			   (dflt.vcc.present & (1<<CISTPL_POWER_VMIN)) ) {			WLAN_LOG_DEBUG(1, "Vcc set from dflt(VMIN,VMAX)/n");			minVcc = dflt.vcc.param[CISTPL_POWER_VMIN]/10000;			maxVcc = dflt.vcc.param[CISTPL_POWER_VMAX]/10000;		}		if ( socketconf.Vcc >= minVcc && socketconf.Vcc <= maxVcc) {			link->conf.Vcc = socketconf.Vcc;		} else {			/* [MSM]: Note that I've given up trying to change			 * the Vcc if a change is indicated.  It seems the			 * system&socketcontroller&card vendors can't seem			 * to get it right, so I'm tired of trying to hack			 * my way around it.  pcmcia-cs does its best using			 * the voltage sense pins but sometimes the controller			 * lies.  Then, even if we have a good read on the VS			 * pins, some system designs will silently ignore our			 * requests to set the voltage.  Additionally, some			 * vendors have 3.3v indicated on their sense pins,			 * but 5v specified in the CIS or vice-versa.  I've			 * had it.  My only recommendation is "let the buyer			 * beware".  Your system might supply 5v to a 3v card			 * (possibly causing damage) or a 3v capable system			 * might supply 5v to a 3v capable card (wasting//.........这里部分代码省略.........
开发者ID:kizukukoto,项目名称:WDN900_GPL,代码行数:101,


示例21: nmclan_config

static int nmclan_config(struct pcmcia_device *link){  struct net_device *dev = link->priv;  mace_private *lp = netdev_priv(dev);  tuple_t tuple;  u_char buf[64];  int i, last_ret, last_fn;  kio_addr_t ioaddr;  DEBUG(0, "nmclan_config(0x%p)/n", link);  CS_CHECK(RequestIO, pcmcia_request_io(link, &link->io));  CS_CHECK(RequestIRQ, pcmcia_request_irq(link, &link->irq));  CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));  dev->irq = link->irq.AssignedIRQ;  dev->base_addr = link->io.BasePort1;  ioaddr = dev->base_addr;  /* Read the ethernet address from the CIS. */  tuple.DesiredTuple = 0x80 /* CISTPL_CFTABLE_ENTRY_MISC */;  tuple.TupleData = buf;  tuple.TupleDataMax = 64;  tuple.TupleOffset = 0;  tuple.Attributes = 0;  CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));  CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));  memcpy(dev->dev_addr, tuple.TupleData, ETHER_ADDR_LEN);  /* Verify configuration by reading the MACE ID. */  {    char sig[2];    sig[0] = mace_read(lp, ioaddr, MACE_CHIPIDL);    sig[1] = mace_read(lp, ioaddr, MACE_CHIPIDH);    if ((sig[0] == 0x40) && ((sig[1] & 0x0F) == 0x09)) {      DEBUG(0, "nmclan_cs configured: mace id=%x %x/n",	    sig[0], sig[1]);    } else {      printk(KERN_NOTICE "nmclan_cs: mace id not found: %x %x should"	     " be 0x40 0x?9/n", sig[0], sig[1]);      return -ENODEV;    }  }  if(mace_init(lp, ioaddr, dev->dev_addr) == -1)  	goto failed;  /* The if_port symbol can be set when the module is loaded */  if (if_port <= 2)    dev->if_port = if_port;  else    printk(KERN_NOTICE "nmclan_cs: invalid if_port requested/n");  link->dev_node = &lp->node;  SET_NETDEV_DEV(dev, &handle_to_dev(link));  i = register_netdev(dev);  if (i != 0) {    printk(KERN_NOTICE "nmclan_cs: register_netdev() failed/n");    link->dev_node = NULL;    goto failed;  }  strcpy(lp->node.dev_name, dev->name);  printk(KERN_INFO "%s: nmclan: port %#3lx, irq %d, %s port, hw_addr ",	 dev->name, dev->base_addr, dev->irq, if_names[dev->if_port]);  for (i = 0; i < 6; i++)      printk("%02X%s", dev->dev_addr[i], ((i<5) ? ":" : "/n"));  return 0;cs_failed:	cs_error(link, last_fn, last_ret);failed:	nmclan_release(link);	return -ENODEV;} /* nmclan_config */
开发者ID:cilynx,项目名称:dd-wrt,代码行数:78,


示例22: vxpocket_config

static void vxpocket_config(dev_link_t *link){	client_handle_t handle = link->handle;	struct vx_core *chip = link->priv;	struct snd_vxpocket *vxp = (struct snd_vxpocket *)chip;	tuple_t tuple;	cisparse_t *parse;	u_short buf[32];	int last_fn, last_ret;	snd_printdd(KERN_DEBUG "vxpocket_config called/n");	parse = kmalloc(sizeof(*parse), GFP_KERNEL);	if (! parse) {		snd_printk(KERN_ERR "vx: cannot allocate/n");		return;	}	tuple.Attributes = 0;	tuple.TupleData = (cisdata_t *)buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 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, parse));	link->conf.ConfigBase = parse->config.base;	link->conf.Present = parse->config.rmask[0];	/* redefine hardware record according to the VERSION1 string */	tuple.DesiredTuple = CISTPL_VERS_1;	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, parse));	if (! strcmp(parse->version_1.str + parse->version_1.ofs[1], "VX-POCKET")) {		snd_printdd("VX-pocket is detected/n");	} else {		snd_printdd("VX-pocket 440 is detected/n");		/* overwrite the hardware information */		chip->hw = &vxp440_hw;		chip->type = vxp440_hw.type;		strcpy(chip->card->driver, vxp440_hw.name);	}	/* Configure card */	link->state |= DEV_CONFIG;	CS_CHECK(RequestIO, pcmcia_request_io(handle, &link->io));	CS_CHECK(RequestIRQ, pcmcia_request_irq(link->handle, &link->irq));	CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf));	chip->dev = &handle_to_dev(link->handle);	snd_card_set_dev(chip->card, chip->dev);	if (snd_vxpocket_assign_resources(chip, link->io.BasePort1, link->irq.AssignedIRQ) < 0)		goto failed;	link->dev = &vxp->node;	link->state &= ~DEV_CONFIG_PENDING;	kfree(parse);	return;cs_failed:	cs_error(link->handle, last_fn, last_ret);failed:	pcmcia_release_configuration(link->handle);	pcmcia_release_io(link->handle, &link->io);	pcmcia_release_irq(link->handle, &link->irq);	link->state &= ~DEV_CONFIG;	kfree(parse);}
开发者ID:plbossart,项目名称:alsa-driver-build,代码行数:69,


示例23: aha152x_config_cs

static void aha152x_config_cs(dev_link_t *link){    client_handle_t handle = link->handle;    scsi_info_t *info = link->priv;    struct aha152x_setup s;    tuple_t tuple;    cisparse_t parse;    int i, last_ret, last_fn;    u_char tuple_data[64];    struct Scsi_Host *host;        DEBUG(0, "aha152x_config(0x%p)/n", link);    tuple.DesiredTuple = CISTPL_CONFIG;    tuple.TupleData = tuple_data;    tuple.TupleDataMax = 64;    tuple.TupleOffset = 0;    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, &parse));    link->conf.ConfigBase = parse.config.base;    /* Configure card */    link->state |= DEV_CONFIG;    tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(handle, &tuple));    while (1) {	if (pcmcia_get_tuple_data(handle, &tuple) != 0 ||		pcmcia_parse_tuple(handle, &tuple, &parse) != 0)	    goto next_entry;	/* For New Media T&J, look for a SCSI window */	if (parse.cftable_entry.io.win[0].len >= 0x20)	    link->io.BasePort1 = parse.cftable_entry.io.win[0].base;	else if ((parse.cftable_entry.io.nwin > 1) &&		 (parse.cftable_entry.io.win[1].len >= 0x20))	    link->io.BasePort1 = parse.cftable_entry.io.win[1].base;	if ((parse.cftable_entry.io.nwin > 0) &&	    (link->io.BasePort1 < 0xffff)) {	    link->conf.ConfigIndex = parse.cftable_entry.index;	    i = pcmcia_request_io(handle, &link->io);	    if (i == CS_SUCCESS) break;	}    next_entry:	CS_CHECK(GetNextTuple, pcmcia_get_next_tuple(handle, &tuple));    }        CS_CHECK(RequestIRQ, pcmcia_request_irq(handle, &link->irq));    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(handle, &link->conf));        /* Set configuration options for the aha152x driver */    memset(&s, 0, sizeof(s));    s.conf        = "PCMCIA setup";    s.io_port     = link->io.BasePort1;    s.irq         = link->irq.AssignedIRQ;    s.scsiid      = host_id;    s.reconnect   = reconnect;    s.parity      = parity;    s.synchronous = synchronous;    s.delay       = reset_delay;    if (ext_trans)        s.ext_trans = ext_trans;    host = aha152x_probe_one(&s);    if (host == NULL) {	printk(KERN_INFO "aha152x_cs: no SCSI devices found/n");	goto cs_failed;    }    sprintf(info->node.dev_name, "scsi%d", host->host_no);    link->dev = &info->node;    info->host = host;    link->state &= ~DEV_CONFIG_PENDING;    return;    cs_failed:    cs_error(link->handle, last_fn, last_ret);    aha152x_release_cs(link);    return;}
开发者ID:Antonio-Zhou,项目名称:Linux-2.6.11,代码行数:81,


示例24: airo_config

static int airo_config(struct pcmcia_device *link){	tuple_t tuple;	cisparse_t parse;	local_info_t *dev;	int last_fn, last_ret;	u_char buf[64];	win_req_t req;	memreq_t map;	dev = link->priv;	DEBUG(0, "airo_config(0x%p)/n", link);	/*	  In this loop, we scan the CIS for configuration table entries,	  each of which describes a valid card configuration, including	  voltage, IO window, memory window, and interrupt settings.	  	  We make no assumptions about the card to be configured: we use	  just the information available in the CIS.  In an ideal world,	  this would work for any PCMCIA card, but it requires a complete	  and accurate CIS.  In practice, a driver usually "knows" most of	  these things without consulting the CIS, and most client drivers	  will only use the CIS to fill in implementation-defined details.	*/	tuple.Attributes = 0;	tuple.TupleData = buf;	tuple.TupleDataMax = sizeof(buf);	tuple.TupleOffset = 0;	tuple.DesiredTuple = CISTPL_CFTABLE_ENTRY;	CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));	while (1) {		cistpl_cftable_entry_t dflt = { 0 };		cistpl_cftable_entry_t *cfg = &(parse.cftable_entry);		if (pcmcia_get_tuple_data(link, &tuple) != 0 ||				pcmcia_parse_tuple(link, &tuple, &parse) != 0)			goto next_entry;				if (cfg->flags & CISTPL_CFTABLE_DEFAULT) dflt = *cfg;		if (cfg->index == 0) goto next_entry;		link->conf.ConfigIndex = cfg->index;				/* Does this card need audio output? */		if (cfg->flags & CISTPL_CFTABLE_AUDIO) {			link->conf.Attributes |= CONF_ENABLE_SPKR;			link->conf.Status = CCSR_AUDIO_ENA;		}				/* Use power settings for Vcc and Vpp if present */		/*  Note that the CIS values need to be rescaled */		if (cfg->vpp1.present & (1<<CISTPL_POWER_VNOM))			link->conf.Vpp =				cfg->vpp1.param[CISTPL_POWER_VNOM]/10000;		else if (dflt.vpp1.present & (1<<CISTPL_POWER_VNOM))			link->conf.Vpp =				dflt.vpp1.param[CISTPL_POWER_VNOM]/10000;				/* Do we need to allocate an interrupt? */		if (cfg->irq.IRQInfo1 || dflt.irq.IRQInfo1)			link->conf.Attributes |= CONF_ENABLE_IRQ;				/* IO window settings */		link->io.NumPorts1 = link->io.NumPorts2 = 0;		if ((cfg->io.nwin > 0) || (dflt.io.nwin > 0)) {			cistpl_io_t *io = (cfg->io.nwin) ? &cfg->io : &dflt.io;			link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;			if (!(io->flags & CISTPL_IO_8BIT))				link->io.Attributes1 = IO_DATA_PATH_WIDTH_16;			if (!(io->flags & CISTPL_IO_16BIT))				link->io.Attributes1 = IO_DATA_PATH_WIDTH_8;			link->io.BasePort1 = io->win[0].base;			link->io.NumPorts1 = io->win[0].len;			if (io->nwin > 1) {				link->io.Attributes2 = link->io.Attributes1;				link->io.BasePort2 = io->win[1].base;				link->io.NumPorts2 = io->win[1].len;			}		}				/* This reserves IO space but doesn't actually enable it */		if (pcmcia_request_io(link, &link->io) != 0)			goto next_entry;				/*		  Now set up a common memory window, if needed.  There is room		  in the struct pcmcia_device structure for one memory window handle,		  but if the base addresses need to be saved, or if multiple		  windows are needed, the info should go in the private data		  structure for this device.		  		  Note that the memory window base is a physical address, and		  needs to be mapped to virtual space with ioremap() before it		  is used.		*/		if ((cfg->mem.nwin > 0) || (dflt.mem.nwin > 0)) {			cistpl_mem_t *mem =				(cfg->mem.nwin) ? &cfg->mem : &dflt.mem;			req.Attributes = WIN_DATA_WIDTH_16|WIN_MEMORY_TYPE_CM;			req.Base = mem->win[0].host_addr;//.........这里部分代码省略.........
开发者ID:3sOx,项目名称:asuswrt-merlin,代码行数:101,


示例25: com20020_config

static int com20020_config(struct pcmcia_device *link){    struct arcnet_local *lp;    tuple_t tuple;    cisparse_t parse;    com20020_dev_t *info;    struct net_device *dev;    int i, last_ret, last_fn;    u_char buf[64];    int ioaddr;    info = link->priv;    dev = info->dev;    DEBUG(1,"config.../n");    DEBUG(0, "com20020_config(0x%p)/n", link);    tuple.Attributes = 0;    tuple.TupleData = buf;    tuple.TupleDataMax = 64;    tuple.TupleOffset = 0;    tuple.DesiredTuple = CISTPL_CONFIG;    CS_CHECK(GetFirstTuple, pcmcia_get_first_tuple(link, &tuple));    CS_CHECK(GetTupleData, pcmcia_get_tuple_data(link, &tuple));    CS_CHECK(ParseTuple, pcmcia_parse_tuple(link, &tuple, &parse));    link->conf.ConfigBase = parse.config.base;    DEBUG(1,"arcnet: baseport1 is %Xh/n", link->io.BasePort1);    i = !CS_SUCCESS;    if (!link->io.BasePort1)    {	for (ioaddr = 0x100; ioaddr < 0x400; ioaddr += 0x10)	{	    link->io.BasePort1 = ioaddr;	    i = pcmcia_request_io(link, &link->io);	    if (i == CS_SUCCESS)		break;	}    }    else	i = pcmcia_request_io(link, &link->io);        if (i != CS_SUCCESS)    {	DEBUG(1,"arcnet: requestIO failed totally!/n");	goto failed;    }	    ioaddr = dev->base_addr = link->io.BasePort1;    DEBUG(1,"arcnet: got ioaddr %Xh/n", ioaddr);    DEBUG(1,"arcnet: request IRQ %d (%Xh/%Xh)/n",	   link->irq.AssignedIRQ,	   link->irq.IRQInfo1, link->irq.IRQInfo2);    i = pcmcia_request_irq(link, &link->irq);    if (i != CS_SUCCESS)    {	DEBUG(1,"arcnet: requestIRQ failed totally!/n");	goto failed;    }    dev->irq = link->irq.AssignedIRQ;    CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link, &link->conf));    if (com20020_check(dev))    {	regdump(dev);	goto failed;    }        lp = dev->priv;    lp->card_name = "PCMCIA COM20020";    lp->card_flags = ARC_CAN_10MBIT; /* pretend all of them can 10Mbit */    link->dev_node = &info->node;    SET_NETDEV_DEV(dev, &handle_to_dev(link));    i = com20020_found(dev, 0);	/* calls register_netdev */        if (i != 0) {	DEBUG(1,KERN_NOTICE "com20020_cs: com20020_found() failed/n");	link->dev_node = NULL;	goto failed;    }    strcpy(info->node.dev_name, dev->name);    DEBUG(1,KERN_INFO "%s: port %#3lx, irq %d/n",           dev->name, dev->base_addr, dev->irq);    return 0;cs_failed:    cs_error(link, last_fn, last_ret);failed:    DEBUG(1,"com20020_config failed.../n");    com20020_release(link);    return -ENODEV;} /* com20020_config */
开发者ID:FatSunHYS,项目名称:OSCourseDesign,代码行数:100,



注:本文中的CS_CHECK函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ CS_GetEntry函数代码示例
C++ CS_ASSERT函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。