diff options
author | Linas Vepstas <linas@austin.ibm.com> | 2006-12-13 22:23:56 +0100 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-02-05 22:58:45 +0100 |
commit | 6d24998f07588ca83ce04e60af5a79e805df7532 (patch) | |
tree | c155b2a9e9924b2dfdfa169734b09ebb70af2734 /drivers/net/spider_net.c | |
parent | Spidernet Avoid possible RX chain corruption (diff) | |
download | linux-6d24998f07588ca83ce04e60af5a79e805df7532.tar.xz linux-6d24998f07588ca83ce04e60af5a79e805df7532.zip |
Spidernet RX Debugging printout
Add some debugging and error printing.
The show_rx_chain() prints out the status of the rx chain,
which shows that the status of the descriptors gets
messed up after the second & subsequent RX ramfulls.
Print out contents of bad packets if error occurs.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
Cc: James K Lewis <jklewis@us.ibm.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net/spider_net.c')
-rw-r--r-- | drivers/net/spider_net.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c index 2239c16da543..d73018b5cfc8 100644 --- a/drivers/net/spider_net.c +++ b/drivers/net/spider_net.c @@ -961,6 +961,34 @@ spider_net_pass_skb_up(struct spider_net_descr *descr, card->netdev_stats.rx_bytes += skb->len; } +#ifdef DEBUG +static void show_rx_chain(struct spider_net_card *card) +{ + struct spider_net_descr_chain *chain = &card->rx_chain; + struct spider_net_descr *start= chain->tail; + struct spider_net_descr *descr= start; + int status; + + int cnt = 0; + int cstat = spider_net_get_descr_status(descr); + printk(KERN_INFO "RX chain tail at descr=%ld\n", + (start - card->descr) - card->tx_chain.num_desc); + status = cstat; + do + { + status = spider_net_get_descr_status(descr); + if (cstat != status) { + printk(KERN_INFO "Have %d descrs with stat=x%08x\n", cnt, cstat); + cstat = status; + cnt = 0; + } + cnt ++; + descr = descr->next; + } while (descr != start); + printk(KERN_INFO "Last %d descrs with stat=x%08x\n", cnt, cstat); +} +#endif + /** * spider_net_decode_one_descr - processes an rx descriptor * @card: card structure @@ -1021,6 +1049,24 @@ spider_net_decode_one_descr(struct spider_net_card *card) goto bad_desc; } + if (descr->dmac_cmd_status & 0xfefe) { + pr_err("%s: bad status, cmd_status=x%08x\n", + card->netdev->name, + descr->dmac_cmd_status); + pr_err("buf_addr=x%08x\n", descr->buf_addr); + pr_err("buf_size=x%08x\n", descr->buf_size); + pr_err("next_descr_addr=x%08x\n", descr->next_descr_addr); + pr_err("result_size=x%08x\n", descr->result_size); + pr_err("valid_size=x%08x\n", descr->valid_size); + pr_err("data_status=x%08x\n", descr->data_status); + pr_err("data_error=x%08x\n", descr->data_error); + pr_err("bus_addr=x%08x\n", descr->bus_addr); + pr_err("which=%ld\n", descr - card->rx_chain.ring); + + card->spider_stats.rx_desc_error++; + goto bad_desc; + } + /* Ok, we've got a packet in descr */ spider_net_pass_skb_up(descr, card); descr->dmac_cmd_status = SPIDER_NET_DESCR_NOT_IN_USE; |