static int tms380tr_bringup_diags(struct net_device *dev) { int loop_cnt, retry_cnt; unsigned short Status; tms380tr_wait(HALF_SECOND); tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); tms380tr_wait(HALF_SECOND); retry_cnt = BUD_MAX_RETRIES; do { retry_cnt--; if(tms380tr_debug > 3) printk(KERN_DEBUG "BUD-Status: "); loop_cnt = BUD_MAX_LOOPCNT; do { loop_cnt--; tms380tr_wait(HALF_SECOND); Status = SIFREADW(SIFSTS); Status &= STS_MASK; if(tms380tr_debug > 3) printk(KERN_DEBUG " %04X \n", Status); if(Status == STS_INITIALIZE) return (1); } while((loop_cnt > 0) && ((Status & (STS_ERROR | STS_TEST)) != (STS_ERROR | STS_TEST))); if(retry_cnt > 0) { printk(KERN_INFO "%s: Adapter Software Reset.\n", dev->name); tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); tms380tr_wait(HALF_SECOND); } } while(retry_cnt > 0); Status = SIFREADW(SIFSTS); printk(KERN_INFO "%s: Hardware error\n", dev->name); Status &= 0x001f; if (Status & 0x0010) printk(KERN_INFO "%s: BUD Error: Timeout\n", dev->name); else if ((Status & 0x000f) > 6) printk(KERN_INFO "%s: BUD Error: Illegal Failure\n", dev->name); else printk(KERN_INFO "%s: Bring Up Diagnostics Error (%04X) occurred\n", dev->name, Status & 0x000f); return (-1); }
static void abyss_enable(struct net_device *dev) { unsigned char reset_reg; unsigned long ioaddr; ioaddr = dev->base_addr; reset_reg = inb(ioaddr + PCIBM2_RESET_REG); reset_reg |= PCIBM2_RESET_REG_CHIP_NRES; outb(reset_reg, ioaddr + PCIBM2_RESET_REG); tms380tr_wait(100); }
static void at24_setlines(unsigned long regaddr, unsigned char clock, unsigned char data) { unsigned char val = AT24_ENABLE; if (clock) val |= AT24_CLOCK; if (data) val |= AT24_DATA; outb(val, regaddr); tms380tr_wait(20); }
static int abyss_chipset_init(struct net_device *dev) { unsigned char reset_reg; unsigned long ioaddr; ioaddr = dev->base_addr; reset_reg = inb(ioaddr + PCIBM2_RESET_REG); reset_reg |= PCIBM2_RESET_REG_CHIP_NRES; outb(reset_reg, ioaddr + PCIBM2_RESET_REG); reset_reg &= ~(PCIBM2_RESET_REG_CHIP_NRES | PCIBM2_RESET_REG_FIFO_NRES | PCIBM2_RESET_REG_SIF_NRES); outb(reset_reg, ioaddr + PCIBM2_RESET_REG); tms380tr_wait(100); reset_reg |= PCIBM2_RESET_REG_CHIP_NRES; outb(reset_reg, ioaddr + PCIBM2_RESET_REG); reset_reg |= PCIBM2_RESET_REG_SIF_NRES; outb(reset_reg, ioaddr + PCIBM2_RESET_REG); reset_reg |= PCIBM2_RESET_REG_FIFO_NRES; outb(reset_reg, ioaddr + PCIBM2_RESET_REG); outb(PCIBM2_INT_CONTROL_REG_SINTEN | PCIBM2_INT_CONTROL_REG_PCI_ERR_ENABLE, ioaddr + PCIBM2_INT_CONTROL_REG); outb(30, ioaddr + PCIBM2_FIFO_THRESHOLD); return 0; }
static int tms380tr_init_adapter(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); const unsigned char SCB_Test[6] = {0x00, 0x00, 0xC1, 0xE2, 0xD4, 0x8B}; const unsigned char SSB_Test[8] = {0xFF, 0xFF, 0xD1, 0xD7, 0xC5, 0xD9, 0xC3, 0xD4}; void *ptr = (void *)&tp->ipb; unsigned short *ipb_ptr = (unsigned short *)ptr; unsigned char *cb_ptr = (unsigned char *) &tp->scb; unsigned char *sb_ptr = (unsigned char *) &tp->ssb; unsigned short Status; int i, loop_cnt, retry_cnt; tp->ipb.SCB_Addr = SWAPW(((char *)&tp->scb - (char *)tp) + tp->dmabuffer); tp->ipb.SSB_Addr = SWAPW(((char *)&tp->ssb - (char *)tp) + tp->dmabuffer); if(tms380tr_debug > 3) { printk(KERN_DEBUG "%s: buffer (real): %lx\n", dev->name, (long) &tp->scb); printk(KERN_DEBUG "%s: buffer (virt): %lx\n", dev->name, (long) ((char *)&tp->scb - (char *)tp) + (long) tp->dmabuffer); printk(KERN_DEBUG "%s: buffer (DMA) : %lx\n", dev->name, (long) tp->dmabuffer); printk(KERN_DEBUG "%s: buffer (tp) : %lx\n", dev->name, (long) tp); } retry_cnt = INIT_MAX_RETRIES; do { retry_cnt--; SIFWRITEW(0x0001, SIFADX); SIFWRITEW(0x0A00, SIFADD); for(i = 0; i < 11; i++) SIFWRITEW(ipb_ptr[i], SIFINC); tms380tr_exec_sifcmd(dev, CMD_EXECUTE); loop_cnt = INIT_MAX_LOOPCNT; do { Status = 0; loop_cnt--; tms380tr_wait(HALF_SECOND); Status = SIFREADW(SIFSTS); Status &= STS_MASK; } while(((Status &(STS_INITIALIZE | STS_ERROR | STS_TEST)) != 0) && ((Status & STS_ERROR) == 0) && (loop_cnt != 0)); if((Status & (STS_INITIALIZE | STS_ERROR | STS_TEST)) == 0) { i = 0; do { if(SCB_Test[i] != *(cb_ptr + i)) { printk(KERN_INFO "%s: DMA failed\n", dev->name); return (-1); } i++; } while(i < 6); i = 0; do { if(SSB_Test[i] != *(sb_ptr + i)) return (-1); i++; } while (i < 8); return (1); } else { if((Status & STS_ERROR) != 0) { Status = SIFREADW(SIFSTS); Status &= STS_ERROR_MASK; printk(KERN_INFO "%s: Status error: %d\n", dev->name, Status); return (-1); } else { if(retry_cnt > 0) { tms380tr_exec_sifcmd(dev, EXEC_SOFT_RESET); tms380tr_wait(HALF_SECOND); } } } } while(retry_cnt > 0); printk(KERN_INFO "%s: Retry exceeded\n", dev->name); return (-1); }
static int tms380tr_reset_adapter(struct net_device *dev) { struct net_local *tp = netdev_priv(dev); unsigned short *fw_ptr; unsigned short count, c, count2; const struct firmware *fw_entry = NULL; if (request_firmware(&fw_entry, "tms380tr.bin", tp->pdev) != 0) { printk(KERN_ALERT "%s: firmware %s is missing, cannot start.\n", dev->name, "tms380tr.bin"); return (-1); } fw_ptr = (unsigned short *)fw_entry->data; count2 = fw_entry->size / 2; SIFWRITEW(ACL_ARESET, SIFACL); tms380tr_wait(40); c = SIFREADW(SIFACL); tms380tr_wait(20); if(dev->dma == 0) { c &= ~(ACL_NSELOUT0 | ACL_NSELOUT1); if(tp->setnselout) c |= (*tp->setnselout)(dev); } tp->ScbInUse = 0; c &= ~ACL_ARESET; c |= ACL_CPHALT; c |= ACL_BOOT; c |= ACL_SINTEN; c &= ~ACL_PSDMAEN; SIFWRITEW(c, SIFACL); tms380tr_wait(40); count = 0; do { if (count2 < 3) continue; SIFWRITEW(*fw_ptr, SIFADX); fw_ptr++; count2--; SIFWRITEW(*fw_ptr, SIFADD); fw_ptr++; count2--; if((count = *fw_ptr) != 0) { fw_ptr++; count2--; if (count > count2) continue; for(; count > 0; count--) { SIFWRITEW(*fw_ptr, SIFINC); fw_ptr++; count2--; } } else { c = SIFREADW(SIFACL); c &= (~ACL_CPHALT | ACL_SINTEN); SIFWRITEW(c, SIFACL); if (fw_entry) release_firmware(fw_entry); return (1); } } while(count == 0); if (fw_entry) release_firmware(fw_entry); printk(KERN_INFO "%s: Adapter Download Failed\n", dev->name); return (-1); }