Пример #1
0
/*
 * Set up the struct net_device associated with this card.  Called after
 * probing succeeds.
 */
static int __init arcrimi_found(struct net_device *dev)
{
	struct arcnet_local *lp;
	u_long first_mirror, last_mirror, shmem;
	int mirror_size;

	/* reserve the irq */  {
		if (request_irq(dev->irq, &arcnet_interrupt, 0, "arcnet (RIM I)", dev))
			BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", dev->irq);
		return -ENODEV;
	}

	shmem = dev->mem_start;
	isa_writeb(TESTvalue, shmem);
	isa_writeb(dev->dev_addr[0], shmem + 1);	/* actually the node ID */

	/* find the real shared memory start/end points, including mirrors */

	/* guess the actual size of one "memory mirror" - the number of
	 * bytes between copies of the shared memory.  On most cards, it's
	 * 2k (or there are no mirrors at all) but on some, it's 4k.
	 */
	mirror_size = MIRROR_SIZE;
	if (isa_readb(shmem) == TESTvalue
	    && isa_readb(shmem - mirror_size) != TESTvalue
	    && isa_readb(shmem - 2 * mirror_size) == TESTvalue)
		mirror_size *= 2;

	first_mirror = last_mirror = shmem;
	while (isa_readb(first_mirror) == TESTvalue)
		first_mirror -= mirror_size;
	first_mirror += mirror_size;

	while (isa_readb(last_mirror) == TESTvalue)
		last_mirror += mirror_size;
	last_mirror -= mirror_size;

	dev->mem_start = first_mirror;
	dev->mem_end = last_mirror + MIRROR_SIZE - 1;
	dev->rmem_start = dev->mem_start + BUFFER_SIZE * 0;
	dev->rmem_end = dev->mem_start + BUFFER_SIZE * 2 - 1;

	/* initialize the rest of the device structure. */

	lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
	if (!lp) {
		BUGMSG(D_NORMAL, "Can't allocate device data!\n");
		goto err_free_irq;
	}
	lp->card_name = "RIM I";
	lp->hw.command = arcrimi_command;
	lp->hw.status = arcrimi_status;
	lp->hw.intmask = arcrimi_setmask;
	lp->hw.reset = arcrimi_reset;
	lp->hw.open_close = arcrimi_openclose;
	lp->hw.copy_to_card = arcrimi_copy_to_card;
	lp->hw.copy_from_card = arcrimi_copy_from_card;
	lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1);
	if (!lp->mem_start) {
		BUGMSG(D_NORMAL, "Can't remap device memory!\n");
		goto err_free_dev_priv;
	}
	/* Fill in the fields of the device structure with generic
	 * values.
	 */
	arcdev_setup(dev);

	/* get and check the station ID from offset 1 in shmem */
	dev->dev_addr[0] = readb(lp->mem_start + 1);

	/* reserve the memory region - guaranteed to work by check_region */
	request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)");

	BUGMSG(D_NORMAL, "ARCnet RIM I: station %02Xh found at IRQ %d, "
	       "ShMem %lXh (%ld*%d bytes).\n",
	       dev->dev_addr[0],
	       dev->irq, dev->mem_start,
	 (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size);

	return 0;

      err_free_dev_priv:
	kfree(dev->priv);
      err_free_irq:
	free_irq(dev->irq, dev);
	return -EIO;
}
Пример #2
0
/* Set up the struct net_device associated with this card.  Called after
 * probing succeeds.
 */
