Pavel Roskin wrote:
> Hello!
> 
> Sorry, another look at the assert issue in bcm43xx has taken some time.
> That's the complete kernel messages from the point where the driver is
> inserted to the first assertion failure.
--snip--
> bcm43xx: DMA-32 0x0200 (RX) max used slots: 1/64
> bcm43xx: DMA-32 0x02A0 (TX) max used slots: 0/512
> bcm43xx: ASSERTION FAILED (bcm43xx_status(bcm) ==
> BCM43xx_STAT_INITIALIZED)
> at: 
> /home/proski/src/linux-2.6/drivers/net/wireless/bcm43xx/bcm43xx_main.c:1861:bcm43xx_interrupt_handler()
> 
> I'm using the current mb tree plus the fixes to bring it up to date.
> It turns out that the Broadcom card shares interrupts with a large number of 
> devices:
> 
> # cat /proc/interrupts 
>            CPU0       
>   0:    1281260    XT-PIC-XT        timer
>   1:         10    XT-PIC-XT        i8042
>   2:          0    XT-PIC-XT        cascade
>   4:       4855    XT-PIC-XT        serial
>   8:          1    XT-PIC-XT        rtc
>   9:        332    XT-PIC-XT        acpi
>  11:     271806    XT-PIC-XT        yenta, yenta, uhci_hcd:usb1,
> uhci_hcd:usb2, uhci_hcd:usb3, eth9, [EMAIL PROTECTED]:0000:01:00.0, bcm43xx
>  12:       2337    XT-PIC-XT        i8042
>  14:      25257    XT-PIC-XT        ide0
>  15:      37722    XT-PIC-XT        ide1
> NMI:          0 
> ERR:          0

I think your analysis is correct. The reason I don't see these assertions is 
that my bcm43xx is
alone on IRQ 19, and no other device comes through this path. I don't remember 
the details on my old
computer, but I never saw these assertions. Probably, the interrupt was shared, 
but by less active
devices.

> It's not necessary to remove the module to trigger the assert messages.
> All it takes it to bring the interface (eth0 in my case) up and down.
> 
> Assertion failures always happen when bcm43xx_status(bcm) is
> BCM43xx_STAT_SHUTTINGDOWN.  Debugging shows that all of then are printed
> after bcm43xx_shutdown_all_wireless_cores() sets the status and all the
> way until free_irq() is called.  bcm43xx_interrupt_disable() has not
> effect.
> 
> I believe it happens because bcm43xx_interrupt_handler() checks status
> before it check whether the interrupt is even destined for us.  I think
> the wired ethernet (eth9) and the video card can generate quite a lot of
> interrupts.  Indeed, moving the assertion down eliminates all assertion
> failures.
> 
> It is possible that we still can get some assertion failures caused by
> the interrupts for the card after BCM43xx_STAT_SHUTTINGDOWN is set and
> before bcm43xx_interrupt_disable() is called.  It tried to reproduce it
> by bringing the interface down during flood ping.  I don't see assertion
> failures, but I don't see any reasons why they cannot happen (I hope I'm
> not seeing the obvious).

My observation is that they do not occur, but I have not done a thorough 
analysis.

> bcm43xx_d80211 is not affected because it doesn't have the
> BCM43xx_STAT_SHUTTINGDOWN state.  I think the bcm43xx driver could avoid
> it too if bcm43xx_shutdown_all_wireless_cores() ensured first that it's
> not interrupted by anything that could access the card hardware.
> 
> I'm surprised that bcm43xx_wireless_core_reset() has a reference to
> BCM43xx_STAT_SHUTTINGDOWN.  I just don't see how that function could be
> called in that state.
> 
> Here's my patch, and I'm even signing it off in case it actually turns
> out to be good.

I'm testing it now and will send it upstream unless someone objects.

Thanks for the effort in chasing this down.

Larry

_______________________________________________
Bcm43xx-dev mailing list
Bcm43xx-dev@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/bcm43xx-dev

Reply via email to