예제 #1
0
int probe_sb(struct address_info *hw_config)
{
#ifdef CONFIG_MCA
	/* MCA code added by ZP Gu ([email protected]) */
	if (MCA_bus) {               /* no multiple REPLY card probing */
		int slot;
		u8 pos2, pos3, pos4;

		slot = mca_find_adapter( 0x5138, 0 );
		if( slot == MCA_NOTFOUND ) 
		{
			slot = mca_find_adapter( 0x5137, 0 );

			if (slot != MCA_NOTFOUND)
				mca_set_adapter_name( slot, "REPLY SB16 & SCSI Adapter" );
		}
		else
		{
			mca_set_adapter_name( slot, "REPLY SB16 Adapter" );
		}

		if (slot != MCA_NOTFOUND) 
		{
			mca_mark_as_used(slot);
			pos2 = mca_read_stored_pos( slot, 2 );
			pos3 = mca_read_stored_pos( slot, 3 );
			pos4 = mca_read_stored_pos( slot, 4 );

			if (pos2 & 0x4) 
			{
				/* enabled? */
				static unsigned short irq[] = { 0, 5, 7, 10 };
				/*
				static unsigned short midiaddr[] = {0, 0x330, 0, 0x300 };
       				*/

				hw_config->io_base = 0x220 + 0x20 * (pos2 >> 6);
				hw_config->irq = irq[(pos4 >> 5) & 0x3];
				hw_config->dma = pos3 & 0xf;
				/* Reply ADF wrong on High DMA, pos[1] should start w/ 00 */
				hw_config->dma2 = (pos3 >> 4) & 0x3;
				if (hw_config->dma2 == 0)
					hw_config->dma2 = hw_config->dma;
				else
					hw_config->dma2 += 4;
				/*
					hw_config->driver_use_2 = midiaddr[(pos2 >> 3) & 0x3];
				*/
	
				printk("SB: Reply MCA SB at slot=%d \
iobase=0x%x irq=%d lo_dma=%d hi_dma=%d\n",
						slot+1,
				        	hw_config->io_base, hw_config->irq,
	        				hw_config->dma, hw_config->dma2);
			}
			else
			{
				printk ("Reply SB Base I/O address disabled\n");
			}
		}
예제 #2
0
struct net_device *__init mc32_probe(int unit)
{
	struct net_device *dev = alloc_etherdev(sizeof(struct mc32_local));
	static int current_mca_slot = -1;
	int i;
	int err;

	if (!dev)
		return ERR_PTR(-ENOMEM);

	if (unit >= 0)
		sprintf(dev->name, "eth%d", unit);

	SET_MODULE_OWNER(dev);

	/* Do not check any supplied i/o locations. 
	   POS registers usually don't fail :) */

	/* MCA cards have POS registers.  
	   Autodetecting MCA cards is extremely simple. 
	   Just search for the card. */

	for(i = 0; (mc32_adapters[i].name != NULL); i++) {
		current_mca_slot = 
			mca_find_unused_adapter(mc32_adapters[i].id, 0);

		if(current_mca_slot != MCA_NOTFOUND) {
			if(!mc32_probe1(dev, current_mca_slot))
			{
				mca_set_adapter_name(current_mca_slot, 
						mc32_adapters[i].name);
				mca_mark_as_used(current_mca_slot);
				err = register_netdev(dev);
				if (err) {
					cleanup_card(dev);
					free_netdev(dev);
					dev = ERR_PTR(err);
				}
				return dev;
			}
			
		}
	}
	free_netdev(dev);
	return ERR_PTR(-ENODEV);
}
예제 #3
0
파일: ibmlana.c 프로젝트: xricson/knoppix
int ibmlana_probe(struct net_device *dev)
{
	int force_detect = 0;
	int slot, z;
	int base = 0, irq = 0, iobase = 0, memlen = 0;
	ibmlana_priv *priv;
	ibmlana_medium medium;

	SET_MODULE_OWNER(dev);

	/* can't work without an MCA bus ;-) */
	if (MCA_bus == 0)
		return -ENODEV;

	/* start address of 1 --> forced detection */
	if (dev->mem_start == 1)
		force_detect = 1;

	/* search through slots */
	if (dev != NULL) {
		base = dev->mem_start;
		irq = dev->irq;
	}
	slot = mca_find_adapter(IBM_LANA_ID, startslot);

	while (slot != -1) {
		/* deduce card addresses */
		getaddrs(slot, &base, &memlen, &iobase, &irq, &medium);

		/* slot already in use ? */
		if (mca_is_adapter_used(slot)) {
			slot = mca_find_adapter(IBM_LANA_ID, slot + 1);
			continue;
		}
		/* were we looking for something different ? */
		if (dev->irq != 0 || dev->mem_start != 0) {
			if (dev->irq != 0 && dev->irq != irq) {
				slot = mca_find_adapter(IBM_LANA_ID, slot + 1);
				continue;
			}
			if (dev->mem_start != 0 && dev->mem_start != base) 
			{
				slot = mca_find_adapter(IBM_LANA_ID, slot + 1);
				continue;
			}
		}
		/* found something that matches */
		break;
	}

	/* nothing found ? */
	if (slot == -1)
		return (base != 0 || irq != 0) ? -ENXIO : -ENODEV;

	/* announce success */
	printk(KERN_INFO "%s: IBM LAN Adapter/A found in slot %d\n", dev->name, slot + 1);

	/* try to obtain I/O range */
	if (!request_region(iobase, IBM_LANA_IORANGE, dev->name)) {
		printk(KERN_ERR "%s: cannot allocate I/O range at %#x!\n", dev->name, iobase);
		startslot = slot + 1;
		return -EBUSY;
	}

	/* make procfs entries */
	mca_set_adapter_name(slot, "IBM LAN Adapter/A");
	mca_set_adapter_procfn(slot, (MCA_ProcFn) ibmlana_getinfo, dev);

	mca_mark_as_used(slot);

	/* allocate structure */
	priv = dev->priv = (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL);
	if (!priv) {
		release_region(iobase, IBM_LANA_IORANGE);
		return -ENOMEM;
	}
	priv->slot = slot;
	priv->realirq = irq;
	priv->medium = medium;
	spin_lock_init(&priv->lock);
	memset(&priv->stat, 0, sizeof(struct net_device_stats));

	/* set base + irq for this device (irq not allocated so far) */

	dev->irq = 0;
	dev->mem_start = base;
	dev->mem_end = base + memlen;
	dev->base_addr = iobase;

	/* set methods */

	dev->open = ibmlana_open;
	dev->stop = ibmlana_close;
	dev->set_config = ibmlana_config;
	dev->hard_start_xmit = ibmlana_tx;
	dev->do_ioctl = NULL;
	dev->get_stats = ibmlana_stats;
	dev->set_multicast_list = ibmlana_set_multicast_list;
	dev->flags |= IFF_MULTICAST;

	/* generic setup */

	ether_setup(dev);

	/* copy out MAC address */

	for (z = 0; z < sizeof(dev->dev_addr); z++)
		dev->dev_addr[z] = inb(dev->base_addr + MACADDRPROM + z);

	/* print config */

	printk(KERN_INFO "%s: IRQ %d, I/O %#lx, memory %#lx-%#lx, "
	       "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
	       dev->name, priv->realirq, dev->base_addr,
	       dev->mem_start, dev->mem_end - 1,
	       dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
	       dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
	printk(KERN_INFO "%s: %s medium\n", dev->name, MediaNames[priv->medium]);

	/* reset board */

	ResetBoard(dev);

	/* next probe will start at next slot */

	startslot = slot + 1;

	return 0;
}