Fix an issue with 11g beacon frames which looks to be a limitation

on the largest multi-write size.

From the submitter:

==
I looked further into the magic 88-byte threshold after which the bug
occurs.  It turns out that figure included the 24-byte tx_desc, and up
to 64 bytes of beacon frame (header+data).

rum_write_multi doesn't seem happy with writing >64 bytes at a time to
the MAC register.  If I break it up into separate calls (e.g. bytes
0-63, then bytes 64-65, written at the appropriate offset) I see the
proper beacon frames being transmitted now.
==

Submitted by:	Steven Chamberlain <steven@pyro.eu.org>
MFC after:	3 days
This commit is contained in:
Adrian Chadd 2011-10-17 13:12:47 +00:00
parent 32ca8e078d
commit 65d7e4d9f1

View File

@ -1407,20 +1407,25 @@ rum_write_multi(struct rum_softc *sc, uint16_t reg, void *buf, size_t len)
{ {
struct usb_device_request req; struct usb_device_request req;
usb_error_t error; usb_error_t error;
int offset;
req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
req.bRequest = RT2573_WRITE_MULTI_MAC; req.bRequest = RT2573_WRITE_MULTI_MAC;
USETW(req.wValue, 0); USETW(req.wValue, 0);
USETW(req.wIndex, reg);
USETW(req.wLength, len);
error = rum_do_request(sc, &req, buf); /* write at most 64 bytes at a time */
if (error != 0) { for (offset = 0; offset < len; offset += 64) {
device_printf(sc->sc_dev, USETW(req.wIndex, reg + offset);
"could not multi write MAC register: %s\n", USETW(req.wLength, MIN(len - offset, 64));
usbd_errstr(error));
error = rum_do_request(sc, &req, buf + offset);
if (error != 0) {
device_printf(sc->sc_dev,
"could not multi write MAC register: %s\n",
usbd_errstr(error));
return (error);
}
} }
return (error);
} }
static void static void