On Wed, Jun 21, 2006 at 11:32:50PM +0200, Laurens Vets wrote:
> Matt Van Mater wrote:
> >I ran into a very similar (maybe same) problem here:
> >http://marc.theaimsgroup.com/?l=openbsd-misc&m=113236417207016&w=2
> >
> >I have not found a solution to my problem yet unfortunately. One
> >thing I noticed is that my an0 card worked just find in 3.7 and 3.8
> >broke it, you might want to verify if that is the case with you as
> >well.
> >
> >Another thing I noticed is that the an0 card gets a dhcp address and
> >works properly during the initial install via cd or the ram disk off
> >of a floppy, but stops working upon first reboot.
>
> I have noticed the exact same problem as the link above. Card worked
> with OpenBSD 3.7. I did an upgrade from 3.7 -> 3.8 -> 3.9 following
the
> OpenBSD upgrade guides.
> After the upgrade to 3.8, I also saw the error "an0: failed to enable
> MAC", but wifi access still worked. After the upgrade to 3.9, I got
the
> following in my dmesg at startup:
>
> an0 at pcmcia1 function 0 "Cisco Systems, 350 Series Wireless LAN
Adapter"
> an0: record buffer is too small, rid=ff00, size=198, len=258
> an0: read caps failed
> an0: failed to attach controller
this is a piece of our changes that was lost when a driver was converted
to use net80211. i think this diff should fix it. please try.
i have not tested it beyound compile.
10x
cu
--
paranoic mickey (my employers have changed but, the name has
remained)
Index: an.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/an.c,v
retrieving revision 1.51
diff -u -r1.51 an.c
--- an.c 22 May 2006 20:35:12 -0000 1.51
+++ an.c 22 Jun 2006 09:37:00 -0000
@@ -146,7 +146,7 @@
int an_cmd(struct an_softc *, int, int);
int an_seek_bap(struct an_softc *, int, int);
-int an_read_bap(struct an_softc *, int, int, void *, int);
+int an_read_bap(struct an_softc *, int, int, void *, int, int);
int an_write_bap(struct an_softc *, int, int, void *, int);
int an_mwrite_bap(struct an_softc *, int, int, struct mbuf *, int);
int an_read_rid(struct an_softc *, int, void *, int *);
@@ -367,7 +367,7 @@
fid = CSR_READ_2(sc, AN_RX_FID);
/* First read in the frame header */
- if (an_read_bap(sc, fid, 0, &frmhdr, sizeof(frmhdr)) != 0) {
+ if (an_read_bap(sc, fid, 0, &frmhdr, sizeof(frmhdr),
sizeof(frmhdr)) != 0) {
CSR_WRITE_2(sc, AN_EVENT_ACK, AN_EV_RX);
ifp->if_ierrors++;
DPRINTF(("an_rxeof: read fid %x failed\n", fid));
@@ -437,12 +437,13 @@
*/
gap = m->m_data + sizeof(struct ieee80211_frame) -
sizeof(uint16_t);
- an_read_bap(sc, fid, -1, gap, gaplen +
sizeof(u_int16_t));
+ an_read_bap(sc, fid, -1, gap, gaplen + sizeof(u_int16_t),
+ gaplen + sizeof(u_int16_t));
} else
gaplen = 0;
an_read_bap(sc, fid, -1,
- m->m_data + sizeof(struct ieee80211_frame) + gaplen, len);
+ m->m_data + sizeof(struct ieee80211_frame) + gaplen, len,
len);
an_swap16((u_int16_t *)(m->m_data + sizeof(struct ieee80211_frame) +
gaplen), (len+1)/2);
m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame) + gaplen +
len;
@@ -695,11 +696,11 @@
}
int
-an_read_bap(struct an_softc *sc, int id, int off, void *buf, int buflen)
+an_read_bap(struct an_softc *sc, int id, int off, void *buf, int len,
int blen)
{
- int error, cnt;
+ int error, cnt, cnt2;
- if (buflen == 0)
+ if (len == 0 || blen == 0)
return 0;
if (off == -1)
off = sc->sc_bap_off;
@@ -708,8 +709,10 @@
return EIO;
}
- cnt = (buflen + 1) / 2;
+ cnt = (blen + 1) / 2;
CSR_READ_MULTI_STREAM_2(sc, AN_DATA0, (u_int16_t *)buf, cnt);
+ for (cnt2 = (len + 1) / 2; cnt < cnt2; cnt++)
+ (void) CSR_READ_2(sc, AN_DATA0);
sc->sc_bap_off += cnt * 2;
return 0;
@@ -841,19 +844,12 @@
return error;
/* length in byte, including length itself */
- error = an_read_bap(sc, rid, 0, &len, sizeof(len));
+ error = an_read_bap(sc, rid, 0, &len, sizeof(len), sizeof(len));
if (error)
return error;
len -= 2;
- if (*buflenp < len) {
- printf("%s: record buffer is too small, "
- "rid=%x, size=%d, len=%d\n",
- sc->sc_dev.dv_xname, rid, *buflenp, len);
- return ENOSPC;
- }
- *buflenp = len;
- return an_read_bap(sc, rid, sizeof(len), buf, len);
+ return an_read_bap(sc, rid, sizeof(len), buf, len, *buflenp);
}
int