PERFORCE change 163633 for review

Andrew Thompson thompsa at FreeBSD.org
Sat Jun 6 06:29:10 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=163633

Change 163633 by thompsa at 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];


More information about the p4-projects mailing list