From owner-p4-projects@FreeBSD.ORG Wed Feb 11 12:33:03 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 289C610659E3; Wed, 11 Feb 2009 12:33:03 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8C1B31065983 for ; Wed, 11 Feb 2009 12:33:02 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 719F88FC15 for ; Wed, 11 Feb 2009 12:33:02 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n1BCX2N6016515 for ; Wed, 11 Feb 2009 12:33:02 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n1BCX2xR016513 for perforce@freebsd.org; Wed, 11 Feb 2009 12:33:02 GMT (envelope-from hselasky@FreeBSD.org) Date: Wed, 11 Feb 2009 12:33:02 GMT Message-Id: <200902111233.n1BCX2xR016513@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 157536 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Feb 2009 12:33:08 -0000 http://perforce.freebsd.org/chv.cgi?CH=157536 Change 157536 by hselasky@hselasky_laptop001 on 2009/02/11 12:33:01 USB WLAN patches - more patches taken from the "HPS" version of the USB WLAN drivers. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_rum2.c#35 edit .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_ural2.c#34 edit .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_zyd2.c#36 edit .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_zydreg.h#8 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_rum2.c#35 (text+ko) ==== @@ -54,9 +54,6 @@ "Debug level"); #endif -#define rum_do_request(sc,req,data) \ - usb2_do_request_proc((sc)->sc_udev, &(sc)->sc_tq, req, data, 0, NULL, 5000) - static const struct usb2_device_id rum_devs[] = { { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_HWU54DM) }, { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_2) }, @@ -128,6 +125,8 @@ static usb2_proc_callback_t rum_stop_task; static usb2_proc_callback_t rum_flush_task; +static void rum_do_request(struct rum_softc *sc, + struct usb2_device_request *req, void *data); static struct ieee80211vap *rum_vap_create(struct ieee80211com *, const char name[IFNAMSIZ], int unit, int opmode, int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], @@ -173,6 +172,8 @@ static void rum_update_slot(struct ifnet *); static void rum_set_bssid(struct rum_softc *, const uint8_t *); static void rum_set_macaddr(struct rum_softc *, const uint8_t *); +static void rum_update_mcast(struct ifnet *); +static void rum_update_promisc(struct ifnet *); static const char *rum_get_rf(int); static void rum_read_eeprom(struct rum_softc *); static int rum_bbp_init(struct rum_softc *); @@ -515,6 +516,8 @@ ieee80211_init_channels(ic, NULL, &bands); ieee80211_ifattach(ic); + ic->ic_update_mcast = rum_update_mcast; + ic->ic_update_promisc = rum_update_promisc; ic->ic_newassoc = rum_newassoc; ic->ic_raw_xmit = rum_raw_xmit; ic->ic_node_alloc = rum_node_alloc; @@ -575,6 +578,31 @@ return (0); } +static void +rum_do_request(struct rum_softc *sc, + struct usb2_device_request *req, void *data) +{ + usb2_error_t err; + + /* + * Occasionally the RUM chip will just generate control + * request timeouts. Probably a USB driver bug in the + * firmware! Try to workaround the problem. + */ + retry: + err = usb2_do_request_proc(sc->sc_udev, &sc->sc_tq, + req, data, 0, NULL, 250 /* ms */); + + if (err) { + if (!usb2_proc_is_gone(&sc->sc_tq)) { + DPRINTFN(1, "Control request failed! (ignored)\n"); + rum_pause(sc, hz / 100); + goto retry; + } + } + return; +} + static struct ieee80211vap * rum_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit, int opmode, int flags, @@ -1403,7 +1431,6 @@ rum_eeprom_read(struct rum_softc *sc, uint16_t addr, void *buf, int len) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = RT2573_READ_EEPROM; @@ -1411,11 +1438,7 @@ USETW(req.wIndex, addr); USETW(req.wLength, len); - error = rum_do_request(sc, &req, buf); - if (error != 0) { - device_printf(sc->sc_dev, "could not read EEPROM: %s\n", - usb2_errstr(error)); - } + rum_do_request(sc, &req, buf); } static uint32_t @@ -1432,7 +1455,6 @@ rum_read_multi(struct rum_softc *sc, uint16_t reg, void *buf, int len) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = RT2573_READ_MULTI_MAC; @@ -1440,12 +1462,7 @@ 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 read MAC register(0x%04x): %s\n", - reg, usb2_errstr(error)); - } + rum_do_request(sc, &req, buf); } static void @@ -1460,7 +1477,6 @@ rum_write_multi(struct rum_softc *sc, uint16_t reg, void *buf, size_t len) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = RT2573_WRITE_MULTI_MAC; @@ -1468,12 +1484,7 @@ 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(0x%04x): %s\n", - reg, usb2_errstr(error)); - } + rum_do_request(sc, &req, buf); } static void @@ -1849,6 +1860,27 @@ "entering" : "leaving"); } +static void +rum_update_mcast(struct ifnet *ifp) +{ + /* not supported */ +} + +static void +rum_update_promisc(struct ifnet *ifp) +{ + struct rum_softc *sc = ifp->if_softc; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + + RUM_LOCK(sc); + rum_queue_command(sc, rum_promisctask, + &sc->sc_promisctask[0].hdr, + &sc->sc_promisctask[1].hdr); + RUM_UNLOCK(sc); +} + static const char * rum_get_rf(int rev) { @@ -2116,7 +2148,6 @@ { struct usb2_device_request req; uint16_t reg = RT2573_MCU_CODE_BASE; - usb2_error_t error; /* * TODO: If the firmware is already loaded, @@ -2133,12 +2164,8 @@ USETW(req.wIndex, 0); USETW(req.wLength, 0); - error = rum_do_request(sc, &req, NULL); - if (error != 0) { - device_printf(sc->sc_dev, "could not run firmware: %s\n", - usb2_errstr(error)); - } - return error; + rum_do_request(sc, &req, NULL); + return (0); } static int ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_ural2.c#34 (text+ko) ==== @@ -55,9 +55,6 @@ "Debug level"); #endif -#define ural_do_request(sc,req,data) \ - usb2_do_request_proc((sc)->sc_udev, &(sc)->sc_tq, req, data, 0, NULL, 5000) - #define URAL_RSSI(rssi) \ ((rssi) > (RAL_NOISE_FLOOR + RAL_RSSI_CORR) ? \ ((rssi) - (RAL_NOISE_FLOOR + RAL_RSSI_CORR)) : 0) @@ -107,6 +104,8 @@ static usb2_proc_callback_t ural_stop_task; static usb2_proc_callback_t ural_flush_task; +static void ural_do_request(struct ural_softc *sc, + struct usb2_device_request *req, void *data); static struct ieee80211vap *ural_vap_create(struct ieee80211com *, const char name[IFNAMSIZ], int unit, int opmode, int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], @@ -155,6 +154,8 @@ const struct ieee80211_channel *); static void ural_set_bssid(struct ural_softc *, const uint8_t *); static void ural_set_macaddr(struct ural_softc *, uint8_t *); +static void ural_update_mcast(struct ifnet *); +static void ural_update_promisc(struct ifnet *); static const char *ural_get_rf(int); static void ural_read_eeprom(struct ural_softc *); static int ural_bbp_init(struct ural_softc *); @@ -501,6 +502,8 @@ ieee80211_init_channels(ic, NULL, &bands); ieee80211_ifattach(ic); + ic->ic_update_mcast = ural_update_mcast; + ic->ic_update_promisc = ural_update_promisc; ic->ic_newassoc = ural_newassoc; ic->ic_raw_xmit = ural_raw_xmit; ic->ic_node_alloc = ural_node_alloc; @@ -561,6 +564,25 @@ return (0); } +static void +ural_do_request(struct ural_softc *sc, + struct usb2_device_request *req, void *data) +{ + usb2_error_t err; + + retry: + err = usb2_do_request_proc(sc->sc_udev, &sc->sc_tq, + req, data, 0, NULL, 250 /* ms */); + + if (err) { + if (!usb2_proc_is_gone(&sc->sc_tq)) { + DPRINTFN(1, "Control request failed! (ignored)\n"); + ural_pause(sc, hz / 100); + goto retry; + } + } +} + static struct ieee80211vap * ural_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit, int opmode, int flags, @@ -1476,7 +1498,6 @@ ural_set_testmode(struct ural_softc *sc) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = RAL_VENDOR_REQUEST; @@ -1484,18 +1505,13 @@ USETW(req.wIndex, 1); USETW(req.wLength, 0); - error = ural_do_request(sc, &req, NULL); - if (error != 0) { - device_printf(sc->sc_dev, "could not set test mode: %s\n", - usb2_errstr(error)); - } + ural_do_request(sc, &req, NULL); } static void ural_eeprom_read(struct ural_softc *sc, uint16_t addr, void *buf, int len) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = RAL_READ_EEPROM; @@ -1503,18 +1519,13 @@ USETW(req.wIndex, addr); USETW(req.wLength, len); - error = ural_do_request(sc, &req, buf); - if (error != 0) { - device_printf(sc->sc_dev, "could not read EEPROM: %s\n", - usb2_errstr(error)); - } + ural_do_request(sc, &req, buf); } static uint16_t ural_read(struct ural_softc *sc, uint16_t reg) { struct usb2_device_request req; - usb2_error_t error; uint16_t val; req.bmRequestType = UT_READ_VENDOR_DEVICE; @@ -1523,12 +1534,7 @@ USETW(req.wIndex, reg); USETW(req.wLength, sizeof (uint16_t)); - error = ural_do_request(sc, &req, &val); - if (error != 0) { - device_printf(sc->sc_dev, "could not read MAC register: %s\n", - usb2_errstr(error)); - return 0; - } + ural_do_request(sc, &req, &val); return le16toh(val); } @@ -1537,7 +1543,6 @@ ural_read_multi(struct ural_softc *sc, uint16_t reg, void *buf, int len) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_READ_VENDOR_DEVICE; req.bRequest = RAL_READ_MULTI_MAC; @@ -1545,18 +1550,13 @@ USETW(req.wIndex, reg); USETW(req.wLength, len); - error = ural_do_request(sc, &req, buf); - if (error != 0) { - device_printf(sc->sc_dev, "could not read MAC register: %s\n", - usb2_errstr(error)); - } + ural_do_request(sc, &req, buf); } static void ural_write(struct ural_softc *sc, uint16_t reg, uint16_t val) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = RAL_WRITE_MAC; @@ -1564,18 +1564,13 @@ USETW(req.wIndex, reg); USETW(req.wLength, 0); - error = ural_do_request(sc, &req, NULL); - if (error != 0) { - device_printf(sc->sc_dev, "could not write MAC register: %s\n", - usb2_errstr(error)); - } + ural_do_request(sc, &req, NULL); } static void ural_write_multi(struct ural_softc *sc, uint16_t reg, void *buf, int len) { struct usb2_device_request req; - usb2_error_t error; req.bmRequestType = UT_WRITE_VENDOR_DEVICE; req.bRequest = RAL_WRITE_MULTI_MAC; @@ -1583,11 +1578,7 @@ USETW(req.wIndex, reg); USETW(req.wLength, len); - error = ural_do_request(sc, &req, buf); - if (error != 0) { - device_printf(sc->sc_dev, "could not write MAC register: %s\n", - usb2_errstr(error)); - } + ural_do_request(sc, &req, buf); } static void @@ -2000,6 +1991,27 @@ "entering" : "leaving"); } +static void +ural_update_mcast(struct ifnet *ifp) +{ + /* not supported */ +} + +static void +ural_update_promisc(struct ifnet *ifp) +{ + struct ural_softc *sc = ifp->if_softc; + + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + return; + + RAL_LOCK(sc); + ural_queue_command(sc, ural_promisctask, + &sc->sc_promisctask[0].hdr, + &sc->sc_promisctask[1].hdr); + RAL_UNLOCK(sc); +} + static const char * ural_get_rf(int rev) { ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_zyd2.c#36 (text+ko) ==== @@ -419,7 +419,12 @@ ic->ic_vap_create = zyd_vap_create; ic->ic_vap_delete = zyd_vap_delete; + /* + * The same callback function is used for multicast a + * promiscious mode: + */ ic->ic_update_mcast = zyd_update_mcast; + ic->ic_update_promisc = zyd_update_mcast; bpfattach(ifp, DLT_IEEE802_11_RADIO, sizeof(struct ieee80211_frame) + sizeof(sc->sc_txtap)); @@ -2748,9 +2753,9 @@ ZYD_LOCK(sc); if (ifp->if_flags & IFF_UP) { if (ifp->if_drv_flags & IFF_DRV_RUNNING) { - if ((ifp->if_flags ^ sc->sc_if_flags) & - (IFF_ALLMULTI | IFF_PROMISC)) - zyd_set_multi(sc); + zyd_queue_command(sc, zyd_multitask, + &sc->sc_mcasttask[0].hdr, + &sc->sc_mcasttask[1].hdr); } else { zyd_queue_command(sc, zyd_init_task, &sc->sc_synctask[0].hdr, @@ -2764,7 +2769,6 @@ &sc->sc_synctask[1].hdr); } } - sc->sc_if_flags = ifp->if_flags; ZYD_UNLOCK(sc); if (startall) ieee80211_start_all(ic); ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_zydreg.h#8 (text+ko) ==== @@ -1274,7 +1274,6 @@ #define ZYD_FLAG_FWLOADED (1 << 0) #define ZYD_FLAG_INITONCE (1 << 1) #define ZYD_FLAG_INITDONE (1 << 2) - int sc_if_flags; struct zyd_task sc_synctask[2]; struct zyd_task sc_mcasttask[2];