mirror of
https://git.FreeBSD.org/src.git
synced 2024-12-17 10:26:15 +00:00
Don't lock in the attach routine. It isn't required. Register the
interrupt handler last. This gets rid of the sleep while locked messages. Reviewed by: ambrisko
This commit is contained in:
parent
f5746231ff
commit
5414629575
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=113316
@ -668,13 +668,12 @@ an_attach(sc, unit, flags)
|
||||
int flags;
|
||||
{
|
||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||
int error;
|
||||
int error = EIO;
|
||||
int i, nrate, mword;
|
||||
u_int8_t r;
|
||||
|
||||
mtx_init(&sc->an_mtx, device_get_nameunit(sc->an_dev), MTX_NETWORK_LOCK,
|
||||
MTX_DEF | MTX_RECURSE);
|
||||
AN_LOCK(sc);
|
||||
|
||||
sc->an_gone = 0;
|
||||
sc->an_associated = 0;
|
||||
@ -687,15 +686,13 @@ an_attach(sc, unit, flags)
|
||||
if (sc->mpi350) {
|
||||
error = an_init_mpi350_desc(sc);
|
||||
if (error)
|
||||
return(error);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Load factory config */
|
||||
if (an_cmd(sc, AN_CMD_READCFG, 0)) {
|
||||
printf("an%d: failed to load config data\n", sc->an_unit);
|
||||
AN_UNLOCK(sc);
|
||||
mtx_destroy(&sc->an_mtx);
|
||||
return(EIO);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Read the current configuration */
|
||||
@ -703,9 +700,7 @@ an_attach(sc, unit, flags)
|
||||
sc->an_config.an_len = sizeof(struct an_ltv_genconfig);
|
||||
if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_config)) {
|
||||
printf("an%d: read record failed\n", sc->an_unit);
|
||||
AN_UNLOCK(sc);
|
||||
mtx_destroy(&sc->an_mtx);
|
||||
return(EIO);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Read the card capabilities */
|
||||
@ -713,9 +708,7 @@ an_attach(sc, unit, flags)
|
||||
sc->an_caps.an_len = sizeof(struct an_ltv_caps);
|
||||
if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_caps)) {
|
||||
printf("an%d: read record failed\n", sc->an_unit);
|
||||
AN_UNLOCK(sc);
|
||||
mtx_destroy(&sc->an_mtx);
|
||||
return(EIO);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Read ssid list */
|
||||
@ -723,9 +716,7 @@ an_attach(sc, unit, flags)
|
||||
sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist);
|
||||
if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) {
|
||||
printf("an%d: read record failed\n", sc->an_unit);
|
||||
AN_UNLOCK(sc);
|
||||
mtx_destroy(&sc->an_mtx);
|
||||
return(EIO);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Read AP list */
|
||||
@ -733,9 +724,7 @@ an_attach(sc, unit, flags)
|
||||
sc->an_aplist.an_len = sizeof(struct an_ltv_aplist);
|
||||
if (an_read_record(sc, (struct an_ltv_gen *)&sc->an_aplist)) {
|
||||
printf("an%d: read record failed\n", sc->an_unit);
|
||||
AN_UNLOCK(sc);
|
||||
mtx_destroy(&sc->an_mtx);
|
||||
return(EIO);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
#ifdef ANCACHE
|
||||
@ -817,9 +806,11 @@ an_attach(sc, unit, flags)
|
||||
*/
|
||||
ether_ifattach(ifp, sc->arpcom.ac_enaddr);
|
||||
callout_handle_init(&sc->an_stat_ch);
|
||||
AN_UNLOCK(sc);
|
||||
|
||||
return(0);
|
||||
fail:;
|
||||
mtx_destroy(&sc->an_mtx);
|
||||
return(error);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -115,18 +115,23 @@ an_attach_isa(dev)
|
||||
an_alloc_port(dev, sc->port_rid, 1);
|
||||
an_alloc_irq(dev, sc->irq_rid, 0);
|
||||
|
||||
sc->an_bhandle = rman_get_bushandle(sc->port_res);
|
||||
sc->an_btag = rman_get_bustag(sc->port_res);
|
||||
sc->an_dev = dev;
|
||||
|
||||
error = an_attach(sc, device_get_unit(dev), flags);
|
||||
if (error) {
|
||||
an_release_resources(dev);
|
||||
return (error);
|
||||
}
|
||||
|
||||
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
|
||||
an_intr, sc, &sc->irq_handle);
|
||||
if (error) {
|
||||
an_release_resources(dev);
|
||||
return (error);
|
||||
}
|
||||
|
||||
sc->an_bhandle = rman_get_bushandle(sc->port_res);
|
||||
sc->an_btag = rman_get_bustag(sc->port_res);
|
||||
sc->an_dev = dev;
|
||||
|
||||
return an_attach(sc, device_get_unit(dev), flags);
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
|
@ -176,18 +176,26 @@ an_pccard_attach(device_t dev)
|
||||
an_alloc_port(dev, sc->port_rid, AN_IOSIZ);
|
||||
an_alloc_irq(dev, sc->irq_rid, 0);
|
||||
|
||||
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
|
||||
an_intr, sc, &sc->irq_handle);
|
||||
if (error) {
|
||||
printf("setup intr failed %d \n", error);
|
||||
an_release_resources(dev);
|
||||
return (error);
|
||||
}
|
||||
|
||||
sc->an_bhandle = rman_get_bushandle(sc->port_res);
|
||||
sc->an_btag = rman_get_bustag(sc->port_res);
|
||||
sc->an_dev = dev;
|
||||
|
||||
error = an_attach(sc, device_get_unit(dev), flags);
|
||||
if (error) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* Must setup the interrupt after the an_attach to prevent racing.
|
||||
*/
|
||||
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
|
||||
an_intr, sc, &sc->irq_handle);
|
||||
if (error) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fail:
|
||||
if (error)
|
||||
an_release_resources(dev);
|
||||
return (error);
|
||||
}
|
||||
|
@ -229,14 +229,17 @@ an_attach_pci(dev)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
|
||||
an_intr, sc, &sc->irq_handle);
|
||||
sc->an_dev = dev;
|
||||
error = an_attach(sc, device_get_unit(dev), flags);
|
||||
if (error) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
sc->an_dev = dev;
|
||||
error = an_attach(sc, device_get_unit(dev), flags);
|
||||
/*
|
||||
* Must setup the interrupt after the an_attach to prevent racing.
|
||||
*/
|
||||
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET,
|
||||
an_intr, sc, &sc->irq_handle);
|
||||
|
||||
fail:
|
||||
if (error)
|
||||
|
Loading…
Reference in New Issue
Block a user