diff options
| author | Steve French <sfrench@us.ibm.com> | 2005-10-31 08:36:11 -0800 | 
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2005-10-31 08:36:11 -0800 | 
| commit | 53b2ec5518aa2623e8c0cb36f1c304a797988a46 (patch) | |
| tree | 465d8631ade6c2fcbd7576ff9813d00116c6a1e8 /drivers/net/ibm_emac/ibm_emac_debug.c | |
| parent | 0753ca7bc2b876dd136e9db11a20f85cbe4e08b1 (diff) | |
| parent | 581c1b14394aee60aff46ea67d05483261ed6527 (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Diffstat (limited to 'drivers/net/ibm_emac/ibm_emac_debug.c')
| -rw-r--r-- | drivers/net/ibm_emac/ibm_emac_debug.c | 363 | 
1 files changed, 176 insertions, 187 deletions
diff --git a/drivers/net/ibm_emac/ibm_emac_debug.c b/drivers/net/ibm_emac/ibm_emac_debug.c index c8512046cf8..75d3b863904 100644 --- a/drivers/net/ibm_emac/ibm_emac_debug.c +++ b/drivers/net/ibm_emac/ibm_emac_debug.c @@ -1,224 +1,213 @@  /* - * ibm_ocp_debug.c + * drivers/net/ibm_emac/ibm_emac_debug.c   * - * This has all the debug routines that where in *_enet.c + * Driver for PowerPC 4xx on-chip ethernet controller, debug print routines.   * - *      Armin Kuster akuster@mvista.com - *      April , 2002 - * - * Copyright 2002 MontaVista Softare Inc. + * Copyright (c) 2004, 2005 Zultys Technologies + * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>   *   * This program is free software; you can redistribute  it and/or modify it   * under  the terms of  the GNU General  Public License as published by the   * Free Software Foundation;  either version 2 of the  License, or (at your   * option) any later version. + *   */ -  #include <linux/config.h> +#include <linux/init.h> +#include <linux/module.h>  #include <linux/kernel.h>  #include <linux/netdevice.h> +#include <linux/sysrq.h>  #include <asm/io.h> -#include "ibm_ocp_mal.h" -#include "ibm_ocp_zmii.h" -#include "ibm_ocp_enet.h" -extern int emac_phy_read(struct net_device *dev, int mii_id, int reg); +#include "ibm_emac_core.h" + +static void emac_desc_dump(int idx, struct ocp_enet_private *p) +{ +	int i; +	printk("** EMAC%d TX BDs **\n" +	       " tx_cnt = %d tx_slot = %d ack_slot = %d\n", +	       idx, p->tx_cnt, p->tx_slot, p->ack_slot); +	for (i = 0; i < NUM_TX_BUFF / 2; ++i) +		printk +		    ("bd[%2d] 0x%08x %c 0x%04x %4u - bd[%2d] 0x%08x %c 0x%04x %4u\n", +		     i, p->tx_desc[i].data_ptr, p->tx_skb[i] ? 'V' : ' ', +		     p->tx_desc[i].ctrl, p->tx_desc[i].data_len, +		     NUM_TX_BUFF / 2 + i, +		     p->tx_desc[NUM_TX_BUFF / 2 + i].data_ptr, +		     p->tx_skb[NUM_TX_BUFF / 2 + i] ? 'V' : ' ', +		     p->tx_desc[NUM_TX_BUFF / 2 + i].ctrl, +		     p->tx_desc[NUM_TX_BUFF / 2 + i].data_len); + +	printk("** EMAC%d RX BDs **\n" +	       " rx_slot = %d rx_stopped = %d rx_skb_size = %d rx_sync_size = %d\n" +	       " rx_sg_skb = 0x%p\n", +	       idx, p->rx_slot, p->commac.rx_stopped, p->rx_skb_size, +	       p->rx_sync_size, p->rx_sg_skb); +	for (i = 0; i < NUM_RX_BUFF / 2; ++i) +		printk +		    ("bd[%2d] 0x%08x %c 0x%04x %4u - bd[%2d] 0x%08x %c 0x%04x %4u\n", +		     i, p->rx_desc[i].data_ptr, p->rx_skb[i] ? 'V' : ' ', +		     p->rx_desc[i].ctrl, p->rx_desc[i].data_len, +		     NUM_RX_BUFF / 2 + i, +		     p->rx_desc[NUM_RX_BUFF / 2 + i].data_ptr, +		     p->rx_skb[NUM_RX_BUFF / 2 + i] ? 'V' : ' ', +		     p->rx_desc[NUM_RX_BUFF / 2 + i].ctrl, +		     p->rx_desc[NUM_RX_BUFF / 2 + i].data_len); +} + +static void emac_mac_dump(int idx, struct ocp_enet_private *dev) +{ +	struct emac_regs *p = dev->emacp; + +	printk("** EMAC%d registers **\n" +	       "MR0 = 0x%08x MR1 = 0x%08x TMR0 = 0x%08x TMR1 = 0x%08x\n" +	       "RMR = 0x%08x ISR = 0x%08x ISER = 0x%08x\n" +	       "IAR = %04x%08x VTPID = 0x%04x VTCI = 0x%04x\n" +	       "IAHT: 0x%04x 0x%04x 0x%04x 0x%04x " +	       "GAHT: 0x%04x 0x%04x 0x%04x 0x%04x\n" +	       "LSA = %04x%08x IPGVR = 0x%04x\n" +	       "STACR = 0x%08x TRTR = 0x%08x RWMR = 0x%08x\n" +	       "OCTX = 0x%08x OCRX = 0x%08x IPCR = 0x%08x\n", +	       idx, in_be32(&p->mr0), in_be32(&p->mr1), +	       in_be32(&p->tmr0), in_be32(&p->tmr1), +	       in_be32(&p->rmr), in_be32(&p->isr), in_be32(&p->iser), +	       in_be32(&p->iahr), in_be32(&p->ialr), in_be32(&p->vtpid), +	       in_be32(&p->vtci), +	       in_be32(&p->iaht1), in_be32(&p->iaht2), in_be32(&p->iaht3), +	       in_be32(&p->iaht4), +	       in_be32(&p->gaht1), in_be32(&p->gaht2), in_be32(&p->gaht3), +	       in_be32(&p->gaht4), +	       in_be32(&p->lsah), in_be32(&p->lsal), in_be32(&p->ipgvr), +	       in_be32(&p->stacr), in_be32(&p->trtr), in_be32(&p->rwmr), +	       in_be32(&p->octx), in_be32(&p->ocrx), in_be32(&p->ipcr) +	    ); + +	emac_desc_dump(idx, dev); +} + +static void emac_mal_dump(struct ibm_ocp_mal *mal) +{ +	struct ocp_func_mal_data *maldata = mal->def->additions; +	int i; + +	printk("** MAL%d Registers **\n" +	       "CFG = 0x%08x ESR = 0x%08x IER = 0x%08x\n" +	       "TX|CASR = 0x%08x CARR = 0x%08x EOBISR = 0x%08x DEIR = 0x%08x\n" +	       "RX|CASR = 0x%08x CARR = 0x%08x EOBISR = 0x%08x DEIR = 0x%08x\n", +	       mal->def->index, +	       get_mal_dcrn(mal, MAL_CFG), get_mal_dcrn(mal, MAL_ESR), +	       get_mal_dcrn(mal, MAL_IER), +	       get_mal_dcrn(mal, MAL_TXCASR), get_mal_dcrn(mal, MAL_TXCARR), +	       get_mal_dcrn(mal, MAL_TXEOBISR), get_mal_dcrn(mal, MAL_TXDEIR), +	       get_mal_dcrn(mal, MAL_RXCASR), get_mal_dcrn(mal, MAL_RXCARR), +	       get_mal_dcrn(mal, MAL_RXEOBISR), get_mal_dcrn(mal, MAL_RXDEIR) +	    ); + +	printk("TX|"); +	for (i = 0; i < maldata->num_tx_chans; ++i) { +		if (i && !(i % 4)) +			printk("\n   "); +		printk("CTP%d = 0x%08x ", i, get_mal_dcrn(mal, MAL_TXCTPR(i))); +	} +	printk("\nRX|"); +	for (i = 0; i < maldata->num_rx_chans; ++i) { +		if (i && !(i % 4)) +			printk("\n   "); +		printk("CTP%d = 0x%08x ", i, get_mal_dcrn(mal, MAL_RXCTPR(i))); +	} +	printk("\n   "); +	for (i = 0; i < maldata->num_rx_chans; ++i) { +		u32 r = get_mal_dcrn(mal, MAL_RCBS(i)); +		if (i && !(i % 3)) +			printk("\n   "); +		printk("RCBS%d = 0x%08x (%d) ", i, r, r * 16); +	} +	printk("\n"); +} + +static struct ocp_enet_private *__emacs[4]; +static struct ibm_ocp_mal *__mals[1]; -void emac_phy_dump(struct net_device *dev) +void emac_dbg_register(int idx, struct ocp_enet_private *dev)  { -	struct ocp_enet_private *fep = dev->priv; -	unsigned long i; -	uint data; - -	printk(KERN_DEBUG " Prepare for Phy dump....\n"); -	for (i = 0; i < 0x1A; i++) { -		data = emac_phy_read(dev, fep->mii_phy_addr, i); -		printk(KERN_DEBUG "Phy reg 0x%lx ==> %4x\n", i, data); -		if (i == 0x07) -			i = 0x0f; +	unsigned long flags; + +	if (idx >= sizeof(__emacs) / sizeof(__emacs[0])) { +		printk(KERN_WARNING +		       "invalid index %d when registering EMAC for debugging\n", +		       idx); +		return;  	} + +	local_irq_save(flags); +	__emacs[idx] = dev; +	local_irq_restore(flags);  } -void emac_desc_dump(struct net_device *dev) +void mal_dbg_register(int idx, struct ibm_ocp_mal *mal)  { -	struct ocp_enet_private *fep = dev->priv; -	int curr_slot; - -	printk(KERN_DEBUG -	       "dumping the receive descriptors:  current slot is %d\n", -	       fep->rx_slot); -	for (curr_slot = 0; curr_slot < NUM_RX_BUFF; curr_slot++) { -		printk(KERN_DEBUG -		       "Desc %02d: status 0x%04x, length %3d, addr 0x%x\n", -		       curr_slot, fep->rx_desc[curr_slot].ctrl, -		       fep->rx_desc[curr_slot].data_len, -		       (unsigned int)fep->rx_desc[curr_slot].data_ptr); +	unsigned long flags; + +	if (idx >= sizeof(__mals) / sizeof(__mals[0])) { +		printk(KERN_WARNING +		       "invalid index %d when registering MAL for debugging\n", +		       idx); +		return;  	} + +	local_irq_save(flags); +	__mals[idx] = mal; +	local_irq_restore(flags);  } -void emac_mac_dump(struct net_device *dev) +void emac_dbg_dump_all(void)  { -	struct ocp_enet_private *fep = dev->priv; -	volatile emac_t *emacp = fep->emacp; - -	printk(KERN_DEBUG "EMAC DEBUG ********** \n"); -	printk(KERN_DEBUG "EMAC_M0  ==> 0x%x\n", in_be32(&emacp->em0mr0)); -	printk(KERN_DEBUG "EMAC_M1  ==> 0x%x\n", in_be32(&emacp->em0mr1)); -	printk(KERN_DEBUG "EMAC_TXM0==> 0x%x\n", in_be32(&emacp->em0tmr0)); -	printk(KERN_DEBUG "EMAC_TXM1==> 0x%x\n", in_be32(&emacp->em0tmr1)); -	printk(KERN_DEBUG "EMAC_RXM ==> 0x%x\n", in_be32(&emacp->em0rmr)); -	printk(KERN_DEBUG "EMAC_ISR ==> 0x%x\n", in_be32(&emacp->em0isr)); -	printk(KERN_DEBUG "EMAC_IER ==> 0x%x\n", in_be32(&emacp->em0iser)); -	printk(KERN_DEBUG "EMAC_IAH ==> 0x%x\n", in_be32(&emacp->em0iahr)); -	printk(KERN_DEBUG "EMAC_IAL ==> 0x%x\n", in_be32(&emacp->em0ialr)); -	printk(KERN_DEBUG "EMAC_VLAN_TPID_REG ==> 0x%x\n", -	       in_be32(&emacp->em0vtpid)); +	unsigned int i; +	unsigned long flags; + +	local_irq_save(flags); + +	for (i = 0; i < sizeof(__mals) / sizeof(__mals[0]); ++i) +		if (__mals[i]) +			emac_mal_dump(__mals[i]); + +	for (i = 0; i < sizeof(__emacs) / sizeof(__emacs[0]); ++i) +		if (__emacs[i]) +			emac_mac_dump(i, __emacs[i]); + +	local_irq_restore(flags);  } -void emac_mal_dump(struct net_device *dev) +#if defined(CONFIG_MAGIC_SYSRQ) +static void emac_sysrq_handler(int key, struct pt_regs *pt_regs, +			       struct tty_struct *tty)  { -	struct ibm_ocp_mal *mal = ((struct ocp_enet_private *)dev->priv)->mal; - -	printk(KERN_DEBUG " MAL DEBUG ********** \n"); -	printk(KERN_DEBUG " MCR      ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALCR)); -	printk(KERN_DEBUG " ESR      ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALESR)); -	printk(KERN_DEBUG " IER      ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALIER)); -#ifdef CONFIG_40x -	printk(KERN_DEBUG " DBR      ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALDBR)); -#endif				/* CONFIG_40x */ -	printk(KERN_DEBUG " TXCASR   ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCASR)); -	printk(KERN_DEBUG " TXCARR   ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCARR)); -	printk(KERN_DEBUG " TXEOBISR ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXEOBISR)); -	printk(KERN_DEBUG " TXDEIR   ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXDEIR)); -	printk(KERN_DEBUG " RXCASR   ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCASR)); -	printk(KERN_DEBUG " RXCARR   ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCARR)); -	printk(KERN_DEBUG " RXEOBISR ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRXEOBISR)); -	printk(KERN_DEBUG " RXDEIR   ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRXDEIR)); -	printk(KERN_DEBUG " TXCTP0R  ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP0R)); -	printk(KERN_DEBUG " TXCTP1R  ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP1R)); -	printk(KERN_DEBUG " TXCTP2R  ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP2R)); -	printk(KERN_DEBUG " TXCTP3R  ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALTXCTP3R)); -	printk(KERN_DEBUG " RXCTP0R  ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCTP0R)); -	printk(KERN_DEBUG " RXCTP1R  ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRXCTP1R)); -	printk(KERN_DEBUG " RCBS0    ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRCBS0)); -	printk(KERN_DEBUG " RCBS1    ==> 0x%x\n", -	       (unsigned int)get_mal_dcrn(mal, DCRN_MALRCBS1)); +	emac_dbg_dump_all();  } -void emac_serr_dump_0(struct net_device *dev) +static struct sysrq_key_op emac_sysrq_op = { +	.handler = emac_sysrq_handler, +	.help_msg = "emaC", +	.action_msg = "Show EMAC(s) status", +}; + +int __init emac_init_debug(void)  { -	struct ibm_ocp_mal *mal = ((struct ocp_enet_private *)dev->priv)->mal; -	unsigned long int mal_error, plb_error, plb_addr; - -	mal_error = get_mal_dcrn(mal, DCRN_MALESR); -	printk(KERN_DEBUG "ppc405_eth_serr: %s channel %ld \n", -	       (mal_error & 0x40000000) ? "Receive" : -	       "Transmit", (mal_error & 0x3e000000) >> 25); -	printk(KERN_DEBUG "  -----  latched error  -----\n"); -	if (mal_error & MALESR_DE) -		printk(KERN_DEBUG "  DE: descriptor error\n"); -	if (mal_error & MALESR_OEN) -		printk(KERN_DEBUG "  ONE: OPB non-fullword error\n"); -	if (mal_error & MALESR_OTE) -		printk(KERN_DEBUG "  OTE: OPB timeout error\n"); -	if (mal_error & MALESR_OSE) -		printk(KERN_DEBUG "  OSE: OPB slave error\n"); - -	if (mal_error & MALESR_PEIN) { -		plb_error = mfdcr(DCRN_PLB0_BESR); -		printk(KERN_DEBUG -		       "  PEIN: PLB error, PLB0_BESR is 0x%x\n", -		       (unsigned int)plb_error); -		plb_addr = mfdcr(DCRN_PLB0_BEAR); -		printk(KERN_DEBUG -		       "  PEIN: PLB error, PLB0_BEAR is 0x%x\n", -		       (unsigned int)plb_addr); -	} +	return register_sysrq_key('c', &emac_sysrq_op);  } -void emac_serr_dump_1(struct net_device *dev) +void __exit emac_fini_debug(void)  { -	struct ibm_ocp_mal *mal = ((struct ocp_enet_private *)dev->priv)->mal; -	int mal_error = get_mal_dcrn(mal, DCRN_MALESR); - -	printk(KERN_DEBUG "  -----  cumulative errors  -----\n"); -	if (mal_error & MALESR_DEI) -		printk(KERN_DEBUG "  DEI: descriptor error interrupt\n"); -	if (mal_error & MALESR_ONEI) -		printk(KERN_DEBUG "  OPB non-fullword error interrupt\n"); -	if (mal_error & MALESR_OTEI) -		printk(KERN_DEBUG "  OTEI: timeout error interrupt\n"); -	if (mal_error & MALESR_OSEI) -		printk(KERN_DEBUG "  OSEI: slave error interrupt\n"); -	if (mal_error & MALESR_PBEI) -		printk(KERN_DEBUG "  PBEI: PLB bus error interrupt\n"); +	unregister_sysrq_key('c', &emac_sysrq_op);  } -void emac_err_dump(struct net_device *dev, int em0isr) +#else +int __init emac_init_debug(void) +{ +	return 0; +} +void __exit emac_fini_debug(void)  { -	printk(KERN_DEBUG "%s: on-chip ethernet error:\n", dev->name); - -	if (em0isr & EMAC_ISR_OVR) -		printk(KERN_DEBUG "  OVR: overrun\n"); -	if (em0isr & EMAC_ISR_PP) -		printk(KERN_DEBUG "  PP: control pause packet\n"); -	if (em0isr & EMAC_ISR_BP) -		printk(KERN_DEBUG "  BP: packet error\n"); -	if (em0isr & EMAC_ISR_RP) -		printk(KERN_DEBUG "  RP: runt packet\n"); -	if (em0isr & EMAC_ISR_SE) -		printk(KERN_DEBUG "  SE: short event\n"); -	if (em0isr & EMAC_ISR_ALE) -		printk(KERN_DEBUG "  ALE: odd number of nibbles in packet\n"); -	if (em0isr & EMAC_ISR_BFCS) -		printk(KERN_DEBUG "  BFCS: bad FCS\n"); -	if (em0isr & EMAC_ISR_PTLE) -		printk(KERN_DEBUG "  PTLE: oversized packet\n"); -	if (em0isr & EMAC_ISR_ORE) -		printk(KERN_DEBUG -		       "  ORE: packet length field > max allowed LLC\n"); -	if (em0isr & EMAC_ISR_IRE) -		printk(KERN_DEBUG "  IRE: In Range error\n"); -	if (em0isr & EMAC_ISR_DBDM) -		printk(KERN_DEBUG "  DBDM: xmit error or SQE\n"); -	if (em0isr & EMAC_ISR_DB0) -		printk(KERN_DEBUG "  DB0: xmit error or SQE on TX channel 0\n"); -	if (em0isr & EMAC_ISR_SE0) -		printk(KERN_DEBUG -		       "  SE0: Signal Quality Error test failure from TX channel 0\n"); -	if (em0isr & EMAC_ISR_TE0) -		printk(KERN_DEBUG "  TE0: xmit channel 0 aborted\n"); -	if (em0isr & EMAC_ISR_DB1) -		printk(KERN_DEBUG "  DB1: xmit error or SQE on TX channel \n"); -	if (em0isr & EMAC_ISR_SE1) -		printk(KERN_DEBUG -		       "  SE1: Signal Quality Error test failure from TX channel 1\n"); -	if (em0isr & EMAC_ISR_TE1) -		printk(KERN_DEBUG "  TE1: xmit channel 1 aborted\n"); -	if (em0isr & EMAC_ISR_MOS) -		printk(KERN_DEBUG "  MOS\n"); -	if (em0isr & EMAC_ISR_MOF) -		printk(KERN_DEBUG "  MOF\n"); - -	emac_mac_dump(dev); -	emac_mal_dump(dev);  } +#endif				/* CONFIG_MAGIC_SYSRQ */  | 
