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-all mailing list