From owner-p4-projects@FreeBSD.ORG Sat Jun 6 06:29:09 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 6ABD61065676; Sat, 6 Jun 2009 06:29:09 +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 0D75C1065673 for ; Sat, 6 Jun 2009 06:29:09 +0000 (UTC) (envelope-from thompsa@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id EE28C8FC28 for ; Sat, 6 Jun 2009 06:29:08 +0000 (UTC) (envelope-from thompsa@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 n566T89f049689 for ; Sat, 6 Jun 2009 06:29:08 GMT (envelope-from thompsa@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n566T8CJ049687 for perforce@freebsd.org; Sat, 6 Jun 2009 06:29:08 GMT (envelope-from thompsa@freebsd.org) Date: Sat, 6 Jun 2009 06:29:08 GMT Message-Id: <200906060629.n566T8CJ049687@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to thompsa@freebsd.org using -f From: Andrew Thompson To: Perforce Change Reviews Cc: Subject: PERFORCE change 163633 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: Sat, 06 Jun 2009 06:29:10 -0000 http://perforce.freebsd.org/chv.cgi?CH=163633 Change 163633 by thompsa@thompsa_burger on 2009/06/06 06:28:30 Remove rum_tx_data and the tx array, it is no longer needed. Affected files ... .. //depot/projects/usb_buf/src/sys/dev/usb/wlan/if_rum.c#11 edit .. //depot/projects/usb_buf/src/sys/dev/usb/wlan/if_rumvar.h#7 edit Differences ... ==== //depot/projects/usb_buf/src/sys/dev/usb/wlan/if_rum.c#11 (text+ko) ==== @@ -154,9 +154,6 @@ int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t mac[IEEE80211_ADDR_LEN]); static void rum_vap_delete(struct ieee80211vap *); -static void rum_tx_free(struct rum_tx_data *, int); -static void rum_alloc_tx_list(struct rum_softc *); -static void rum_free_tx_list(struct rum_softc *); static int rum_newstate(struct ieee80211vap *, enum ieee80211_state, int); static void rum_setup_tx_desc(struct rum_softc *, @@ -168,7 +165,7 @@ struct ieee80211_node *, const struct ieee80211_bpf_params *); static int rum_tx_data(struct rum_softc *, struct mbuf *, - struct ieee80211_node *); + struct ieee80211_node *, struct usb_urb *); static void rum_start(struct ifnet *); static int rum_ioctl(struct ifnet *, u_long, caddr_t); static void rum_eeprom_read(struct rum_softc *, uint16_t, void *, @@ -550,11 +547,6 @@ /* stop all USB transfers */ usb_pipe_close(sc->sc_xfer, RUM_N_TRANSFER); - /* free TX list, if any */ - RUM_LOCK(sc); - rum_free_tx_list(sc); - RUM_UNLOCK(sc); - if (ifp) { ic = ifp->if_l2com; ieee80211_ifdetach(ic); @@ -637,72 +629,6 @@ free(rvp, M_80211_VAP); } -static void -rum_tx_free(struct rum_tx_data *data, int txerr) -{ - struct rum_softc *sc = data->sc; - - if (data->m != NULL) { - if (data->m->m_flags & M_TXCB) - ieee80211_process_callback(data->ni, data->m, - txerr ? ETIMEDOUT : 0); - m_freem(data->m); - data->m = NULL; - - ieee80211_free_node(data->ni); - data->ni = NULL; - } - usb_init_urb(data->urb); /* reset state */ - urb_list_insert(&sc->tx_free, data->urb); -} - -static void -rum_alloc_tx_list(struct rum_softc *sc) -{ - struct rum_tx_data *data; - int i; - - urb_list_init(&sc->tx_free); - - for (i = 0; i < RUM_TX_LIST_COUNT; i++) { - data = &sc->tx_data[i]; - - data->sc = sc; - data->urb = usb_get_urb(sc->sc_xfer[RUM_BULK_WR], 0); - KASSERT(data->urb != NULL, ("usb_get_urb failed")); - urb_set_priv(data->urb, data); - urb_list_insert(&sc->tx_free, data->urb); - } -} - -static void -rum_free_tx_list(struct rum_softc *sc) -{ - struct rum_tx_data *data; - int i; - - /* free up all node references and mbufs */ - for (i = 0; i < RUM_TX_LIST_COUNT; i++) { - data = &sc->tx_data[i]; - - if (data->m != NULL) { - m_freem(data->m); - data->m = NULL; - } - if (data->ni != NULL) { - ieee80211_free_node(data->ni); - data->ni = NULL; - } - if (data->urb != NULL) { - urb_list_remove(&sc->tx_free, data->urb); - usb_free_urb(data->urb); - data->urb = NULL; - } - } - if (sc->tx_free.count != 0) - printf("leaked %d urbs\n", sc->tx_free.count); -} - static int rum_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) { @@ -771,17 +697,21 @@ { struct rum_softc *sc = urb_get_softc(urb); struct ifnet *ifp = sc->sc_ifp; - struct rum_tx_data *data; + struct ieee80211_node *ni; + struct mbuf *m; int len; urb_get_status(urb, NULL, NULL, &len, NULL); DPRINTFN(11, "transfer complete, %d bytes\n", len); /* free resources */ - data = urb_get_priv(urb); - RUM_LOCK(sc); - rum_tx_free(data, 0); - RUM_UNLOCK(sc); + m = urb_get_priv(urb); + ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; + if (m->m_flags & M_TXCB) + ieee80211_process_callback(ni, m, error ? ETIMEDOUT : 0); + m_freem(m); + ieee80211_free_node(ni); + usb_free_urb(urb); if (error) { if (error == USB_ERR_CANCELLED) @@ -951,7 +881,6 @@ struct ieee80211com *ic = ni->ni_ic; struct ieee80211vap *vap; const struct ieee80211_frame *wh; - struct rum_tx_data *data; struct rum_tx_desc *desc; struct usb_urb *urb; struct mbuf *mprot; @@ -984,19 +913,19 @@ /* XXX stat + msg */ return (ENOBUFS); } - urb = urb_list_dequeue(&sc->tx_free); - data = urb_get_priv(urb); + urb = usb_get_urb(sc->sc_xfer[RUM_BULK_WR], 0); + if (urb == NULL) { + m_freem(mprot); + return EINVAL; + } - urb_get_status(urb, (void **)&data->buf, &xferlen, NULL, NULL); - if (xferlen < m->m_pkthdr.len + RT2573_TX_DESC_SIZE) { - urb_list_insert(&sc->tx_free, urb); + urb_get_status(urb, (void **)&desc, &xferlen, NULL, NULL); + if (xferlen < mprot->m_pkthdr.len + RT2573_TX_DESC_SIZE) { + usb_free_urb(urb); return EINVAL; } - desc = (struct rum_tx_desc *)data->buf; - data->m = mprot; - data->ni = ieee80211_ref_node(ni); - + ni = ieee80211_ref_node(ni); vap = ni->ni_vap; if (ieee80211_radiotap_active_vap(vap)) { struct rum_tx_radiotap_header *tap = &sc->sc_txtap; @@ -1008,15 +937,16 @@ ieee80211_radiotap_tx(vap, mprot); } - m_copydata(mprot, 0, mprot->m_pkthdr.len, - data->buf + RT2573_TX_DESC_SIZE); + m_copydata(mprot, 0, mprot->m_pkthdr.len, (caddr_t)(desc + 1)); rum_setup_tx_desc(sc, desc, flags, 0, mprot->m_pkthdr.len, protrate); DPRINTFN(10, "sending prot frame len=%d rate=%d\n", - m->m_pkthdr.len + (int)RT2573_TX_DESC_SIZE, rate); + mprot->m_pkthdr.len + (int)RT2573_TX_DESC_SIZE, rate); /* NB: no roundup necessary */ urb_set_framelen(urb, 0, RT2573_TX_DESC_SIZE + mprot->m_pkthdr.len); + urb_set_priv(urb, mprot); + mprot->m_pkthdr.rcvif = (void *)ni; usb_submit_urb(urb); return 0; @@ -1028,7 +958,6 @@ struct ieee80211vap *vap = ni->ni_vap; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct rum_tx_data *data; struct rum_tx_desc *desc; struct usb_urb *urb; struct ieee80211_frame *wh; @@ -1040,9 +969,6 @@ RUM_LOCK_ASSERT(sc, MA_OWNED); - urb = urb_list_dequeue(&sc->tx_free); - data = urb_get_priv(urb); - wh = mtod(m0, struct ieee80211_frame *); if (wh->i_fc[1] & IEEE80211_FC1_WEP) { k = ieee80211_crypto_encap(ni, m0); @@ -1069,17 +995,19 @@ flags |= RT2573_TX_TIMESTAMP; } - urb_get_status(urb, (void **)&data->buf, &xferlen, NULL, NULL); + urb = usb_get_urb(sc->sc_xfer[RUM_BULK_WR], 0); + if (urb == NULL) { + m_freem(m0); + return EINVAL; + } + + urb_get_status(urb, (void **)&desc, &xferlen, NULL, NULL); if (xferlen < m0->m_pkthdr.len + RT2573_TX_DESC_SIZE) { - urb_list_insert(&sc->tx_free, urb); + usb_free_urb(urb); m_freem(m0); return EINVAL; } - desc = (struct rum_tx_desc *)data->buf; - data->m = m0; - data->ni = ni; - if (ieee80211_radiotap_active_vap(vap)) { struct rum_tx_radiotap_header *tap = &sc->sc_txtap; @@ -1090,7 +1018,7 @@ ieee80211_radiotap_tx(vap, m0); } - m_copydata(m0, 0, m0->m_pkthdr.len, data->buf + RT2573_TX_DESC_SIZE); + m_copydata(m0, 0, m0->m_pkthdr.len, (caddr_t)(desc + 1)); rum_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, tp->mgmtrate); /* align end on a 4-bytes boundary */ @@ -1107,6 +1035,8 @@ m0->m_pkthdr.len + (int)RT2573_TX_DESC_SIZE, tp->mgmtrate, xferlen); urb_set_framelen(urb, 0, xferlen); + urb_set_priv(urb, m0); + m0->m_pkthdr.rcvif = (void *)ni; usb_submit_urb(urb); return (0); @@ -1118,7 +1048,6 @@ { struct ieee80211com *ic = ni->ni_ic; struct ieee80211vap *vap; - struct rum_tx_data *data; struct rum_tx_desc *desc; struct usb_urb *urb; uint32_t flags; @@ -1140,19 +1069,22 @@ params->ibp_flags & IEEE80211_BPF_RTS ? IEEE80211_PROT_RTSCTS : IEEE80211_PROT_CTSONLY, rate); - if (error || sc->tx_free.count == 0) { + if (error) { m_freem(m0); return ENOBUFS; } flags |= RT2573_TX_LONG_RETRY | RT2573_TX_IFS_SIFS; } - urb = urb_list_dequeue(&sc->tx_free); - data = urb_get_priv(urb); + urb = usb_get_urb(sc->sc_xfer[RUM_BULK_WR], 0); + if (urb == NULL) { + m_freem(m0); + return EINVAL; + } - urb_get_status(urb, (void **)&data->buf, &xferlen, NULL, NULL); + urb_get_status(urb, (void **)&desc, &xferlen, NULL, NULL); if (xferlen < m0->m_pkthdr.len + RT2573_TX_DESC_SIZE) { - urb_list_insert(&sc->tx_free, urb); + usb_free_urb(urb); m_freem(m0); return EINVAL; } @@ -1168,12 +1100,7 @@ ieee80211_radiotap_tx(vap, m0); } - desc = (struct rum_tx_desc *)data->buf; - data->m = m0; - data->ni = ni; - - m_copydata(m0, 0, m0->m_pkthdr.len, data->buf + RT2573_TX_DESC_SIZE); - /* XXX need to setup descriptor ourself */ + m_copydata(m0, 0, m0->m_pkthdr.len, (caddr_t)(desc + 1)); rum_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate); /* align end on a 4-bytes boundary */ @@ -1190,20 +1117,21 @@ m0->m_pkthdr.len, rate, xferlen); urb_set_framelen(urb, 0, xferlen); + urb_set_priv(urb, m0); + m0->m_pkthdr.rcvif = (void *)ni; usb_submit_urb(urb); return 0; } static int -rum_tx_data(struct rum_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) +rum_tx_data(struct rum_softc *sc, struct mbuf *m0, struct ieee80211_node *ni, + struct usb_urb *urb) { struct ieee80211vap *vap = ni->ni_vap; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; - struct rum_tx_data *data; struct rum_tx_desc *desc; - struct usb_urb *urb; struct ieee80211_frame *wh; const struct ieee80211_txparam *tp; struct ieee80211_key *k; @@ -1243,7 +1171,7 @@ prot = ic->ic_protmode; if (prot != IEEE80211_PROT_NONE) { error = rum_sendprot(sc, m0, ni, prot, rate); - if (error || sc->tx_free.count == 0) { + if (error) { m_freem(m0); return ENOBUFS; } @@ -1251,20 +1179,12 @@ } } - urb = urb_list_dequeue(&sc->tx_free); - data = urb_get_priv(urb); - - urb_get_status(urb, (void **)&data->buf, &xferlen, NULL, NULL); + urb_get_status(urb, (void **)&desc, &xferlen, NULL, NULL); if (xferlen < m0->m_pkthdr.len + RT2573_TX_DESC_SIZE) { - urb_list_insert(&sc->tx_free, urb); m_freem(m0); return EINVAL; } - desc = (struct rum_tx_desc *)data->buf; - data->m = m0; - data->ni = ni; - if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { flags |= RT2573_TX_NEED_ACK; flags |= RT2573_TX_MORE_FRAG; @@ -1284,7 +1204,7 @@ ieee80211_radiotap_tx(vap, m0); } - m_copydata(m0, 0, m0->m_pkthdr.len, data->buf + RT2573_TX_DESC_SIZE); + m_copydata(m0, 0, m0->m_pkthdr.len, (caddr_t)(desc + 1)); rum_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate); /* align end on a 4-bytes boundary */ @@ -1295,6 +1215,7 @@ m0->m_pkthdr.len + (int)RT2573_TX_DESC_SIZE, rate, xferlen); urb_set_framelen(urb, 0, xferlen); + urb_set_priv(urb, m0); usb_submit_urb(urb); return 0; @@ -1304,6 +1225,7 @@ rum_start(struct ifnet *ifp) { struct rum_softc *sc = ifp->if_softc; + struct usb_urb *urb; struct ieee80211_node *ni; struct mbuf *m; @@ -1316,13 +1238,15 @@ IFQ_DRV_DEQUEUE(&ifp->if_snd, m); if (m == NULL) break; - if (sc->tx_free.count < RUM_TX_MINFREE) { + urb = usb_get_urb(sc->sc_xfer[RUM_BULK_WR], 0); + if (urb == NULL) { IFQ_DRV_PREPEND(&ifp->if_snd, m); ifp->if_drv_flags |= IFF_DRV_OACTIVE; break; } ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; - if (rum_tx_data(sc, m, ni) != 0) { + if (rum_tx_data(sc, m, ni, urb) != 0) { + usb_free_urb(urb); ieee80211_free_node(ni); ifp->if_oerrors++; break; @@ -2025,11 +1949,6 @@ /* initialize ASIC */ rum_write(sc, RT2573_MAC_CSR1, 4); - /* - * Allocate Tx and Rx xfer queues. - */ - rum_alloc_tx_list(sc); - /* update Rx filter */ tmp = rum_read(sc, RT2573_TXRX_CSR0) & 0xffff; @@ -2101,8 +2020,6 @@ usb_pipe_halt(sc->sc_xfer[RUM_BULK_WR]); usb_pipe_halt(sc->sc_xfer[RUM_BULK_RD]); - rum_free_tx_list(sc); - /* disable Rx */ tmp = rum_read(sc, RT2573_TXRX_CSR0); rum_write(sc, RT2573_TXRX_CSR0, tmp | RT2573_DISABLE_RX); @@ -2190,13 +2107,6 @@ ieee80211_free_node(ni); return ENETDOWN; } - if (sc->tx_free.count < RUM_TX_MINFREE) { - ifp->if_drv_flags |= IFF_DRV_OACTIVE; - RUM_UNLOCK(sc); - m_freem(m); - ieee80211_free_node(ni); - return EIO; - } ifp->if_opackets++; ==== //depot/projects/usb_buf/src/sys/dev/usb/wlan/if_rumvar.h#7 (text+ko) ==== @@ -58,17 +58,6 @@ struct rum_softc; -struct rum_tx_data { - STAILQ_ENTRY(rum_tx_data) next; - struct rum_softc *sc; - struct usb_urb *urb; - struct mbuf *m; - struct ieee80211_node *ni; - uint8_t *buf; - //int rate; -}; -typedef STAILQ_HEAD(, rum_tx_data) rum_txdhead; - struct rum_node { struct ieee80211_node ni; struct ieee80211_amrr_node amn; @@ -97,17 +86,14 @@ struct ifnet *sc_ifp; device_t sc_dev; struct usb_device *sc_udev; + struct mtx sc_mtx; + - struct usb_pipe *sc_xfer[RUM_N_TRANSFER]; + struct usb_pipe *sc_xfer[RUM_N_TRANSFER]; uint8_t rf_rev; uint8_t rffreq; - struct rum_tx_data tx_data[RUM_TX_LIST_COUNT]; - usb_urb_list tx_free; - - struct mtx sc_mtx; - uint32_t sta[6]; uint32_t rf_regs[4]; uint8_t txpow[44];