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