Search Linux Wireless

Re: ipw2200 stalls on high load

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2008-02-05 at 09:35 +0100, Sebastian Siewior wrote:
> * Dan Williams | 2008-02-04 18:24:10 [-0500]:
> 
> >Could you put some debugging information into ipw_rx() to print out the
> >values of r and i right before the while (i != r) loop, and inside the
> >if (fill_rx) block later down what count and i are?
> Sure:
> 
> [ 1849.374846] Before while 0x0000001c != 0x0000001d
> [ 1849.378151] Before while 0x0000001d != 0x0000001e
> [ 1849.378970] Before while 0x0000001e != 0x0000001f
> [ 1849.381220] Before while 0x0000001f != 0x00000000
> [ 1849.383092] Before while 0x00000000 != 0x00000001
> [ 1849.385513] Before while 0x00000001 != 0x00000002
> [ 1849.387636] Before while 0x00000002 != 0x00000003
> [ 1849.389580] Before while 0x00000003 != 0x00000004
> [ 1849.391561] Before while 0x00000004 != 0x00000005
> [ 1849.393720] Before while 0x00000005 != 0x00000006
> [ 1849.395799] Before while 0x00000006 != 0x00000007
> [ 1849.397941] Before while 0x00000007 != 0x00000008
> [ 1849.399885] Before while 0x00000008 != 0x00000009
> [ 1849.402127] Before while 0x00000009 != 0x0000000a
> [ 1849.405144] Before while 0x0000000a != 0x0000000b
> [ 1849.406376] Before while 0x0000000b != 0x0000000c
> [ 1849.409953] Before while 0x0000000c != 0x0000000d
> [ 1849.410070] fill_rx block, count: 0x00000000 i: 0x0000000d
> [ 1849.410492] Before while 0x0000000d != 0x0000000e
> [ 1849.410610] fill_rx block, count: 0x00000000 i: 0x0000000e
> [ 1849.412598] Before while 0x0000000e != 0x0000000f
> [ 1849.412716] fill_rx block, count: 0x00000000 i: 0x0000000f
> [ 1849.414930] Before while 0x0000000f != 0x00000010
> [ 1849.415048] fill_rx block, count: 0x00000000 i: 0x00000010
> [ 1849.417127] Before while 0x00000010 != 0x00000011
> [ 1849.417244] fill_rx block, count: 0x00000000 i: 0x00000011
> [ 1849.419324] Before while 0x00000011 != 0x00000012
> [ 1849.419441] fill_rx block, count: 0x00000000 i: 0x00000012
> [ 1849.421367] Before while 0x00000012 != 0x00000013
> [ 1849.421486] fill_rx block, count: 0x00000000 i: 0x00000013
> [ 1849.423275] Before while 0x00000013 != 0x00000014
> [ 1849.423392] fill_rx block, count: 0x00000000 i: 0x00000014
> [ 1849.425472] Before while 0x00000014 != 0x00000015
> [ 1849.425591] fill_rx block, count: 0x00000000 i: 0x00000015
> [ 1849.427461] Before while 0x00000015 != 0x00000016
> [ 1849.427579] fill_rx block, count: 0x00000000 i: 0x00000016
> [ 1849.429440] Before while 0x00000016 != 0x00000017
> [ 1849.429557] fill_rx block, count: 0x00000000 i: 0x00000017
> [ 1849.431618] Before while 0x00000017 != 0x00000018
> [ 1849.431736] fill_rx block, count: 0x00000000 i: 0x00000018
> [ 1849.434472] Before while 0x00000018 != 0x00000019
> [ 1849.434590] fill_rx block, count: 0x00000000 i: 0x00000019
> [  854.288510] ipw2200: Firmware error detected.  Restarting.
> [ 1109.987456] Before while 0x00000000 != 0x00000001
> [  854.530339] Before while 0x00000001 != 0x00000002
> [  854.566437] Before while 0x00000002 != 0x00000003
> [  854.596029] Before while 0x00000003 != 0x00000004
> [  854.620725] Before while 0x00000004 != 0x00000005
> [  854.621141] Before while 0x00000005 != 0x00000006
> [  854.621189] Before while 0x00000006 != 0x00000007
> [  854.633339] Before while 0x00000007 != 0x00000008
> [  854.634229] Before while 0x00000008 != 0x00000009
> [  854.639772] Before while 0x00000009 != 0x0000000a
> [  854.639812] Before while 0x0000000a != 0x0000000b
> [  854.674365] Before while 0x0000000b != 0x0000000c
> [  854.697891] Before while 0x0000000c != 0x0000000d
> [  854.721436] Before while 0x0000000d != 0x0000000e
> [  854.744974] Before while 0x0000000e != 0x0000000f
> [  854.768516] Before while 0x0000000f != 0x00000010
> [  854.792058] Before while 0x00000010 != 0x00000011
> [  854.816046] Before while 0x00000011 != 0x00000012
> [  854.816127] Before while 0x00000012 != 0x00000013
> [  854.816172] Before while 0x00000013 != 0x00000014
> [  854.816688] Before while 0x00000014 != 0x00000015
> [  854.857375] Before while 0x00000015 != 0x00000016
> [  855.047194] Before while 0x00000016 != 0x00000017
> [  855.048013] Before while 0x00000017 != 0x00000018
> 
> I'm not sure why the timestamps aren't incrementing.

This seems to indicate that on your machine ipw_rx() is only ever called
for one packet, i.e. the firmware never seems to write more than one
packet into the ring buffer for the host to read, or maybe the host is
fast enough that it can process each interrupt.

That would mean that count never gets above 8, and that the RX queue is
never restocked.  The (count >= 8) part might be specific to the
3945/4965 drivers, since they apparently restock the RX queue in blocks
of 8.  Can you try to change the:

if (count >= 8)

to

if (count)

and see what that does for you?  Also, can you log the value of
"ipw_rx_queue_space (priv->rxq)" on the same line as your "fill_rx
block" printk?

Thanks!
Dan

> >Also, what's the procedure to reproduce this again?  I couldn't get that
> >bit to trigger but I wasn't really sure what to do to stress the 2200
> >that far, otherwise I could have tested the patch more before posting.
> 
> I did not get this when do something like:
> | ssh box 'cat /dev/zero' >  /dev/null
> 
> but it works fine with a firefox download from the same machine. It was
> triggered after a download of 22.9 MiB at rate of about 664 KiB (this is
> what the download window says).
> 
> >Thanks,
> >Dan
> 
> Sebastian

-
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux