lp = (struct sonic_local *)dev->priv; 
/* Now set up the pointers to point to the appropriate places */ lp->cda = lp->descriptors; lp->tda = lp->cda + (SIZEOF_SONIC_CDA * SONIC_BUS_SCALE(lp->dma_bitmode)); lp->rda = lp->tda + (SIZEOF_SONIC_TD * SONIC_NUM_TDS * SONIC_BUS_SCALE(lp->dma_bitmode)); lp->rra = lp->rda + (SIZEOF_SONIC_RD * SONIC_NUM_RDS * SONIC_BUS_SCALE(lp->dma_bitmode));  lp->cda_laddr = lp->descriptors_laddr; lp->tda_laddr = lp->cda_laddr + (SIZEOF_SONIC_CDA * SONIC_BUS_SCALE(lp->dma_bitmode)); lp->rda_laddr = lp->tda_laddr + (SIZEOF_SONIC_TD * SONIC_NUM_TDS * SONIC_BUS_SCALE(lp->dma_bitmode)); lp->rra_laddr = lp->rda_laddr + (SIZEOF_SONIC_RD * SONIC_NUM_RDS * SONIC_BUS_SCALE(lp->dma_bitmode));  
static int __init sonic_probe1(struct net_device *dev, unsigned long base_addr,                               unsigned int irq){	static unsigned version_printed;	unsigned int silicon_revision;	unsigned int val;	struct sonic_local *lp;	int err = -ENODEV;	int i;	if (!request_mem_region(base_addr, SONIC_MEM_SIZE, jazz_sonic_string))		return -EBUSY;	/*	 * get the Silicon Revision ID. If this is one of the known	 * one assume that we found a SONIC ethernet controller at	 * the expected location.	 */	silicon_revision = SONIC_READ(SONIC_SR);	if (sonic_debug > 1)		printk("SONIC Silicon Revision = 0x%04x\n",silicon_revision);	i = 0;	while (known_revisions[i] != 0xffff	       && known_revisions[i] != silicon_revision)		i++;	if (known_revisions[i] == 0xffff) {		printk("SONIC ethernet controller not found (0x%4x)\n",		       silicon_revision);		goto out;	}    	if (sonic_debug  &&  version_printed++ == 0)		printk(version);	printk("%s: Sonic ethernet found at 0x%08lx, ", dev->name, base_addr);	/* Fill in the 'dev' fields. */	dev->base_addr = base_addr;	dev->irq = irq;	/*	 * Put the sonic into software reset, then	 * retrieve and print the ethernet address.	 */	SONIC_WRITE(SONIC_CMD,SONIC_CR_RST);	SONIC_WRITE(SONIC_CEP,0);	for (i=0; i<3; i++) {		val = SONIC_READ(SONIC_CAP0-i);		dev->dev_addr[i*2] = val;		dev->dev_addr[i*2+1] = val >> 8;	}	printk("HW Address ");	for (i = 0; i < 6; i++) {		printk("%2.2x", dev->dev_addr[i]);		if (i<5)			printk(":");	}	printk(" IRQ %d\n", irq);	err = -ENOMEM;    	/* Initialize the device structure. */	if (dev->priv == NULL) {		/*		 * the memory be located in the same 64kb segment		 */		lp = NULL;		i = 0;		do {			lp = kmalloc(sizeof(*lp), GFP_KERNEL);			if ((unsigned long) lp >> 16			    != ((unsigned long)lp + sizeof(*lp) ) >> 16) {				/* FIXME, free the memory later */				kfree(lp);				lp = NULL;			}		} while (lp == NULL && i++ < 20);		if (lp == NULL) {			printk("%s: couldn't allocate memory for descriptors\n",			       dev->name);			goto out;		}		memset(lp, 0, sizeof(struct sonic_local));		/* get the virtual dma address */		lp->cda_laddr = vdma_alloc(CPHYSADDR(lp),sizeof(*lp));		if (lp->cda_laddr == ~0UL) {			printk("%s: couldn't get DMA page entry for "			       "descriptors\n", dev->name);			goto out1;		}		lp->tda_laddr = lp->cda_laddr + sizeof (lp->cda);		lp->rra_laddr = lp->tda_laddr + sizeof (lp->tda);		lp->rda_laddr = lp->rra_laddr + sizeof (lp->rra);			/* allocate receive buffer area */		/* FIXME, maybe we should use skbs */		lp->rba = kmalloc(SONIC_NUM_RRS * SONIC_RBSIZE, GFP_KERNEL);		if (!lp->rba) {			printk("%s: couldn't allocate receive buffers\n",			       dev->name);			goto out2;		}		/* get virtual dma address */		lp->rba_laddr = vdma_alloc(CPHYSADDR(lp->rba),		                           SONIC_NUM_RRS * SONIC_RBSIZE);		if (lp->rba_laddr == ~0UL) {			printk("%s: couldn't get DMA page entry for receive "			       "buffers\n",dev->name);			goto out3;		}		/* now convert pointer to KSEG1 pointer */		lp->rba = (char *)KSEG1ADDR(lp->rba);		flush_cache_all();		dev->priv = (struct sonic_local *)KSEG1ADDR(lp);	}	lp = (struct sonic_local *)dev->priv;	dev->open = sonic_open;	dev->stop = sonic_close;	dev->hard_start_xmit = sonic_send_packet;	dev->get_stats	= sonic_get_stats;	dev->set_multicast_list = &sonic_multicast_list;	dev->watchdog_timeo = TX_TIMEOUT;	/*	 * clear tally counter	 */	SONIC_WRITE(SONIC_CRCT,0xffff);	SONIC_WRITE(SONIC_FAET,0xffff);	SONIC_WRITE(SONIC_MPT,0xffff);	return 0;out3:	kfree(lp->rba);out2:	vdma_free(lp->cda_laddr);out1:	kfree(lp);out:	release_region(base_addr, SONIC_MEM_SIZE);	return err;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/efcce839360fb3a7b6dedeacaec80f68b0f2d052/jazzsonic.c/clean/drivers/net/jazzsonic.c