From owner-freebsd-mobile Sat Mar 1 8:39:30 2003 Delivered-To: freebsd-mobile@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 40EB037B401 for ; Sat, 1 Mar 2003 08:39:26 -0800 (PST) Received: from harmony.village.org (rover.bsdimp.com [204.144.255.66]) by mx1.FreeBSD.org (Postfix) with ESMTP id 6FBAC43FBD for ; Sat, 1 Mar 2003 08:39:25 -0800 (PST) (envelope-from imp@bsdimp.com) Received: from localhost (warner@rover2.village.org [10.0.0.1]) by harmony.village.org (8.12.6/8.12.3) with ESMTP id h21GdO3Y036521 for ; Sat, 1 Mar 2003 09:39:24 -0700 (MST) (envelope-from imp@bsdimp.com) Date: Sat, 01 Mar 2003 09:39:10 -0700 (MST) Message-Id: <20030301.093910.15267989.imp@bsdimp.com> To: mobile@freebsd.org Subject: wi patch From: "M. Warner Losh" X-Mailer: Mew version 2.1 on Emacs 21.2 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Sender: owner-freebsd-mobile@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org These patches make my lucent cards almost useful They are in 1Mbps mode, it seems, but at least they work with a fair amount of reliability. Don't try to set the media just yet. They do two things. One, they remove the "I'm racing the hardware" junk in wi_intr. Instead, it disables and reenables interrupts in the ISR, like the old driver. This is a mix of my own work and a slight variation on Marcel's patch posted here. Second, it limits the number of fids to 1 for lucent cards (it remains 3 for prism cards). The old driver always used 1 fid for the cards. I can only imagine that 3 fids was done to make prism go faster. Well, it seems to massively destabilize the Lucent cards. Lemme know how this works for you. This takes my lucent card from paperweight to useful (I can tolerate 1mbps since my dsl line is only 640kbps). I've not used this driver with Prism 2, 2.5 or Symbol cards (I have no prism 3 cards). But all my lucent cards are rock solid reliable at 1Mbps. Warner --- //depot/user/imp/freebsd-imp/sys/dev/wi/if_wi.c 2003/02/26 22:20:41 +++ //depot/user/imp/newcard/dev/wi/if_wi.c 2003/03/01 05:27:50 @@ -347,6 +347,7 @@ */ switch (sc->sc_firmware_type) { case WI_LUCENT: + sc->sc_ntxbuf = 1; sc->sc_flags |= WI_FLAGS_HAS_SYSSCALE; #ifdef WI_HERMES_AUTOINC_WAR /* XXX: not confirmed, but never seen for recent firmware */ @@ -362,6 +363,7 @@ break; case WI_INTERSIL: + sc->sc_ntxbuf = WI_NTXBUF; sc->sc_flags |= WI_FLAGS_HAS_FRAGTHR; sc->sc_flags |= WI_FLAGS_HAS_ROAMING; sc->sc_flags |= WI_FLAGS_HAS_SYSSCALE; @@ -380,6 +382,7 @@ break; case WI_SYMBOL: + sc->sc_ntxbuf = 1; sc->sc_flags |= WI_FLAGS_HAS_DIVERSITY; if (sc->sc_sta_firmware_ver >= 25000) ic->ic_flags |= IEEE80211_F_HASIBSS; @@ -555,10 +558,10 @@ void wi_intr(void *arg) { - int i; struct wi_softc *sc = arg; struct ifnet *ifp = &sc->sc_ic.ic_if; - u_int16_t status, raw_status, last_status; + u_int16_t status; + int i; WI_LOCK_DECL(); WI_LOCK(sc); @@ -570,21 +573,14 @@ return; } - /* maximum 10 loops per interrupt */ - last_status = 0; - for (i = 0; i < 10; i++) { - /* - * Only believe a status bit when we enter wi_intr, or when - * the bit was "off" the last time through the loop. This is - * my strategy to avoid racing the hardware/firmware if I - * can re-read the event status register more quickly than - * it is updated. - */ - raw_status = CSR_READ_2(sc, WI_EVENT_STAT); - status = raw_status & ~last_status; + /* Disable interrupts. */ + CSR_WRITE_2(sc, WI_INT_EN, 0); + + /* maximum 100 loops per interrupt */ + for (i = 0; i < 100; i++) { + status = CSR_READ_2(sc, WI_EVENT_STAT); if ((status & WI_INTRS) == 0) break; - last_status = raw_status; if (status & WI_EV_RX) wi_rx_intr(sc); @@ -604,6 +600,9 @@ wi_start(ifp); } + /* Re-enable interrupts. */ + CSR_WRITE_2(sc, WI_INT_EN, WI_INTRS); + WI_UNLOCK(sc); return; @@ -728,7 +727,7 @@ sc->sc_buflen = IEEE80211_MAX_LEN + sizeof(struct wi_frame); if (sc->sc_firmware_type == WI_SYMBOL) sc->sc_buflen = 1585; /* XXX */ - for (i = 0; i < WI_NTXBUF; i++) { + for (i = 0; i < sc->sc_ntxbuf; i++) { error = wi_alloc_fid(sc, sc->sc_buflen, &sc->sc_txd[i].d_fid); if (error) { @@ -949,7 +948,7 @@ sc->sc_tx_timer = 5; ifp->if_timer = 1; } - sc->sc_txnext = cur = (cur + 1) % WI_NTXBUF; + sc->sc_txnext = cur = (cur + 1) % sc->sc_ntxbuf; } WI_UNLOCK(sc); @@ -1468,7 +1467,7 @@ } sc->sc_tx_timer = 0; sc->sc_txd[cur].d_len = 0; - sc->sc_txcur = cur = (cur + 1) % WI_NTXBUF; + sc->sc_txcur = cur = (cur + 1) % sc->sc_ntxbuf; if (sc->sc_txd[cur].d_len == 0) ifp->if_flags &= ~IFF_OACTIVE; else { --- //depot/user/imp/freebsd-imp/sys/dev/wi/if_wivar.h 2003/01/16 15:19:13 +++ //depot/user/imp/newcard/dev/wi/if_wivar.h 2003/02/28 23:16:30 @@ -119,6 +119,7 @@ char sc_net_name[IEEE80211_NWID_LEN]; int sc_buflen; /* TX buffer size */ + int sc_ntxbuf; #define WI_NTXBUF 3 struct { int d_fid; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-mobile" in the body of the message