svn commit: r226465 - head/sys/dev/usb/wlan
Bjoern A. Zeeb
bzeeb-lists at lists.zabbadoz.net
Mon Oct 17 13:25:58 UTC 2011
On 17. Oct 2011, at 13:12 , Adrian Chadd wrote:
> Author: adrian
> Date: Mon Oct 17 13:12:47 2011
> New Revision: 226465
> URL: http://svn.freebsd.org/changeset/base/226465
>
> Log:
> Fix an issue with 11g beacon frames which looks to be a limitation
> on the largest multi-write size.
>
Does it compile? I just did a -DKERNFAST recompile and hit:
/sys/modules/usb/rum/../../../dev/usb/wlan/if_rum.c: In function 'rum_write_multi':
/sys/modules/usb/rum/../../../dev/usb/wlan/if_rum.c:1421: warning: pointer of type 'void *' used in arithmetic
> 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 at pyro.eu.org>
> MFC after: 3 days
>
> Modified:
> head/sys/dev/usb/wlan/if_rum.c
>
> Modified: head/sys/dev/usb/wlan/if_rum.c
> ==============================================================================
> --- head/sys/dev/usb/wlan/if_rum.c Mon Oct 17 13:05:57 2011 (r226464)
> +++ head/sys/dev/usb/wlan/if_rum.c Mon Oct 17 13:12:47 2011 (r226465)
> @@ -1407,20 +1407,25 @@ rum_write_multi(struct rum_softc *sc, ui
> {
> struct usb_device_request req;
> usb_error_t error;
> + int offset;
>
> req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
> req.bRequest = RT2573_WRITE_MULTI_MAC;
> USETW(req.wValue, 0);
> - USETW(req.wIndex, reg);
> - USETW(req.wLength, len);
>
> - error = rum_do_request(sc, &req, buf);
> - if (error != 0) {
> - device_printf(sc->sc_dev,
> - "could not multi write MAC register: %s\n",
> - usbd_errstr(error));
> + /* write at most 64 bytes at a time */
> + for (offset = 0; offset < len; offset += 64) {
> + USETW(req.wIndex, reg + offset);
> + USETW(req.wLength, MIN(len - offset, 64));
> +
> + 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
--
Bjoern A. Zeeb You have to have visions!
Stop bit received. Insert coin for new address family.
More information about the svn-src-head
mailing list