From owner-p4-projects@FreeBSD.ORG Mon Jan 14 23:16:56 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 71C9616A46B; Mon, 14 Jan 2008 23:16:56 +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 3616716A419 for ; Mon, 14 Jan 2008 23:16:56 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 1DC6113C459 for ; Mon, 14 Jan 2008 23:16:56 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0ENGumL071114 for ; Mon, 14 Jan 2008 23:16:56 GMT (envelope-from sephe@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0ENGtOr071111 for perforce@freebsd.org; Mon, 14 Jan 2008 23:16:55 GMT (envelope-from sephe@FreeBSD.org) Date: Mon, 14 Jan 2008 23:16:55 GMT Message-Id: <200801142316.m0ENGtOr071111@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sephe@FreeBSD.org using -f From: Sepherosa Ziehau To: Perforce Change Reviews Cc: Subject: PERFORCE change 133282 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: Mon, 14 Jan 2008 23:16:56 -0000 http://perforce.freebsd.org/chv.cgi?CH=133282 Change 133282 by sephe@sephe_zealot:sam_wifi on 2008/01/14 23:16:28 - Expose ieee80211_{ack_duration,compute_duration,rate2phytype}(), add more assertion in ieee80211_{ack_duration,rate2phytype}() - Use these functions in rt2661 part of ral(4) - Adjust indentation style in ieee80211_phy.h according to the rest of header files in sys/net80211 Affected files ... .. //depot/projects/wifi/sys/dev/ral/rt2661.c#22 edit .. //depot/projects/wifi/sys/net80211/ieee80211_phy.c#5 edit .. //depot/projects/wifi/sys/net80211/ieee80211_phy.h#2 edit Differences ... ==== //depot/projects/wifi/sys/dev/ral/rt2661.c#22 (text) ==== @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -106,11 +107,9 @@ static void rt2661_mcu_beacon_expire(struct rt2661_softc *); static void rt2661_mcu_wakeup(struct rt2661_softc *); static void rt2661_mcu_cmd_intr(struct rt2661_softc *); -static int rt2661_ack_rate(struct ieee80211com *, int); static void rt2661_scan_start(struct ieee80211com *); static void rt2661_scan_end(struct ieee80211com *); static void rt2661_set_channel(struct ieee80211com *); -static uint16_t rt2661_txtime(int, int, uint32_t); static uint8_t rt2661_rxrate(struct rt2661_rx_desc *); static uint8_t rt2661_plcp_signal(int); static void rt2661_setup_tx_desc(struct rt2661_softc *, @@ -1266,14 +1265,6 @@ RAL_UNLOCK(sc); } -/* quickly determine if a given rate is CCK or OFDM */ -#define RAL_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) - -#define RAL_ACK_SIZE 14 /* 10 + 4(FCS) */ -#define RAL_CTS_SIZE 14 /* 10 + 4(FCS) */ - -#define RAL_SIFS 10 /* us */ - /* * This function is only used by the Rx radiotap code. It returns the rate at * which a given frame was received. @@ -1306,66 +1297,6 @@ return 2; /* should not get there */ } -/* - * Return the expected ack rate for a frame transmitted at rate `rate'. - * XXX: this should depend on the destination node basic rate set. - */ -static int -rt2661_ack_rate(struct ieee80211com *ic, int rate) -{ - switch (rate) { - /* CCK rates */ - case 2: - return 2; - case 4: - case 11: - case 22: - return (ic->ic_curmode == IEEE80211_MODE_11B) ? 4 : rate; - - /* OFDM rates */ - case 12: - case 18: - return 12; - case 24: - case 36: - return 24; - case 48: - case 72: - case 96: - case 108: - return 48; - } - - /* default to 1Mbps */ - return 2; -} - -/* - * Compute the duration (in us) needed to transmit `len' bytes at rate `rate'. - * The function automatically determines the operating mode depending on the - * given rate. `flags' indicates whether short preamble is in use or not. - */ -static uint16_t -rt2661_txtime(int len, int rate, uint32_t flags) -{ - uint16_t txtime; - - if (RAL_RATE_IS_OFDM(rate)) { - /* IEEE Std 802.11a-1999, pp. 37 */ - txtime = (8 + 4 * len + 3 + rate - 1) / rate; - txtime = 16 + 4 + 4 * txtime + 6; - } else { - /* IEEE Std 802.11b-1999, pp. 28 */ - txtime = (16 * len + rate - 1) / rate; - if (rate != 2 && (flags & IEEE80211_F_SHPREAMBLE)) - txtime += 72 + 24; - else - txtime += 144 + 48; - } - - return txtime; -} - static uint8_t rt2661_plcp_signal(int rate) { @@ -1425,7 +1356,8 @@ desc->plcp_service = 4; len += IEEE80211_CRC_LEN; - if (RAL_RATE_IS_OFDM(rate)) { + if (ieee80211_rate2phytype(ic->ic_curchan->ic_rt, rate) == + IEEE80211_T_OFDM) { desc->flags |= htole32(RT2661_TX_OFDM); plcp_length = len & 0xfff; @@ -1511,8 +1443,8 @@ if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { flags |= RT2661_TX_NEED_ACK; - dur = rt2661_txtime(RAL_ACK_SIZE, rate, ic->ic_flags) + - RAL_SIFS; + dur = ieee80211_ack_duration(ic->ic_curchan->ic_rt, + rate, ic->ic_flags); *(uint16_t *)wh->i_dur = htole16(dur); /* tell hardware to add timestamp in probe responses */ @@ -1632,16 +1564,17 @@ m0->m_pkthdr.len > ic->ic_rtsthreshold) { struct mbuf *m; uint16_t dur; - int rtsrate, ackrate; + int rtsrate; rtsrate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2; - ackrate = rt2661_ack_rate(ic, rate); - dur = rt2661_txtime(m0->m_pkthdr.len + 4, rate, ic->ic_flags) + - rt2661_txtime(RAL_CTS_SIZE, rtsrate, ic->ic_flags) + - /* XXX: noack (QoS)? */ - rt2661_txtime(RAL_ACK_SIZE, ackrate, ic->ic_flags) + - 3 * RAL_SIFS; + dur = ieee80211_ack_duration(ic->ic_curchan->ic_rt, + rtsrate, ic->ic_flags) + + ieee80211_compute_duration(ic->ic_curchan->ic_rt, + m0->m_pkthdr.len + IEEE80211_CRC_LEN, rate, + ic->ic_flags) + + ieee80211_ack_duration(ic->ic_curchan->ic_rt, + rate, ic->ic_flags); m = rt2661_get_rts(sc, wh, dur); @@ -1744,8 +1677,8 @@ if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) { flags |= RT2661_TX_NEED_ACK; - dur = rt2661_txtime(RAL_ACK_SIZE, rt2661_ack_rate(ic, rate), - ic->ic_flags) + RAL_SIFS; + dur = ieee80211_ack_duration(ic->ic_curchan->ic_rt, rate, + ic->ic_flags); *(uint16_t *)wh->i_dur = htole16(dur); } ==== //depot/projects/wifi/sys/net80211/ieee80211_phy.c#5 (text+ko) ==== @@ -98,8 +98,6 @@ #ifdef notyet uint8_t ieee80211_plcp2rate(uint8_t, int); -enum ieee80211_phytype ieee80211_rate2phytype( - const struct ieee80211_rate_table *, uint8_t rate); uint8_t ieee80211_ack_rate(const struct ieee80211_rate_table *, uint8_t rate); #endif /* notyet */ @@ -236,8 +234,6 @@ #undef XR static void ieee80211_setup_ratetable(struct ieee80211_rate_table *); -static uint16_t ieee80211_compute_duration(const struct ieee80211_rate_table *, - uint32_t frameLen, uint16_t rate, int flags); /* Setup all rate tables */ void @@ -394,12 +390,6 @@ return 0; } -enum ieee80211_phytype -ieee80211_rate2phytype(const struct ieee80211_rate_table *rt, uint8_t rate) -{ - return rt->info[rt->rateCodeToIndex[rate]].phy; -} - uint8_t ieee80211_ack_rate(const struct ieee80211_rate_table *rt, uint8_t rate) { @@ -409,12 +399,45 @@ #endif /* notyet */ +enum ieee80211_phytype +ieee80211_rate2phytype(const struct ieee80211_rate_table *rt, uint8_t rate) +{ + uint8_t rix = rt->rateCodeToIndex[rate]; + + KASSERT(rix != (uint8_t)-1, ("rate %d has no info", rate)); + return rt->info[rix].phy; +} + /* + * Calculate duration field for + * o non-fragment data frames + * o management frames + * sent using rate, phy and short preamble setting. + */ +uint16_t +ieee80211_ack_duration(const struct ieee80211_rate_table *rt, + uint8_t rate, int flags) +{ + uint8_t rix = rt->rateCodeToIndex[rate]; + + KASSERT(rix != (uint8_t)-1, ("rate %d has no info", rate)); + if (flags & IEEE80211_F_SHPREAMBLE) { + KASSERT(rt->info[rix].spAckDuration != 0, + ("shpreamble ack dur is not computed!\n")); + return rt->info[rix].spAckDuration; + } else { + KASSERT(rt->info[rix].lpAckDuration != 0, + ("lgpreamble ack dur is not computed!\n")); + return rt->info[rix].lpAckDuration; + } +} + +/* * Compute the time to transmit a frame of length frameLen bytes * using the specified rate, phy, and short preamble setting. * SIFS is included. */ -static uint16_t +uint16_t ieee80211_compute_duration(const struct ieee80211_rate_table *rt, uint32_t frameLen, uint16_t rate, int flags) { ==== //depot/projects/wifi/sys/net80211/ieee80211_phy.h#2 (text+ko) ==== @@ -33,9 +33,17 @@ struct ieee80211_rate_table; struct ieee80211_channel; +/* Initialization functions */ void ieee80211_phy_init(void); -const struct ieee80211_rate_table * - ieee80211_get_ratetable(struct ieee80211_channel *); +const struct ieee80211_rate_table *ieee80211_get_ratetable( + struct ieee80211_channel *); + +uint16_t ieee80211_ack_duration(const struct ieee80211_rate_table *, + uint8_t, int); +uint16_t ieee80211_compute_duration(const struct ieee80211_rate_table *, + uint32_t, uint16_t, int); +enum ieee80211_phytype ieee80211_rate2phytype( + const struct ieee80211_rate_table *, uint8_t); #endif /* _KERNEL */