- Bump up the general and status RID sizes
- Clear out an_dma_vaddr on free so we can test to see if dma is setup when the card is kldunloaded/kldloaded etc. only for MPI350 - Use a common detach like wi(4) - Notify on RID read overflow and truncate this currently causes a panic in -stable when the stack during an ifconfig an0 is done with newer firmware - Convert from UNLOCK/tsleep/LOCK to msleep. I thought I did that a while ago.
This commit is contained in:
parent
0349754c19
commit
dd8da6f3b3
@ -337,7 +337,7 @@ struct an_ltv_genconfig {
|
|||||||
u_int8_t an_magic_packet_action; /* 0x98 */
|
u_int8_t an_magic_packet_action; /* 0x98 */
|
||||||
u_int8_t an_magic_packet_ctl; /* 0x99 */
|
u_int8_t an_magic_packet_ctl; /* 0x99 */
|
||||||
u_int16_t an_rsvd9;
|
u_int16_t an_rsvd9;
|
||||||
u_int16_t an_spare[13];
|
u_int16_t an_spare[19];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AN_OPMODE_IBSS_ADHOC 0x0000
|
#define AN_OPMODE_IBSS_ADHOC 0x0000
|
||||||
@ -593,7 +593,7 @@ struct an_ltv_status {
|
|||||||
u_int8_t an_avg_noise_prev_min_db; /* 0x7D */
|
u_int8_t an_avg_noise_prev_min_db; /* 0x7D */
|
||||||
u_int8_t an_max_noise_prev_min_pc; /* 0x7E */
|
u_int8_t an_max_noise_prev_min_pc; /* 0x7E */
|
||||||
u_int8_t an_max_noise_prev_min_db; /* 0x7F */
|
u_int8_t an_max_noise_prev_min_db; /* 0x7F */
|
||||||
u_int16_t an_spare[8];
|
u_int16_t an_spare[18];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define AN_STATUS_OPMODE_CONFIGURED 0x0001
|
#define AN_STATUS_OPMODE_CONFIGURED 0x0001
|
||||||
|
@ -503,6 +503,7 @@ an_dma_free(sc, dma)
|
|||||||
{
|
{
|
||||||
bus_dmamap_unload(sc->an_dtag, dma->an_dma_map);
|
bus_dmamap_unload(sc->an_dtag, dma->an_dma_map);
|
||||||
bus_dmamem_free(sc->an_dtag, dma->an_dma_vaddr, dma->an_dma_map);
|
bus_dmamem_free(sc->an_dtag, dma->an_dma_vaddr, dma->an_dma_map);
|
||||||
|
dma->an_dma_vaddr = 0;
|
||||||
bus_dmamap_destroy(sc->an_dtag, dma->an_dma_map);
|
bus_dmamap_destroy(sc->an_dtag, dma->an_dma_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -816,6 +817,29 @@ fail:;
|
|||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
an_detach(device_t dev)
|
||||||
|
{
|
||||||
|
struct an_softc *sc = device_get_softc(dev);
|
||||||
|
struct ifnet *ifp = &sc->arpcom.ac_if;
|
||||||
|
|
||||||
|
if (sc->an_gone) {
|
||||||
|
device_printf(dev,"already unloaded\n");
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
AN_LOCK(sc);
|
||||||
|
an_stop(sc);
|
||||||
|
ifmedia_removeall(&sc->an_ifmedia);
|
||||||
|
ifp->if_flags &= ~IFF_RUNNING;
|
||||||
|
ether_ifdetach(ifp);
|
||||||
|
sc->an_gone = 1;
|
||||||
|
AN_UNLOCK(sc);
|
||||||
|
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
||||||
|
an_release_resources(dev);
|
||||||
|
mtx_destroy(&sc->an_mtx);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
an_rxeof(sc)
|
an_rxeof(sc)
|
||||||
struct an_softc *sc;
|
struct an_softc *sc;
|
||||||
@ -1417,6 +1441,8 @@ an_read_record(sc, ltv)
|
|||||||
*ptr2 = CSR_READ_1(sc, AN_DATA1);
|
*ptr2 = CSR_READ_1(sc, AN_DATA1);
|
||||||
}
|
}
|
||||||
} else { /* MPI-350 */
|
} else { /* MPI-350 */
|
||||||
|
if (!sc->an_rid_buffer.an_dma_vaddr)
|
||||||
|
return(EIO);
|
||||||
an_rid_desc.an_valid = 1;
|
an_rid_desc.an_valid = 1;
|
||||||
an_rid_desc.an_len = AN_RID_BUFFER_SIZE;
|
an_rid_desc.an_len = AN_RID_BUFFER_SIZE;
|
||||||
an_rid_desc.an_rid = 0;
|
an_rid_desc.an_rid = 0;
|
||||||
@ -1449,11 +1475,18 @@ an_read_record(sc, ltv)
|
|||||||
an_rid_desc.an_len = an_ltv->an_len;
|
an_rid_desc.an_len = an_ltv->an_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (an_rid_desc.an_len > 2)
|
len = an_rid_desc.an_len;
|
||||||
bcopy(&an_ltv->an_type,
|
if (len > (ltv->an_len - 2)) {
|
||||||
<v->an_val,
|
printf("an%d: record length mismatch -- expected %d, "
|
||||||
an_rid_desc.an_len - 2);
|
"got %d for Rid %x\n", sc->an_unit,
|
||||||
ltv->an_len = an_rid_desc.an_len + 2;
|
ltv->an_len - 2, len, ltv->an_type);
|
||||||
|
len = ltv->an_len - 2;
|
||||||
|
} else {
|
||||||
|
ltv->an_len = len + 2;
|
||||||
|
}
|
||||||
|
bcopy(&an_ltv->an_type,
|
||||||
|
<v->an_val,
|
||||||
|
len);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (an_dump)
|
if (an_dump)
|
||||||
@ -3376,9 +3409,8 @@ writerids(ifp, l_ioctl)
|
|||||||
* Linux driver
|
* Linux driver
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FLASH_DELAY(_sc, x) AN_UNLOCK(_sc) ; \
|
#define FLASH_DELAY(_sc, x) msleep(ifp, &(_sc)->an_mtx, PZERO, \
|
||||||
tsleep(ifp, PZERO, "flash", ((x) / hz) + 1); \
|
"flash", ((x) / hz) + 1);
|
||||||
AN_LOCK(_sc) ;
|
|
||||||
#define FLASH_COMMAND 0x7e7e
|
#define FLASH_COMMAND 0x7e7e
|
||||||
#define FLASH_SIZE 32 * 1024
|
#define FLASH_SIZE 32 * 1024
|
||||||
|
|
||||||
|
@ -79,7 +79,6 @@ static struct isa_pnp_id an_ids[] = {
|
|||||||
|
|
||||||
static int an_probe_isa (device_t);
|
static int an_probe_isa (device_t);
|
||||||
static int an_attach_isa (device_t);
|
static int an_attach_isa (device_t);
|
||||||
static int an_detach_isa (device_t);
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
an_probe_isa(dev)
|
an_probe_isa(dev)
|
||||||
@ -133,26 +132,11 @@ an_attach_isa(dev)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
an_detach_isa(device_t dev)
|
|
||||||
{
|
|
||||||
struct an_softc *sc = device_get_softc(dev);
|
|
||||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
|
||||||
|
|
||||||
an_stop(sc);
|
|
||||||
ifmedia_removeall(&sc->an_ifmedia);
|
|
||||||
ether_ifdetach(ifp);
|
|
||||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
|
||||||
an_release_resources(dev);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static device_method_t an_isa_methods[] = {
|
static device_method_t an_isa_methods[] = {
|
||||||
/* Device interface */
|
/* Device interface */
|
||||||
DEVMETHOD(device_probe, an_probe_isa),
|
DEVMETHOD(device_probe, an_probe_isa),
|
||||||
DEVMETHOD(device_attach, an_attach_isa),
|
DEVMETHOD(device_attach, an_attach_isa),
|
||||||
DEVMETHOD(device_detach, an_detach_isa),
|
DEVMETHOD(device_detach, an_detach),
|
||||||
DEVMETHOD(device_shutdown, an_shutdown),
|
DEVMETHOD(device_shutdown, an_shutdown),
|
||||||
{ 0, 0 }
|
{ 0, 0 }
|
||||||
};
|
};
|
||||||
|
@ -79,13 +79,12 @@ __FBSDID("$FreeBSD$");
|
|||||||
static int an_pccard_match(device_t);
|
static int an_pccard_match(device_t);
|
||||||
static int an_pccard_probe(device_t);
|
static int an_pccard_probe(device_t);
|
||||||
static int an_pccard_attach(device_t);
|
static int an_pccard_attach(device_t);
|
||||||
static int an_pccard_detach(device_t);
|
|
||||||
|
|
||||||
static device_method_t an_pccard_methods[] = {
|
static device_method_t an_pccard_methods[] = {
|
||||||
/* Device interface */
|
/* Device interface */
|
||||||
DEVMETHOD(device_probe, pccard_compat_probe),
|
DEVMETHOD(device_probe, pccard_compat_probe),
|
||||||
DEVMETHOD(device_attach, pccard_compat_attach),
|
DEVMETHOD(device_attach, pccard_compat_attach),
|
||||||
DEVMETHOD(device_detach, an_pccard_detach),
|
DEVMETHOD(device_detach, an_detach),
|
||||||
DEVMETHOD(device_shutdown, an_shutdown),
|
DEVMETHOD(device_shutdown, an_shutdown),
|
||||||
|
|
||||||
/* Card interface */
|
/* Card interface */
|
||||||
@ -130,27 +129,6 @@ an_pccard_match(device_t dev)
|
|||||||
return (ENXIO);
|
return (ENXIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
an_pccard_detach(device_t dev)
|
|
||||||
{
|
|
||||||
struct an_softc *sc = device_get_softc(dev);
|
|
||||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
|
||||||
|
|
||||||
if (sc->an_gone) {
|
|
||||||
device_printf(dev,"already unloaded\n");
|
|
||||||
return(0);
|
|
||||||
}
|
|
||||||
an_stop(sc);
|
|
||||||
ifmedia_removeall(&sc->an_ifmedia);
|
|
||||||
ifp->if_flags &= ~IFF_RUNNING;
|
|
||||||
ether_ifdetach(ifp);
|
|
||||||
sc->an_gone = 1;
|
|
||||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
|
||||||
an_release_resources(dev);
|
|
||||||
mtx_destroy(&sc->an_mtx);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
an_pccard_probe(device_t dev)
|
an_pccard_probe(device_t dev)
|
||||||
{
|
{
|
||||||
|
@ -111,7 +111,6 @@ static struct an_type an_devs[] = {
|
|||||||
|
|
||||||
static int an_probe_pci (device_t);
|
static int an_probe_pci (device_t);
|
||||||
static int an_attach_pci (device_t);
|
static int an_attach_pci (device_t);
|
||||||
static int an_detach_pci (device_t);
|
|
||||||
static int an_suspend_pci (device_t);
|
static int an_suspend_pci (device_t);
|
||||||
static int an_resume_pci (device_t);
|
static int an_resume_pci (device_t);
|
||||||
|
|
||||||
@ -249,21 +248,6 @@ an_attach_pci(dev)
|
|||||||
return(error);
|
return(error);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
an_detach_pci(device_t dev)
|
|
||||||
{
|
|
||||||
struct an_softc *sc = device_get_softc(dev);
|
|
||||||
struct ifnet *ifp = &sc->arpcom.ac_if;
|
|
||||||
|
|
||||||
an_stop(sc);
|
|
||||||
ifmedia_removeall(&sc->an_ifmedia);
|
|
||||||
ether_ifdetach(ifp);
|
|
||||||
bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
|
|
||||||
an_release_resources(dev);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
an_suspend_pci(device_t dev)
|
an_suspend_pci(device_t dev)
|
||||||
{
|
{
|
||||||
@ -284,7 +268,7 @@ static device_method_t an_pci_methods[] = {
|
|||||||
/* Device interface */
|
/* Device interface */
|
||||||
DEVMETHOD(device_probe, an_probe_pci),
|
DEVMETHOD(device_probe, an_probe_pci),
|
||||||
DEVMETHOD(device_attach, an_attach_pci),
|
DEVMETHOD(device_attach, an_attach_pci),
|
||||||
DEVMETHOD(device_detach, an_detach_pci),
|
DEVMETHOD(device_detach, an_detach),
|
||||||
DEVMETHOD(device_shutdown, an_shutdown),
|
DEVMETHOD(device_shutdown, an_shutdown),
|
||||||
DEVMETHOD(device_suspend, an_suspend_pci),
|
DEVMETHOD(device_suspend, an_suspend_pci),
|
||||||
DEVMETHOD(device_resume, an_resume_pci),
|
DEVMETHOD(device_resume, an_resume_pci),
|
||||||
|
@ -513,6 +513,7 @@ int an_probe (device_t);
|
|||||||
void an_shutdown (device_t);
|
void an_shutdown (device_t);
|
||||||
void an_resume (device_t);
|
void an_resume (device_t);
|
||||||
int an_attach (struct an_softc *, int, int);
|
int an_attach (struct an_softc *, int, int);
|
||||||
|
int an_detach (device_t);
|
||||||
void an_stop (struct an_softc *);
|
void an_stop (struct an_softc *);
|
||||||
|
|
||||||
driver_intr_t an_intr;
|
driver_intr_t an_intr;
|
||||||
|
Loading…
Reference in New Issue
Block a user