static int __init com90xx_found(struct net_device *dev0, int ioaddr, int airq,
                                u_long shmem)
{
    struct net_device *dev = dev0;
    struct arcnet_local *lp;
    u_long first_mirror, last_mirror;
    int mirror_size, err;

    /* allocate struct net_device if we don't have one yet */
    if (!dev && !(dev = dev_alloc("arc%d", &err))) {
        BUGMSG2(D_NORMAL, "com90xx: Can't allocate device!\n");
        return err;
    }
    lp = dev->priv = kmalloc(sizeof(struct arcnet_local), GFP_KERNEL);
    if (!lp) {
        BUGMSG(D_NORMAL, "Can't allocate device data!\n");
        goto err_free_dev;
    }
    /* find the real shared memory start/end points, including mirrors */

    /* guess the actual size of one "memory mirror" - the number of
     * bytes between copies of the shared memory.  On most cards, it's
     * 2k (or there are no mirrors at all) but on some, it's 4k.
     */
    mirror_size = MIRROR_SIZE;
    if (isa_readb(shmem) == TESTvalue
            && isa_readb(shmem - mirror_size) != TESTvalue
            && isa_readb(shmem - 2 * mirror_size) == TESTvalue)
        mirror_size *= 2;

    first_mirror = last_mirror = shmem;
    while (isa_readb(first_mirror) == TESTvalue)
        first_mirror -= mirror_size;
    first_mirror += mirror_size;

    while (isa_readb(last_mirror) == TESTvalue)
        last_mirror += mirror_size;
    last_mirror -= mirror_size;

    dev->mem_start = first_mirror;
    dev->mem_end = last_mirror + MIRROR_SIZE - 1;
    dev->rmem_start = dev->mem_start + BUFFER_SIZE * 0;
    dev->rmem_end = dev->mem_start + BUFFER_SIZE * 2 - 1;

    /* Initialize the rest of the device structure. */
    memset(lp, 0, sizeof(struct arcnet_local));
    lp->card_name = "COM90xx";
    lp->hw.command = com90xx_command;
    lp->hw.status = com90xx_status;
    lp->hw.intmask = com90xx_setmask;
    lp->hw.reset = com90xx_reset;
    lp->hw.open_close = com90xx_openclose;
    lp->hw.copy_to_card = com90xx_copy_to_card;
    lp->hw.copy_from_card = com90xx_copy_from_card;
    lp->mem_start = ioremap(dev->mem_start, dev->mem_end - dev->mem_start + 1);
    if (!lp->mem_start) {
        BUGMSG(D_NORMAL, "Can't remap device memory!\n");
        goto err_free_dev_priv;
    }
    /* Fill in the fields of the device structure with generic values. */
    arcdev_setup(dev);

    /* get and check the station ID from offset 1 in shmem */
    dev->dev_addr[0] = readb(lp->mem_start + 1);

    /* reserve the irq */
    if (request_irq(airq, &arcnet_interrupt, 0, "arcnet (90xx)", dev)) {
        BUGMSG(D_NORMAL, "Can't get IRQ %d!\n", airq);
        goto err_unmap;
    }
    dev->irq = airq;

    /* reserve the I/O and memory regions - guaranteed to work by check_region */
    request_region(ioaddr, ARCNET_TOTAL_SIZE, "arcnet (90xx)");
    request_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1, "arcnet (90xx)");
    dev->base_addr = ioaddr;

    BUGMSG(D_NORMAL, "COM90xx station %02Xh found at %03lXh, IRQ %d, "
           "ShMem %lXh (%ld*%xh).\n",
           dev->dev_addr[0],
           dev->base_addr, dev->irq, dev->mem_start,
           (dev->mem_end - dev->mem_start + 1) / mirror_size, mirror_size);

    if (!dev0 && register_netdev(dev))
        goto err_release;

    cards[numcards++] = dev;
    return 0;

err_release:
    free_irq(dev->irq, dev);
    release_region(dev->base_addr, ARCNET_TOTAL_SIZE);
    release_mem_region(dev->mem_start, dev->mem_end - dev->mem_start + 1);
err_unmap:
    iounmap(lp->mem_start);
err_free_dev_priv:
    kfree(dev->priv);
err_free_dev:
    if (!dev0)
        kfree(dev);
    return -EIO;
}