예제 #1
0
파일: dev_c3725.c 프로젝트: GNS3/dynamips
/* Set chassis MAC address */
int c3725_chassis_set_mac_addr(c3725_t *router,char *mac_addr)
{
   if (parse_mac_addr(&router->mac_addr,mac_addr) == -1) {
      vm_error(router->vm,"unable to parse MAC address '%s'.\n",mac_addr);
      return(-1);
   }

   /* Set the chassis base MAC address */
   c3725_burn_mac_addr(router,&router->mac_addr);
   return(0);
}
예제 #2
0
int acacia_probe(int port_num)
{
    struct acacia_local *lp = NULL;
    struct acacia_if_t *bif = NULL;
    struct net_device *dev = NULL;
    int i, retval;
    bif = &acacia_iflist[port_num];
    if (port_num == 0) {

        request_region(bif->iobase, 0x24C, "ACACIA0");
    }
    else if (port_num == 1)
    {
        request_region(bif->iobase, 0x24C, "ACACIA1");
    }
    /* Allocate a new 'dev' if needed */
    dev = init_etherdev(0, sizeof(struct acacia_local));
    bif->dev = dev;

    if (port_num == 0) {
        info("RC32438 ethernet0 found at 0x%08x\n", bif->iobase);
    }
    else if (port_num == 1)
        info("RC32438 ethernet1 found at 0x%08x\n", bif->iobase);

    /* Fill in the 'dev' fields. */
    dev->base_addr = bif->iobase;
    dev->irq = bif->rx_dma_irq; /* just use the rx dma irq */

    if ((retval = parse_mac_addr(dev, bif->mac_str))) {
        err("%s: MAC address parse failed\n", __func__);
        retval = -EINVAL;
        goto probe1_err_out;
    }

    info("HW Address ");
    for (i = 0; i < 6; i++) {
        printk("%2.2x", dev->dev_addr[i]);
        if (i<5)
            printk(":");
    }
    printk("\n");

    info("Rx IRQ %d, Tx IRQ %d\n", bif->rx_dma_irq, bif->tx_dma_irq);

    /* Initialize the device structure. */
    if (dev->priv == NULL) {
        lp = (struct acacia_local *)kmalloc(sizeof(*lp), GFP_KERNEL);
        memset(lp, 0, sizeof(struct acacia_local));
    } else {
        lp = (struct acacia_local *)dev->priv;
    }

    dev->priv = lp;

    lp->rx_irq = bif->rx_dma_irq;
    lp->tx_irq = bif->tx_dma_irq;
    lp->ovr_irq = bif->rx_ovr_irq;

    lp->eth_regs = ioremap_nocache(bif->iobase,
                                   sizeof(*lp->eth_regs));
    if (!lp->eth_regs) {
        err("Can't remap eth registers\n");
        retval = -ENXIO;
        goto probe1_err_out;
    }
    if (port_num == 0) {
        lp->rx_dma_regs =
            ioremap_nocache(DMA0_PhysicalAddress + 2*DMA_CHAN_OFFSET,
                            sizeof(struct DMA_Chan_s));
        if (!lp->rx_dma_regs) {
            err("Can't remap Rx DMA registers\n");
            retval = -ENXIO;
            goto probe1_err_out;
        }

        lp->tx_dma_regs =
            ioremap_nocache(DMA0_PhysicalAddress  + 3*DMA_CHAN_OFFSET,
                            sizeof(struct DMA_Chan_s));
        if (!lp->tx_dma_regs) {
            err("Can't remap Tx DMA registers\n");
            retval = -ENXIO;
            goto probe1_err_out;
        }
    }
    else if (port_num == 1) {
        lp->rx_dma_regs =
            ioremap_nocache(DMA0_PhysicalAddress  + 4*DMA_CHAN_OFFSET,
                            sizeof(struct DMA_Chan_s));
        if (!lp->rx_dma_regs) {
            err("Can't remap Rx DMA registers\n");
            retval = -ENXIO;
            goto probe1_err_out;
        }

        lp->tx_dma_regs =
            ioremap_nocache(DMA0_PhysicalAddress  + 5*DMA_CHAN_OFFSET,
                            sizeof(struct DMA_Chan_s));
        if (!lp->tx_dma_regs) {
            err("Can't remap Tx DMA registers\n");
            retval = -ENXIO;
            goto probe1_err_out;
        }

    }
    lp->td_ring =
        (DMAD_t)kmalloc(TD_RING_SIZE + RD_RING_SIZE,
                        GFP_KERNEL);
    if (!lp->td_ring) {
        err("Can't allocate descriptors\n");
        retval = -ENOMEM;
        goto probe1_err_out;
    }

    dma_cache_inv((unsigned long)(lp->td_ring),
                  TD_RING_SIZE + RD_RING_SIZE);

    /* now convert TD_RING pointer to KSEG1 */
    lp->td_ring = (DMAD_t )KSEG1ADDR(lp->td_ring);
    lp->rd_ring = &lp->td_ring[ACACIA_NUM_TDS];

    /* allocate receive buffer area */
    /* FIXME, maybe we should use skbs */
    if ((lp->rba = (u8*)kmalloc(ACACIA_NUM_RDS * ACACIA_RBSIZE,
                                GFP_KERNEL)) == NULL) {
        err("couldn't allocate receive buffers\n");
        retval = -ENOMEM;
        goto probe1_err_out;
    } 	 	/* get virtual dma address */

    dma_cache_inv((unsigned long)(lp->rba),
                  ACACIA_NUM_RDS * ACACIA_RBSIZE);

    spin_lock_init(&lp->lock);

    dev->open = acacia_open;
    dev->stop = acacia_close;
    dev->hard_start_xmit = acacia_send_packet;
    dev->get_stats	= acacia_get_stats;
    dev->set_multicast_list = &acacia_multicast_list;
    dev->tx_timeout = acacia_tx_timeout;
    dev->watchdog_timeo = ACACIA_TX_TIMEOUT;

#ifdef ACACIA_PROC_DEBUG
    lp->ps = create_proc_read_entry ("net/rc32438", 0, NULL,
                                     acacia_read_proc, dev);
#endif
    /*
     * clear tally counter
     */

    /* Fill in the fields of the device structure with ethernet values. */
    ether_setup(dev);
    return 0;

probe1_err_out:
    acacia_cleanup_module();
    err("%s failed.  Returns %d\n", __func__, retval);
    return retval;
}