Messages in this thread Patch in this message | | | From | Neil Brown <> | Date | Mon, 10 Apr 2006 08:28:07 +1000 | Subject | Re: How to correct ELCR? - was Re: [PATCH 2.6.16] Shared interrupts sometimes lost |
| |
On Sunday April 9, romieu@fr.zoreil.com wrote: > Neil Brown <neilb@suse.de> : > [...] > > Can you send an url for the exact rt2500 sources that you are > actually using ? > > Just curious :o)
http://rt2x00.serialmonkey.com/rt2500-cvs-daily.tar.gz
(though that may change from day to day... I just checked, and *now* it is the same as what I started with)
plus a bunch of printks, which I attach for your amusement :-)
NeilBrown
Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .assoc.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .auth.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .auth_rsp.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .connect.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .eeprom.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .md5.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .mlme.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rt2500.ko.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rt2500.mod.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rt2500.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rtmp_data.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rtmp_info.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rtmp_init.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rtmp_main.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rtmp_tkip.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .rtmp_wep.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .sanity.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .sync.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .tmp_versions Only in /root/rt-latest/rt2500-cvs-2006040703/Module: .wpa.o.cmd Only in /root/rt-latest/rt2500-cvs-2006040703/Module: assoc.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: auth.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: auth_rsp.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: connect.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: eeprom.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: md5.o diff -ur rt2500-cvs-2006040703/Module/mlme.c /root/rt-latest/rt2500-cvs-2006040703/Module/mlme.c --- rt2500-cvs-2006040703/Module/mlme.c 2006-04-05 13:52:43.000000000 +1000 +++ /root/rt-latest/rt2500-cvs-2006040703/Module/mlme.c 2006-04-07 21:54:14.000000000 +1000 @@ -350,12 +350,19 @@ This task guarantee only one MlmeHandler will run. ========================================================================== */ +extern void dump_prio(PRTMP_ADAPTER A); VOID MlmeHandler( IN PRTMP_ADAPTER pAd) { MLME_QUEUE_ELEM *Elem = NULL; unsigned long flags; - + int loops=0; + { int static done = 0; + if (!done) { + done = 1; + dump_prio(pAd); + } + } // Only accept MLME and Frame from peer side, no other (control/data) frame should // get into this state machine @@ -411,6 +418,14 @@ { printk(KERN_ERR DRV_NAME "ERROR: empty Elem in MlmeQueue\n"); } + loops++; + if (loops > 10) { + static int done = 0; + if (done) break; + done=1; + dump_prio(pAd); + printk("BREAK\n"); break; + } } spin_lock_irqsave(&pAd->Mlme.TaskLock,flags); Only in /root/rt-latest/rt2500-cvs-2006040703/Module: mlme.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rt2500.ko Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rt2500.mod.c Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rt2500.mod.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rt2500.o diff -ur rt2500-cvs-2006040703/Module/rt2560.h /root/rt-latest/rt2500-cvs-2006040703/Module/rt2560.h --- rt2500-cvs-2006040703/Module/rt2560.h 2005-10-06 12:53:08.000000000 +1000 +++ /root/rt-latest/rt2500-cvs-2006040703/Module/rt2560.h 2006-04-07 23:42:18.000000000 +1000 @@ -517,6 +517,15 @@ ULONG TwakeExpire:1; // Wakeup timer expired interrupt ULONG TbcnExpire:1; // Beacon timer expired interrupt #else +/* 0x169 + TbcnExpire + TxRingTxDone + PrioRingTxDone + RxDone + ExcryptionDone + fe14 + 1eb +*/ ULONG TbcnExpire:1; // Beacon timer expired interrupt ULONG TwakeExpire:1; // Wakeup timer expired interrupt ULONG TatimwExpire:1; // Timer of atim window expired interrupt Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rt2560.h.~1.4.~ diff -ur rt2500-cvs-2006040703/Module/rtmp_data.c /root/rt-latest/rt2500-cvs-2006040703/Module/rtmp_data.c --- rt2500-cvs-2006040703/Module/rtmp_data.c 2005-11-25 22:30:47.000000000 +1100 +++ /root/rt-latest/rt2500-cvs-2006040703/Module/rtmp_data.c 2006-04-08 11:10:21.000000000 +1000 @@ -905,6 +905,25 @@ } } +void dump_prio(PRTMP_ADAPTER A) +{ + int i; + u32 u; + PTXD_STRUC T; + printk("Prio: Index=%d Done=%d\n", A->CurPrioIndex, A->NextPrioDoneIndex); + for (i=0; i<PRIO_RING_SIZE; i++) { + T=(PTXD_STRUC)(A->PrioRing[i].va_addr); + printk("%3d: size=%d FT=%d own=%d vld=%d, rty=%d\n", + i, A->PrioRing[i].size, A->PrioRing[i].FrameType, + T->Owner, T->Valid, T->RetryCount); + } + printk("\n"); + RTMP_IO_READ32(A, CSR7, &u); + printk("CSR7 is 0x%x\n", u); + RTMP_IO_READ32(A, CSR8, &u); + printk("CSR8 is 0x%x\n", u); +} + /* ======================================================================== @@ -947,10 +966,11 @@ pTxD = &TxD; RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); #endif - + //printk("PrioDone for %d\n", pAdapter->NextPrioDoneIndex); // Check for the descriptor ownership if ((pTxD->Owner == DESC_OWN_NIC) || (pTxD->Valid == FALSE)) { + //printk("..no\n"); #ifdef BIG_ENDIAN RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); *pDestTxD = TxD; @@ -2120,13 +2140,14 @@ pTxD = &TxD; RTMPDescriptorEndianChange((PUCHAR)pTxD, TYPE_TXD); #endif - + printk("Queuing prio for %d\n", pAdapter->CurPrioIndex); if (pTxD->Owner == DESC_OWN_NIC) { // Descriptor owned by NIC. No descriptor avaliable // This should not happen since caller guaranteed. // Make sure to release Prio ring resource spin_unlock_irqrestore(&pAdapter->PrioRingLock, irqflag); + printk("...not mine\n"); return; } if (pTxD->Valid == TRUE) @@ -2135,6 +2156,7 @@ // This should not happen since caller guaranteed. // Make sure to release Prio ring resource spin_unlock_irqrestore(&pAdapter->PrioRingLock, irqflag); + printk("...still valid\n"); return; } if (pBuffer == NULL) Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_data.c.~1.35.~ Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_data.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_info.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_init.c.~1.27.~ Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_init.o diff -ur rt2500-cvs-2006040703/Module/rtmp_main.c /root/rt-latest/rt2500-cvs-2006040703/Module/rtmp_main.c --- rt2500-cvs-2006040703/Module/rtmp_main.c 2006-02-25 20:45:51.000000000 +1100 +++ /root/rt-latest/rt2500-cvs-2006040703/Module/rtmp_main.c 2006-04-08 11:09:41.000000000 +1000 @@ -194,7 +194,7 @@ // register_netdev() will call dev_alloc_name() for us // TODO: Remove the following line to keep the default eth%d name if (ifname == NULL) - strcpy(net_dev->name, "ra%d"); + strcpy(net_dev->name, "eth%d"); else strncpy(net_dev->name, ifname, IFNAMSIZ); @@ -456,7 +456,7 @@ int ret = 0; DBGPRINT(RT_DEBUG_INFO, "====> RTMPHandleInterrupt\n"); - + again: // 1. Disable interrupt if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_IN_USE) && RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_INTERRUPT_ACTIVE)) { @@ -523,6 +523,7 @@ if (IntSource.field.PrioRingTxDone) { DBGPRINT(RT_DEBUG_INFO, "====> RTMPHandlePrioRingTxDoneInterrupt\n"); + printk("Word = %d\n", IntSource.word); RTMPHandlePrioRingTxDoneInterrupt(pAdapter); ret = 1; } @@ -546,6 +547,7 @@ if (RTMP_TEST_FLAG(pAdapter, fRTMP_ADAPTER_RESET_IN_PROGRESS)) { ret = 1; + printk("Don't enable interrupt\n"); goto out; } @@ -554,12 +556,19 @@ // NICEnableInterrupt(pAdapter); + RTMP_IO_READ32(pAdapter, CSR7, &IntSource.word); + if (IntSource.word & ~0xFE14) { + /*printk("word now %x\n", IntSource.word); */ + // goto again; + } DBGPRINT(RT_DEBUG_INFO, "<==== RTMPHandleInterrupt\n"); out: if(ret) return IRQ_RETVAL(IRQ_HANDLED); - else + else { +// printk("Nothing handled: %x\n", IntSource.word); return IRQ_RETVAL(IRQ_NONE); + } } int rt2500_set_mac_address(struct net_device *net_dev, void *addr) Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_main.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_tkip.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: rtmp_wep.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: sanity.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: sync.o Only in /root/rt-latest/rt2500-cvs-2006040703/Module: wpa.o - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |