On Thursday, May 12, 2016 05:47:30 PM Scott Long wrote:
> Author: scottl
> Date: Thu May 12 17:47:30 2016
> New Revision: 299544
> URL: https://svnweb.freebsd.org/changeset/base/299544
> 
> Log:
>   Move mutex initialization from PCI probe to PCI attach.  Drivers are not
>   allowed to create any persistent state in their probe routine because it's
>   not guaranteed that they'll win the election and be allowed to attach.

Except that if they return 0 (which most shouldn't) it is guaranteed.
an_probe() used to return 0, but it was changed to return BUS_PROBE_DEFAULT
without fixing this.  (Oops)

an_probe() could just be fixed to destroy the lock and the lock init could
then be moved into an_attach().

> Modified: head/sys/dev/an/if_an_pci.c
> ==============================================================================
> --- head/sys/dev/an/if_an_pci.c       Thu May 12 16:34:59 2016        
> (r299543)
> +++ head/sys/dev/an/if_an_pci.c       Thu May 12 17:47:30 2016        
> (r299544)
> @@ -119,16 +119,16 @@ static int
>  an_probe_pci(device_t dev)
>  {
>       struct an_type          *t;
> -     struct an_softc *sc = device_get_softc(dev);
> +     uint16_t vid, did;
>  
> -     bzero(sc, sizeof(struct an_softc));

This wasn't necessary before.

>       t = an_devs;
> +     vid = pci_get_vendor(dev);
> +     did = pci_get_device(dev);
>  
>       while (t->an_name != NULL) {
> -             if (pci_get_vendor(dev) == t->an_vid &&
> -                 pci_get_device(dev) == t->an_did) {
> +             if (vid == t->an_vid &&
> +                 did == t->an_did) {
>                       device_set_desc(dev, t->an_name);
> -                     an_pci_probe(dev);
>                       return(BUS_PROBE_DEFAULT);
>               }
>               t++;
> @@ -145,8 +145,16 @@ an_attach_pci(dev)
>       int                     flags, error = 0;
>  
>       sc = device_get_softc(dev);
> +     bzero(sc, sizeof(struct an_softc));

This isn't necessary now (softc's are pre-zeroed by new-bus).

>       flags = device_get_flags(dev);
>  
> +     /*
> +      * Setup the lock in PCI attachment since it skips the an_probe
> +      * function.
> +      */
> +     mtx_init(&sc->an_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
> +         MTX_DEF);
> +
>       if (pci_get_vendor(dev) == AIRONET_VENDORID &&
>           pci_get_device(dev) == AIRONET_DEVICEID_MPI350) {
>               sc->mpi350 = 1;
> 

-- 
John Baldwin
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to