Current-Users archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: if_iwn.c patch to support the 5100... (analysis + patch)
On Tue September 15 2009 08:24:21 Patrick Welche wrote:
> On Fri, Aug 28, 2009 at 02:52:56PM -0400, Christos Zoulas wrote:
> > On Aug 28, 7:08pm, prlw1%cam.ac.uk@localhost (Patrick Welche) wrote:
> > -- Subject: Re: if_iwn.c patch to support the 5100...
> >
> > | > then built kernel with PCI_INTR_FIXUP PCI_BUS_FIXUP PCI_ADDR_FIXUP
> >
> > Looks like your laptop is really weird...
>
> It does doesn't it... though all those timing errors have disappeared with
> a newer kernel. I just tried with the in-tree iwn as opposed to the
> patch, and the interface is found successfully.
>
> iwn0 at pci1 dev 0 function 0: Intel Pro/Wireless LAN 5100AGN Mini-PCI
> Adapter (rev. 0x 0) iwn0: interrupting at ioapic0 pin 16
> , MIMO 1T2R, MoW, address 00:22:fa:65:8c:f8
> iwn0: 11a rates: 6Mbps 9Mbps 12Mbps 18Mbps 24Mbps 36Mbps 48Mbps 54Mbps
> iwn0: 11b rates: 1Mbps 2Mbps 5.5Mbps 11Mbps
> iwn0: 11g rates: 1Mbps 2Mbps 5.5Mbps 11Mbps 6Mbps 9Mbps 12Mbps 18Mbps
> 24Mbps 36Mbps 48Mbps 54Mbps
>
> (yes, MIMO is on a separate line)
>
> I can't use it though:
>
> ifconfig iwn0 up
>
> iwn0: timeout waiting for adapter to initialize 35
> iwn0: could not initialize hardware
> iwn0: cannot assign link-local address
> iwn0: timeout waiting for adapter to initialize 35
It looks like these errors may be because iwn_init is called a second time
before the first call has completed. It is called via the "if_init" pointer
and also through iwn_ioctl. The call via the ioctl path only happens if the
IFF_UP is set. I notice that, e.g., net/if_ethersubr.c sets this flag before
the call to if_init. While this seems counterintuitive to me it is appears to
be the way it's always worked. The simplest fix is to remove the call to
iwn_init from iwn_ioctl:
Index: src/sys/dev/pci/if_iwn.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/if_iwn.c,v
retrieving revision 1.33
diff -u -p -r1.33 if_iwn.c
--- src/sys/dev/pci/if_iwn.c 11 Sep 2009 01:28:20 -0000 1.33
+++ src/sys/dev/pci/if_iwn.c 17 Sep 2009 15:19:54 -0000
@@ -3213,7 +3213,9 @@ ewhere in driver */
if (ifp->if_flags & IFF_RUNNING)
iwn_stop(ifp, 1);
} else if (!(ifp->if_flags & IFF_RUNNING))
- error = iwn_init(ifp);
+ aprint_error_dev(sc->sc_dev,
+ "iwn_init call from iwn_ioctl skipped\n");
+ /* error = iwn_init(ifp); */
} else {
if (ifp->if_flags & IFF_RUNNING)
iwn_stop(ifp, 1);
A likely side effect is failure to restart the adaptor later. I better fix
may be to implement additional driver-internal flags.
> Mutex error: lockdebug_barrier: spin lock held
> ...
> panic: LOCKDEBUG
I was seeing various panics that I believe are related to attempting a second
firmware load (because of the sencond call to iwn_init). I have seen:
mutex_enter
ffs_sync
VFS_SYNC
sync_fsync
and
pool_get
pool_cache_put_slow
pool_cache_put_paddr
namei
vn_open
firmware_open
iwn_init
ether_ioctl
...
The above patch does not not address the root cause of these panics (but
rather avoids them).
Regards,
Sverre
PS I believe that the problem described in kern/42069 is similar to this.
Home |
Main Index |
Thread Index |
Old Index