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:
parent
32ca8e078d
commit
65d7e4d9f1
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user