static int __init sun3_82586_probe1(struct net_device *dev,int ioaddr) { int i, size, retval; if (!request_region(ioaddr, SUN3_82586_TOTAL_SIZE, DRV_NAME)) return -EBUSY; /* copy in the ethernet address from the prom */ for(i = 0; i < 6 ; i++) dev->dev_addr[i] = idprom->id_ethaddr[i]; printk("%s: SUN3 Intel 82586 found at %lx, ",dev->name,dev->base_addr); /* * check (or search) IO-Memory, 32K */ size = 0x8000; dev->mem_start = (unsigned long)dvma_malloc_align(0x8000, 0x1000); dev->mem_end = dev->mem_start + size; if(size != 0x2000 && size != 0x4000 && size != 0x8000) { printk("\n%s: Illegal memory size %d. Allowed is 0x2000 or 0x4000 or 0x8000 bytes.\n",dev->name,size); retval = -ENODEV; goto out; } if(!check586(dev,(char *) dev->mem_start,size)) { printk("?memcheck, Can't find memory at 0x%lx with size %d!\n",dev->mem_start,size); retval = -ENODEV; goto out; } ((struct priv *)netdev_priv(dev))->memtop = (char *)dvma_btov(dev->mem_start); ((struct priv *)netdev_priv(dev))->base = (unsigned long) dvma_btov(0); alloc586(dev); /* set number of receive-buffs according to memsize */ if(size == 0x2000) ((struct priv *)netdev_priv(dev))->num_recv_buffs = NUM_RECV_BUFFS_8; else if(size == 0x4000) ((struct priv *)netdev_priv(dev))->num_recv_buffs = NUM_RECV_BUFFS_16; else ((struct priv *)netdev_priv(dev))->num_recv_buffs = NUM_RECV_BUFFS_32; printk("Memaddr: 0x%lx, Memsize: %d, IRQ %d\n",dev->mem_start,size, dev->irq); dev->open = sun3_82586_open; dev->stop = sun3_82586_close; dev->get_stats = sun3_82586_get_stats; dev->tx_timeout = sun3_82586_timeout; dev->watchdog_timeo = HZ/20; dev->hard_start_xmit = sun3_82586_send_packet; dev->set_multicast_list = set_multicast_list; dev->if_port = 0; return 0; out: release_region(ioaddr, SUN3_82586_TOTAL_SIZE); return retval; }
/* clean up after our dma is done */ static int sun3scsi_dma_finish(int write_flag) { unsigned short count; unsigned short fifo; int ret = 0; sun3_dma_active = 0; #if 1 // check to empty the fifo on a read if(!write_flag) { int tmo = 20000; /* .2 sec */ while(1) { if(dregs->csr & CSR_FIFO_EMPTY) break; if(--tmo <= 0) { printk("sun3scsi: fifo failed to empty!\n"); return 1; } udelay(10); } } #endif count = sun3scsi_dma_count(default_instance); #ifdef OLDDMA /* if we've finished a read, copy out the data we read */ if(sun3_dma_orig_addr) { /* check for residual bytes after dma end */ if(count && (NCR5380_read(BUS_AND_STATUS_REG) & (BASR_PHASE_MATCH | BASR_ACK))) { printk("scsi%d: sun3_scsi_finish: read overrun baby... ", default_instance->host_no); printk("basr now %02x\n", NCR5380_read(BUS_AND_STATUS_REG)); ret = count; } /* copy in what we dma'd no matter what */ memcpy(sun3_dma_orig_addr, dmabuf, sun3_dma_orig_count); sun3_dma_orig_addr = NULL; } #else fifo = dregs->fifo_count; last_residual = fifo; /* empty bytes from the fifo which didn't make it */ if((!write_flag) && (count - fifo) == 2) { unsigned short data; unsigned char *vaddr; data = dregs->fifo_data; vaddr = (unsigned char *)dvma_btov(sun3_dma_orig_addr); vaddr += (sun3_dma_orig_count - fifo); vaddr[-2] = (data & 0xff00) >> 8; vaddr[-1] = (data & 0xff); }