From: Richard B. <rb...@us...> - 2002-05-30 23:26:51
|
Update of /cvsroot/linux-vax/kernel-2.4/drivers/net In directory usw-pr-cvs1:/tmp/cvs-serv13142 Modified Files: vaxsgec.c Log Message: Add extra debug output, extra reset of csr0 and moved setup_csr6 Index: vaxsgec.c =================================================================== RCS file: /cvsroot/linux-vax/kernel-2.4/drivers/net/vaxsgec.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- vaxsgec.c 30 May 2002 01:20:24 -0000 1.10 +++ vaxsgec.c 30 May 2002 23:26:46 -0000 1.11 @@ -30,7 +30,7 @@ /* use #undef to turn these off */ #define VAX_SGEC_DEBUG -#undef VAX_SGEC_DEBUG_LVL2 +#define VAX_SGEC_DEBUG_LVL2 #define VAX_SGEC_DEBUG_BUFFERS #define VAX_SGEC_AUTOPROBE_IRQ @@ -130,10 +130,18 @@ static void kick_sgec(volatile struct sgec_private * lp) { volatile struct sgec_regs *regs = lp->regs; +#ifdef VAX_SGEC_DEBUG + printk("Kick sgec: Current CSR5 value 0x%x\n",regs->sg_nicsr5); + printk("Kick sgec: csr0 value 0x%x\n",regs->sg_nicsr0); +#endif + if ((regs->sg_nicsr5 & SG_NICSR5_TS) != SG_NICSR5_TS_RUN) { - writereg(®s->sg_nicsr4, virt_to_phys(& lp->tx_ring [lp->tx_old]) & 0xffffff); +#ifdef VAX_SGEC_DEBUG + printk("writing to csr4: lp->tx_old = %d\n",lp->tx_old); +#endif + writereg(®s->sg_nicsr4,virt_to_phys(& lp->tx_ring [lp->tx_old])); writereg(®s->sg_nicsr1,SG_NICSR1_TXPD); #ifdef VAX_SGEC_DEBUG printk ("%s: retrigger CSR1 (CSR5 is %ld)\n", @@ -182,13 +190,12 @@ } #ifdef VAX_SGEC_DEBUG - printk("SGEC restarted\n"); + printk("writing csr0 interrupt as 0x%x\n",dev->irq); #endif /* * IRQ setup */ - v = SG_NICSR0_IPL14 | - (dev->irq & SG_NICSR0_IV_MASK) | SG_NICSR0_MBO; + v = SG_NICSR0_IPL14 | dev->irq | SG_NICSR0_MBO; i = 10; do { @@ -200,18 +207,23 @@ } writereg (& regs->sg_nicsr0, v); } while (v != regs->sg_nicsr0); - if (i == 0) + if (i <= 0) { printk ("SGEC: CSR0 IRQ setup FAILED !\n"); return -1; } - writereg(®s->sg_nicsr3, - virt_to_phys(& lp->rx_ring [0]) & 0xffffff); - writereg(®s->sg_nicsr4, - virt_to_phys(& lp->tx_ring [0]) & 0xffffff); + /* check for error and clear flags */ + if (regs->sg_nicsr5 & 0x7f) { + printk("init - csr5 value 0x%x\n",regs->sg_nicsr5); + writereg(®s->sg_nicsr5,regs->sg_nicsr5 & 0x7e); + } + + writereg(®s->sg_nicsr3, virt_to_phys(& lp->rx_ring [0])); + writereg(®s->sg_nicsr4, virt_to_phys(& lp->tx_ring [0])); #ifdef VAX_SGEC_DEBUG + printk ("csr0 interrupt is 0x%x\n",regs->sg_nicsr0 & SG_NICSR0_IV_MASK); printk ("%s: done well\n", __FUNCTION__); #endif @@ -226,11 +238,16 @@ #ifdef VAX_SGEC_DEBUG printk ("%s: entry\n", __FUNCTION__); + printk ("csr0 = 0x%x\n",lp->regs->sg_nicsr0); #endif /* for changes of the SG_NICSR6_AF_xxx stop RX */ writecsr6(regs, regs->sg_nicsr6 & ~SG_NICSR6_SR); udelay (20); +#ifdef VAX_SGEC_DEBUG + printk("after csr6 stop receiving\n"); + printk ("csr0 = 0x%x\n",lp->regs->sg_nicsr0); +#endif /* generate fix CSR6 part */ csr6 = SG_NICSR6_MBO | SG_NICSR6_IE | SG_NICSR6_BL_8 | SG_NICSR6_ST | SG_NICSR6_SR | SG_NICSR6_DC; @@ -239,9 +256,17 @@ if (dev->flags & IFF_PROMISC) csr6 |= SG_NICSR6_AF_PROM; +#ifdef VAX_SGEC_DEBUG + printk("now writing csr6\n"); + printk ("csr0 = 0x%x\n",lp->regs->sg_nicsr0); +#endif /* update CSR6 */ writecsr6(regs, csr6); +#ifdef VAX_SGEC_DEBUG + printk ("csr0 = 0x%x\n",lp->regs->sg_nicsr0); +#endif + return 0; } @@ -254,6 +279,7 @@ #ifdef VAX_SGEC_DEBUG printk ("\n\n< SETUP >\n%s: entry\n", __FUNCTION__); + printk ("csr0 = 0x%x\n",lp->regs->sg_nicsr0); #endif spin_lock_irqsave (&lp->lock, flags); @@ -267,7 +293,7 @@ return 1; } - /* create setup buffer */ + /* create setup frame - using perfect filtering */ memset (buf_setup, 0xffu, sizeof (buf_setup)); memcpy (buf_setup, dev->dev_addr, 6); @@ -278,7 +304,7 @@ cp_to_buf ((char *) lp->card_mem->tx_buf[entry], buf_setup, sizeof (buf_setup)); lp->tx_ring[entry].bufsize = sizeof (buf_setup); - lp->tx_ring[entry].flags1 = SG_TD1_DT_SETUP /* | SG_TD1_IC */; + lp->tx_ring[entry].flags1 = SG_TD1_DT_SETUP /*| SG_TD1_IC*/; #ifdef VAX_SGEC_DEBUG_BUFFERS { @@ -315,12 +341,19 @@ /* Now pass frame to transmitter */ lp->tx_ring[entry].tx_err = SG_TDR_OWN; + setup_csr6(dev); /* Kick the SGEC: transmit now */ + kick_sgec (lp); - + spin_unlock_irqrestore (&lp->lock, flags); dev->trans_start = jiffies; + +#ifdef VAX_SGEC_DEBUG + printk("leaving setup_sgec\n"); +#endif + return 0; } @@ -391,14 +424,14 @@ len); skb->protocol = eth_type_trans(skb,dev); #ifdef VAX_SGEC_DEBUG_LVL2 - printk (" passing up to linux\n", __FUNCTION__); + printk ("%s passing up to linux\n", __FUNCTION__); #endif netif_rx(skb); dev->last_rx=jiffies; lp->stats.rx_packets++; } #ifdef VAX_SGEC_DEBUG_LVL2 - printk (" freeing rx frame\n", __FUNCTION__); + printk ("%s freeing rx frame\n", __FUNCTION__); #endif rd->framelen = SG_FR_OWN; lp->rx_new = (lp->rx_new + 1) & RX_RING_MASK; @@ -583,7 +616,7 @@ status = reset_sgec (dev); - setup_csr6 (dev); + // setup_csr6 (dev); //csr6 should be setup after setup packet loaded setup_sgec (dev); /* put packet in queue */ @@ -634,7 +667,7 @@ sgec_init_ring(dev); reset_sgec (dev); - setup_csr6 (dev); + //setup_csr6 (dev); setup_sgec (dev); @@ -796,8 +829,9 @@ */ #endif + // sgec_load_multicast(dev); /* no reset csr6 with the new flag dependent stuff ! */ - setup_csr6 (dev); + // setup_csr6 (dev); setup_sgec (dev); netif_wake_queue(dev); @@ -834,8 +868,9 @@ static unsigned version_printed = 0; struct sgec_private *lp; volatile struct sgec_regs *regs; - int ret; unsigned long sgec_phys_addr=SGECADDR; + unsigned long v; + int i; if (version_printed++ == 0) printk(version); @@ -899,7 +934,7 @@ dev->dev_addr[0],dev->dev_addr[1],dev->dev_addr[2], dev->dev_addr[3],dev->dev_addr[4],dev->dev_addr[5]); - sgec_stop(regs); + // sgec_stop(regs); dev->irq = 0; @@ -917,7 +952,7 @@ vsbus_probe_irq_on(); #endif /* CONFIG_VSBUS */ #endif /* VAX_SGEC_AUTOPROBE_IRQ */ - + /* should do something here to cause an interrupt */ #ifdef VAX_SGEC_AUTOPROBE_IRQ @@ -942,6 +977,36 @@ } #endif /* VAX_SGEC_AUTOPROBE_IRQ */ +#ifdef VAX_SGEC_DEBUG + printk("writing csr0 interrupt as 0x%x\n",dev->irq); +#endif + /* + * IRQ setup + */ + v = SG_NICSR0_IPL14 | dev->irq | SG_NICSR0_MBO; + i = 10; + do + { + if (i-- == 0) + { + printk ("Failing setting CSR0 (0x%08lx)!\n", + regs->sg_nicsr0); + /* further ignore error here XXX CP */ + } + writereg (& regs->sg_nicsr0, v); + } while (v != regs->sg_nicsr0); + if (i <= 0) + { + printk ("SGEC: CSR0 IRQ setup FAILED !\n"); + return -1; + } + + /* check for error and clear flags */ + if (regs->sg_nicsr5 & 0x7f) { + printk("init - csr5 value 0x%x\n",regs->sg_nicsr5); + writereg(®s->sg_nicsr5,regs->sg_nicsr5 & 0x7e); + } + ether_setup(dev); #ifdef MODULE @@ -955,10 +1020,6 @@ return 0; -err_out: - unregister_netdev(dev); - kfree(dev); - return ret; } |