Skip to content
Snippets Groups Projects
4xx_enet.c 61.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • 		if (dev == NULL) {
    
    			printf ("ppc_4xx_eth_initialize: "
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    				"Cannot allocate eth_device %d\n", eth_num);
    
    		memset(dev, 0, sizeof(*dev));
    
    
    		/* Allocate our private use data */
    
    		hw = (EMAC_4XX_HW_PST) malloc (sizeof (*hw));
    
    		if (hw == NULL) {
    
    			printf ("ppc_4xx_eth_initialize: "
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    				"Cannot allocate private hw data for eth_device %d",
    
    				eth_num);
    			free (dev);
    			return (-1);
    		}
    
    		memset(hw, 0, sizeof(*hw));
    
    		hw->hw_addr = hw_addr[eth_num];
    		memcpy (dev->enetaddr, ethaddr[eth_num], 6);
    
    		hw->devnum = eth_num;
    
    		sprintf (dev->name, "ppc_4xx_eth%d", eth_num - CONFIG_EMAC_NR_START);
    
    		dev->priv = (void *) hw;
    
    		dev->init = ppc_4xx_eth_init;
    		dev->halt = ppc_4xx_eth_halt;
    		dev->send = ppc_4xx_eth_send;
    		dev->recv = ppc_4xx_eth_rx;
    
    		eth_register(dev);
    
    #if defined(CONFIG_MII) || defined(CONFIG_CMD_MII)
    		miiphy_register(dev->name,
    				emac4xx_miiphy_read, emac4xx_miiphy_write);
    #endif
    
    
    		if (0 == virgin) {
    			/* set the MAL IER ??? names may change with new spec ??? */
    
    #if defined(CONFIG_440SPE) || \
        defined(CONFIG_440EPX) || defined(CONFIG_440GRX) || \
    
        defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
    
        defined(CONFIG_405EX)
    
    			mal_ier =
    				MAL_IER_PT | MAL_IER_PRE | MAL_IER_PWE |
    				MAL_IER_DE | MAL_IER_OTE | MAL_IER_OE | MAL_IER_PE ;
    #else
    
    			mal_ier =
    				MAL_IER_DE | MAL_IER_NE | MAL_IER_TE |
    				MAL_IER_OPBE | MAL_IER_PLBE;
    
    			mtdcr (MAL0_ESR, 0xffffffff);	/* clear pending interrupts */
    			mtdcr (MAL0_TXDEIR, 0xffffffff);	/* clear pending interrupts */
    			mtdcr (MAL0_RXDEIR, 0xffffffff);	/* clear pending interrupts */
    			mtdcr (MAL0_IER, mal_ier);
    
    
    			/* install MAL interrupt handler */
    
    			irq_install_handler (VECNUM_MAL_SERR,
    
    					     (interrupt_handler_t *) enetInt,
    					     dev);
    
    			irq_install_handler (VECNUM_MAL_TXEOB,
    
    					     (interrupt_handler_t *) enetInt,
    					     dev);
    
    			irq_install_handler (VECNUM_MAL_RXEOB,
    
    					     (interrupt_handler_t *) enetInt,
    					     dev);
    
    			irq_install_handler (VECNUM_MAL_TXDE,
    
    					     (interrupt_handler_t *) enetInt,
    					     dev);
    
    			irq_install_handler (VECNUM_MAL_RXDE,
    
    					     (interrupt_handler_t *) enetInt,
    					     dev);
    			virgin = 1;
    		}
    	}			/* end for each supported device */