Exemplo n.º 1
0
/*
 * We cannot (yet) probe for an IO mapped card, although we can check that
 * it's where we were told it was, and even do autoirq.
 */
static int __init com20020isa_probe(struct net_device *dev)
{
	int ioaddr;
	unsigned long airqmask;
	struct arcnet_local *lp = dev->priv;

#ifndef MODULE
	arcnet_init();
#endif

	BUGLVL(D_NORMAL) printk(VERSION);

	ioaddr = dev->base_addr;
	if (!ioaddr) {
		BUGMSG(D_NORMAL, "No autoprobe (yet) for IO mapped cards; you "
		       "must specify the base address!\n");
		return -ENODEV;
	}
	if (check_region(ioaddr, ARCNET_TOTAL_SIZE)) {
		BUGMSG(D_NORMAL, "IO region %xh-%xh already allocated.\n",
		       ioaddr, ioaddr + ARCNET_TOTAL_SIZE - 1);
		return -ENXIO;
	}
	if (ASTATUS() == 0xFF) {
		BUGMSG(D_NORMAL, "IO address %x empty\n", ioaddr);
		return -ENODEV;
	}
	if (com20020_check(dev))
		return -ENODEV;

	if (!dev->irq) {
		/* if we do this, we're sure to get an IRQ since the
		 * card has just reset and the NORXflag is on until
		 * we tell it to start receiving.
		 */
		BUGMSG(D_INIT_REASONS, "intmask was %02Xh\n", inb(_INTMASK));
		outb(0, _INTMASK);
		airqmask = probe_irq_on();
		outb(NORXflag, _INTMASK);
		udelay(1);
		outb(0, _INTMASK);
		dev->irq = probe_irq_off(airqmask);

		if (dev->irq <= 0) {
			BUGMSG(D_INIT_REASONS, "Autoprobe IRQ failed first time\n");
			airqmask = probe_irq_on();
			outb(NORXflag, _INTMASK);
			udelay(5);
			outb(0, _INTMASK);
			dev->irq = probe_irq_off(airqmask);
			if (dev->irq <= 0) {
				BUGMSG(D_NORMAL, "Autoprobe IRQ failed.\n");
				return -ENODEV;
			}
		}
	}

	lp->card_name = "ISA COM20020";
	return com20020_found(dev, 0);
}
Exemplo n.º 2
0
static int __init com20020pci_init(void)
{
	BUGLVL(D_NORMAL) printk(VERSION);
#ifndef MODULE
	arcnet_init();
#endif
	return pci_module_init(&com20020pci_driver);
}
Exemplo n.º 3
0
Arquivo: com90xx.c Projeto: nhanh0/hah
int __init com90xx_probe(struct net_device *dev)
{
    int count, status, ioaddr, numprint, airq, retval = -ENODEV,
                                               openparen = 0;
    unsigned long airqmask;
    int ports[(0x3f0 - 0x200) / 16 + 1] =
    {0};
    u_long shmems[(0xFF800 - 0xA0000) / 2048 + 1] =
    {0};
    int numports, numshmems, *port;
    u_long *shmem;

    if (!dev && com90xx_skip_probe)
        return -ENODEV;

#ifndef MODULE
    arcnet_init();
#endif

    BUGLVL(D_NORMAL) printk(VERSION);

    /* set up the arrays where we'll store the possible probe addresses */
    numports = numshmems = 0;
    if (dev && dev->base_addr)
        ports[numports++] = dev->base_addr;
    else
        for (count = 0x200; count <= 0x3f0; count += 16)
            ports[numports++] = count;
    if (dev && dev->mem_start)
        shmems[numshmems++] = dev->mem_start;
    else
        for (count = 0xA0000; count <= 0xFF800; count += 2048)
            shmems[numshmems++] = count;

    /* Stage 1: abandon any reserved ports, or ones with status==0xFF
     * (empty), and reset any others by reading the reset port.
     */
    numprint = -1;
    for (port = &ports[0]; port - ports < numports; port++) {
        numprint++;
        numprint %= 8;
        if (!numprint) {
            BUGMSG2(D_INIT, "\n");
            BUGMSG2(D_INIT, "S1: ");
        }
        BUGMSG2(D_INIT, "%Xh ", *port);

        ioaddr = *port;

        if (check_region(*port, ARCNET_TOTAL_SIZE)) {
            BUGMSG2(D_INIT_REASONS, "(check_region)\n");
            BUGMSG2(D_INIT_REASONS, "S1: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
            *port = ports[numports - 1];
            numports--;
            port--;
            continue;
        }
        if (ASTATUS() == 0xFF) {
            BUGMSG2(D_INIT_REASONS, "(empty)\n");
            BUGMSG2(D_INIT_REASONS, "S1: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
            *port = ports[numports - 1];
            numports--;
            port--;
            continue;
        }
        inb(_RESET);	/* begin resetting card */

        BUGMSG2(D_INIT_REASONS, "\n");
        BUGMSG2(D_INIT_REASONS, "S1: ");
        BUGLVL(D_INIT_REASONS) numprint = 0;
    }
    BUGMSG2(D_INIT, "\n");

    if (!numports) {
        BUGMSG2(D_NORMAL, "S1: No ARCnet cards found.\n");
        return -ENODEV;
    }
    /* Stage 2: we have now reset any possible ARCnet cards, so we can't
     * do anything until they finish.  If D_INIT, print the list of
     * cards that are left.
     */
    numprint = -1;
    for (port = &ports[0]; port - ports < numports; port++) {
        numprint++;
        numprint %= 8;
        if (!numprint) {
            BUGMSG2(D_INIT, "\n");
            BUGMSG2(D_INIT, "S2: ");
        }
        BUGMSG2(D_INIT, "%Xh ", *port);
    }
    BUGMSG2(D_INIT, "\n");
    mdelay(RESETtime);

    /* Stage 3: abandon any shmem addresses that don't have the signature
     * 0xD1 byte in the right place, or are read-only.
     */
    numprint = -1;
    for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) {
        u_long ptr = *shmem;

        numprint++;
        numprint %= 8;
        if (!numprint) {
            BUGMSG2(D_INIT, "\n");
            BUGMSG2(D_INIT, "S3: ");
        }
        BUGMSG2(D_INIT, "%lXh ", *shmem);

        if (check_mem_region(*shmem, BUFFER_SIZE)) {
            BUGMSG2(D_INIT_REASONS, "(check_mem_region)\n");
            BUGMSG2(D_INIT_REASONS, "Stage 3: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
            *shmem = shmems[numshmems - 1];
            numshmems--;
            shmem--;
            continue;
        }
        if (isa_readb(ptr) != TESTvalue) {
            BUGMSG2(D_INIT_REASONS, "(%02Xh != %02Xh)\n",
                    isa_readb(ptr), TESTvalue);
            BUGMSG2(D_INIT_REASONS, "S3: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
            *shmem = shmems[numshmems - 1];
            numshmems--;
            shmem--;
            continue;
        }
        /* By writing 0x42 to the TESTvalue location, we also make
         * sure no "mirror" shmem areas show up - if they occur
         * in another pass through this loop, they will be discarded
         * because *cptr != TESTvalue.
         */
        isa_writeb(0x42, ptr);
        if (isa_readb(ptr) != 0x42) {
            BUGMSG2(D_INIT_REASONS, "(read only)\n");
            BUGMSG2(D_INIT_REASONS, "S3: ");
            *shmem = shmems[numshmems - 1];
            numshmems--;
            shmem--;
            continue;
        }
        BUGMSG2(D_INIT_REASONS, "\n");
        BUGMSG2(D_INIT_REASONS, "S3: ");
        BUGLVL(D_INIT_REASONS) numprint = 0;
    }
    BUGMSG2(D_INIT, "\n");

    if (!numshmems) {
        BUGMSG2(D_NORMAL, "S3: No ARCnet cards found.\n");
        return -ENODEV;
    }
    /* Stage 4: something of a dummy, to report the shmems that are
     * still possible after stage 3.
     */
    numprint = -1;
    for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) {
        numprint++;
        numprint %= 8;
        if (!numprint) {
            BUGMSG2(D_INIT, "\n");
            BUGMSG2(D_INIT, "S4: ");
        }
        BUGMSG2(D_INIT, "%lXh ", *shmem);
    }
    BUGMSG2(D_INIT, "\n");

    /* Stage 5: for any ports that have the correct status, can disable
     * the RESET flag, and (if no irq is given) generate an autoirq,
     * register an ARCnet device.
     *
     * Currently, we can only register one device per probe, so quit
     * after the first one is found.
     */
    numprint = -1;
    for (port = &ports[0]; port - ports < numports; port++) {
        numprint++;
        numprint %= 8;
        if (!numprint) {
            BUGMSG2(D_INIT, "\n");
            BUGMSG2(D_INIT, "S5: ");
        }
        BUGMSG2(D_INIT, "%Xh ", *port);

        ioaddr = *port;
        status = ASTATUS();

        if ((status & 0x9D)
                != (NORXflag | RECONflag | TXFREEflag | RESETflag)) {
            BUGMSG2(D_INIT_REASONS, "(status=%Xh)\n", status);
            BUGMSG2(D_INIT_REASONS, "S5: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
            *port = ports[numports - 1];
            numports--;
            port--;
            continue;
        }
        ACOMMAND(CFLAGScmd | RESETclear | CONFIGclear);
        status = ASTATUS();
        if (status & RESETflag) {
            BUGMSG2(D_INIT_REASONS, " (eternal reset, status=%Xh)\n",
                    status);
            BUGMSG2(D_INIT_REASONS, "S5: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
            *port = ports[numports - 1];
            numports--;
            port--;
            continue;
        }
        /* skip this completely if an IRQ was given, because maybe
         * we're on a machine that locks during autoirq!
         */
        if (!dev || !dev->irq) {
            /* if we do this, we're sure to get an IRQ since the
             * card has just reset and the NORXflag is on until
             * we tell it to start receiving.
             */
            airqmask = probe_irq_on();
            AINTMASK(NORXflag);
            udelay(1);
            AINTMASK(0);
            airq = probe_irq_off(airqmask);

            if (airq <= 0) {
                BUGMSG2(D_INIT_REASONS, "(airq=%d)\n", airq);
                BUGMSG2(D_INIT_REASONS, "S5: ");
                BUGLVL(D_INIT_REASONS) numprint = 0;
                *port = ports[numports - 1];
                numports--;
                port--;
                continue;
            }
        } else {
            airq = dev->irq;
        }

        BUGMSG2(D_INIT, "(%d,", airq);
        openparen = 1;

        /* Everything seems okay.  But which shmem, if any, puts
         * back its signature byte when the card is reset?
         *
         * If there are multiple cards installed, there might be
         * multiple shmems still in the list.
         */
#ifdef FAST_PROBE
        if (numports > 1 || numshmems > 1) {
            inb(_RESET);
            mdelay(RESETtime);
        } else {
            /* just one shmem and port, assume they match */
            isa_writeb(TESTvalue, shmems[0]);
        }
#else
        inb(_RESET);
        mdelay(RESETtime);
#endif

        for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++) {
            u_long ptr = *shmem;

            if (isa_readb(ptr) == TESTvalue) {	/* found one */
                BUGMSG2(D_INIT, "%lXh)\n", *shmem);
                openparen = 0;

                /* register the card */
                retval = com90xx_found(dev, *port, airq, *shmem);
                numprint = -1;

                /* remove shmem from the list */
                *shmem = shmems[numshmems - 1];
                numshmems--;

                break;	/* go to the next I/O port */
            } else {
                BUGMSG2(D_INIT_REASONS, "%Xh-", isa_readb(ptr));
            }
        }

        if (openparen) {
            BUGLVL(D_INIT) printk("no matching shmem)\n");
            BUGLVL(D_INIT_REASONS) printk("S5: ");
            BUGLVL(D_INIT_REASONS) numprint = 0;
        }
        *port = ports[numports - 1];
        numports--;
        port--;
    }

    BUGLVL(D_INIT_REASONS) printk("\n");

    /* Now put back TESTvalue on all leftover shmems. */
    for (shmem = &shmems[0]; shmem - shmems < numshmems; shmem++)
        isa_writeb(TESTvalue, *shmem);

    if (retval && dev && !numcards)
        BUGMSG2(D_NORMAL, "S5: No ARCnet cards found.\n");
    return retval;
}