Deleted Added
full compact
rt2661.c (190526) rt2661.c (190532)
1/* $FreeBSD: head/sys/dev/ral/rt2661.c 190526 2009-03-29 17:59:14Z sam $ */
1/* $FreeBSD: head/sys/dev/ral/rt2661.c 190532 2009-03-29 21:17:08Z sam $ */
2
3/*-
4 * Copyright (c) 2006
5 * Damien Bergamini <damien.bergamini@free.fr>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include <sys/cdefs.h>
2
3/*-
4 * Copyright (c) 2006
5 * Damien Bergamini <damien.bergamini@free.fr>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#include <sys/cdefs.h>
21__FBSDID("$FreeBSD: head/sys/dev/ral/rt2661.c 190526 2009-03-29 17:59:14Z sam $");
21__FBSDID("$FreeBSD: head/sys/dev/ral/rt2661.c 190532 2009-03-29 21:17:08Z sam $");
22
23/*-
24 * Ralink Technology RT2561, RT2561S and RT2661 chipset driver
25 * http://www.ralinktech.com/
26 */
27
28#include <sys/param.h>
29#include <sys/sysctl.h>

--- 18 unchanged lines hidden (view full) ---

48#include <net/if.h>
49#include <net/if_arp.h>
50#include <net/ethernet.h>
51#include <net/if_dl.h>
52#include <net/if_media.h>
53#include <net/if_types.h>
54
55#include <net80211/ieee80211_var.h>
22
23/*-
24 * Ralink Technology RT2561, RT2561S and RT2661 chipset driver
25 * http://www.ralinktech.com/
26 */
27
28#include <sys/param.h>
29#include <sys/sysctl.h>

--- 18 unchanged lines hidden (view full) ---

48#include <net/if.h>
49#include <net/if_arp.h>
50#include <net/ethernet.h>
51#include <net/if_dl.h>
52#include <net/if_media.h>
53#include <net/if_types.h>
54
55#include <net80211/ieee80211_var.h>
56#include <net80211/ieee80211_phy.h>
57#include <net80211/ieee80211_radiotap.h>
58#include <net80211/ieee80211_regdomain.h>
59#include <net80211/ieee80211_amrr.h>
60
61#include <netinet/in.h>
62#include <netinet/in_systm.h>
63#include <netinet/in_var.h>
64#include <netinet/ip.h>

--- 250 unchanged lines hidden (view full) ---

315 ic->ic_set_channel = rt2661_set_channel;
316 ic->ic_updateslot = rt2661_update_slot;
317 ic->ic_update_promisc = rt2661_update_promisc;
318 ic->ic_raw_xmit = rt2661_raw_xmit;
319
320 ic->ic_vap_create = rt2661_vap_create;
321 ic->ic_vap_delete = rt2661_vap_delete;
322
56#include <net80211/ieee80211_radiotap.h>
57#include <net80211/ieee80211_regdomain.h>
58#include <net80211/ieee80211_amrr.h>
59
60#include <netinet/in.h>
61#include <netinet/in_systm.h>
62#include <netinet/in_var.h>
63#include <netinet/ip.h>

--- 250 unchanged lines hidden (view full) ---

314 ic->ic_set_channel = rt2661_set_channel;
315 ic->ic_updateslot = rt2661_update_slot;
316 ic->ic_update_promisc = rt2661_update_promisc;
317 ic->ic_raw_xmit = rt2661_raw_xmit;
318
319 ic->ic_vap_create = rt2661_vap_create;
320 ic->ic_vap_delete = rt2661_vap_delete;
321
323 sc->sc_rates = ieee80211_get_ratetable(ic->ic_curchan);
324
325 bpfattach(ifp, DLT_IEEE802_11_RADIO,
326 sizeof (struct ieee80211_frame) + sizeof (sc->sc_txtap));
327
328 sc->sc_rxtap_len = sizeof sc->sc_rxtap;
329 sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
330 sc->sc_rxtap.wr_ihdr.it_present = htole32(RT2661_RX_RADIOTAP_PRESENT);
331
332 sc->sc_txtap_len = sizeof sc->sc_txtap;

--- 964 unchanged lines hidden (view full) ---

1297 */
1298 desc->qid = ac;
1299
1300 /* setup PLCP fields */
1301 desc->plcp_signal = rt2661_plcp_signal(rate);
1302 desc->plcp_service = 4;
1303
1304 len += IEEE80211_CRC_LEN;
322 bpfattach(ifp, DLT_IEEE802_11_RADIO,
323 sizeof (struct ieee80211_frame) + sizeof (sc->sc_txtap));
324
325 sc->sc_rxtap_len = sizeof sc->sc_rxtap;
326 sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
327 sc->sc_rxtap.wr_ihdr.it_present = htole32(RT2661_RX_RADIOTAP_PRESENT);
328
329 sc->sc_txtap_len = sizeof sc->sc_txtap;

--- 964 unchanged lines hidden (view full) ---

1294 */
1295 desc->qid = ac;
1296
1297 /* setup PLCP fields */
1298 desc->plcp_signal = rt2661_plcp_signal(rate);
1299 desc->plcp_service = 4;
1300
1301 len += IEEE80211_CRC_LEN;
1305 if (ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_OFDM) {
1302 if (ieee80211_rate2phytype(ic->ic_rt, rate) == IEEE80211_T_OFDM) {
1306 desc->flags |= htole32(RT2661_TX_OFDM);
1307
1308 plcp_length = len & 0xfff;
1309 desc->plcp_length_hi = plcp_length >> 6;
1310 desc->plcp_length_lo = plcp_length & 0x3f;
1311 } else {
1312 plcp_length = (16 * len + rate - 1) / rate;
1313 if (rate == 22) {

--- 69 unchanged lines hidden (view full) ---

1383 /* management frames are not taken into account for amrr */
1384 data->rix = IEEE80211_FIXED_RATE_NONE;
1385
1386 wh = mtod(m0, struct ieee80211_frame *);
1387
1388 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1389 flags |= RT2661_TX_NEED_ACK;
1390
1303 desc->flags |= htole32(RT2661_TX_OFDM);
1304
1305 plcp_length = len & 0xfff;
1306 desc->plcp_length_hi = plcp_length >> 6;
1307 desc->plcp_length_lo = plcp_length & 0x3f;
1308 } else {
1309 plcp_length = (16 * len + rate - 1) / rate;
1310 if (rate == 22) {

--- 69 unchanged lines hidden (view full) ---

1380 /* management frames are not taken into account for amrr */
1381 data->rix = IEEE80211_FIXED_RATE_NONE;
1382
1383 wh = mtod(m0, struct ieee80211_frame *);
1384
1385 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1386 flags |= RT2661_TX_NEED_ACK;
1387
1391 dur = ieee80211_ack_duration(sc->sc_rates,
1388 dur = ieee80211_ack_duration(ic->ic_rt,
1392 rate, ic->ic_flags & IEEE80211_F_SHPREAMBLE);
1393 *(uint16_t *)wh->i_dur = htole16(dur);
1394
1395 /* tell hardware to add timestamp in probe responses */
1396 if ((wh->i_fc[0] &
1397 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
1398 (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
1399 flags |= RT2661_TX_TIMESTAMP;

--- 33 unchanged lines hidden (view full) ---

1433 int nsegs;
1434
1435 KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
1436 ("protection %d", prot));
1437
1438 wh = mtod(m, const struct ieee80211_frame *);
1439 pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
1440
1389 rate, ic->ic_flags & IEEE80211_F_SHPREAMBLE);
1390 *(uint16_t *)wh->i_dur = htole16(dur);
1391
1392 /* tell hardware to add timestamp in probe responses */
1393 if ((wh->i_fc[0] &
1394 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
1395 (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
1396 flags |= RT2661_TX_TIMESTAMP;

--- 33 unchanged lines hidden (view full) ---

1430 int nsegs;
1431
1432 KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
1433 ("protection %d", prot));
1434
1435 wh = mtod(m, const struct ieee80211_frame *);
1436 pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
1437
1441 protrate = ieee80211_ctl_rate(sc->sc_rates, rate);
1442 ackrate = ieee80211_ack_rate(sc->sc_rates, rate);
1438 protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
1439 ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
1443
1444 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
1440
1441 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
1445 dur = ieee80211_compute_duration(sc->sc_rates, pktlen, rate, isshort)
1446 + ieee80211_ack_duration(sc->sc_rates, rate, isshort);
1442 dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
1443 + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
1447 flags = RT2661_TX_MORE_FRAG;
1448 if (prot == IEEE80211_PROT_RTSCTS) {
1449 /* NB: CTS is the same size as an ACK */
1444 flags = RT2661_TX_MORE_FRAG;
1445 if (prot == IEEE80211_PROT_RTSCTS) {
1446 /* NB: CTS is the same size as an ACK */
1450 dur += ieee80211_ack_duration(sc->sc_rates, rate, isshort);
1447 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
1451 flags |= RT2661_TX_NEED_ACK;
1452 mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
1453 } else {
1454 mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
1455 }
1456 if (mprot == NULL) {
1457 /* XXX stat + msg */
1458 return ENOBUFS;

--- 80 unchanged lines hidden (view full) ---

1539 }
1540
1541 flags = 0;
1542 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1543 int prot = IEEE80211_PROT_NONE;
1544 if (m0->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold)
1545 prot = IEEE80211_PROT_RTSCTS;
1546 else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
1448 flags |= RT2661_TX_NEED_ACK;
1449 mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
1450 } else {
1451 mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
1452 }
1453 if (mprot == NULL) {
1454 /* XXX stat + msg */
1455 return ENOBUFS;

--- 80 unchanged lines hidden (view full) ---

1536 }
1537
1538 flags = 0;
1539 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1540 int prot = IEEE80211_PROT_NONE;
1541 if (m0->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold)
1542 prot = IEEE80211_PROT_RTSCTS;
1543 else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
1547 ieee80211_rate2phytype(sc->sc_rates, rate) == IEEE80211_T_OFDM)
1544 ieee80211_rate2phytype(ic->ic_rt, rate) == IEEE80211_T_OFDM)
1548 prot = ic->ic_protmode;
1549 if (prot != IEEE80211_PROT_NONE) {
1550 error = rt2661_sendprot(sc, ac, m0, ni, prot, rate);
1551 if (error) {
1552 m_freem(m0);
1553 return error;
1554 }
1555 flags |= RT2661_TX_LONG_RETRY | RT2661_TX_IFS;

--- 54 unchanged lines hidden (view full) ---

1610 /* XXX probably need last rssi value and not avg */
1611 data->rssi = ic->ic_node_getrssi(ni);
1612 } else
1613 data->rix = IEEE80211_FIXED_RATE_NONE;
1614
1615 if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1616 flags |= RT2661_TX_NEED_ACK;
1617
1545 prot = ic->ic_protmode;
1546 if (prot != IEEE80211_PROT_NONE) {
1547 error = rt2661_sendprot(sc, ac, m0, ni, prot, rate);
1548 if (error) {
1549 m_freem(m0);
1550 return error;
1551 }
1552 flags |= RT2661_TX_LONG_RETRY | RT2661_TX_IFS;

--- 54 unchanged lines hidden (view full) ---

1607 /* XXX probably need last rssi value and not avg */
1608 data->rssi = ic->ic_node_getrssi(ni);
1609 } else
1610 data->rix = IEEE80211_FIXED_RATE_NONE;
1611
1612 if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1613 flags |= RT2661_TX_NEED_ACK;
1614
1618 dur = ieee80211_ack_duration(sc->sc_rates,
1615 dur = ieee80211_ack_duration(ic->ic_rt,
1619 rate, ic->ic_flags & IEEE80211_F_SHPREAMBLE);
1620 *(uint16_t *)wh->i_dur = htole16(dur);
1621 }
1622
1623 rt2661_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate, segs,
1624 nsegs, ac);
1625
1626 bus_dmamap_sync(txq->data_dmat, data->map, BUS_DMASYNC_PREWRITE);

--- 409 unchanged lines hidden (view full) ---

2036 const struct rfprog *rfprog;
2037 uint8_t bbp3, bbp94 = RT2661_BBPR94_DEFAULT;
2038 int8_t power;
2039 u_int i, chan;
2040
2041 chan = ieee80211_chan2ieee(ic, c);
2042 KASSERT(chan != 0 && chan != IEEE80211_CHAN_ANY, ("chan 0x%x", chan));
2043
1616 rate, ic->ic_flags & IEEE80211_F_SHPREAMBLE);
1617 *(uint16_t *)wh->i_dur = htole16(dur);
1618 }
1619
1620 rt2661_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate, segs,
1621 nsegs, ac);
1622
1623 bus_dmamap_sync(txq->data_dmat, data->map, BUS_DMASYNC_PREWRITE);

--- 409 unchanged lines hidden (view full) ---

2033 const struct rfprog *rfprog;
2034 uint8_t bbp3, bbp94 = RT2661_BBPR94_DEFAULT;
2035 int8_t power;
2036 u_int i, chan;
2037
2038 chan = ieee80211_chan2ieee(ic, c);
2039 KASSERT(chan != 0 && chan != IEEE80211_CHAN_ANY, ("chan 0x%x", chan));
2040
2044 sc->sc_rates = ieee80211_get_ratetable(c);
2045
2046 /* select the appropriate RF settings based on what EEPROM says */
2047 rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2;
2048
2049 /* find the settings for this channel (we know it exists) */
2050 for (i = 0; rfprog[i].chan != chan; i++);
2051
2052 power = sc->txpow[i];
2053 if (power < 0) {

--- 839 unchanged lines hidden ---
2041 /* select the appropriate RF settings based on what EEPROM says */
2042 rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2;
2043
2044 /* find the settings for this channel (we know it exists) */
2045 for (i = 0; rfprog[i].chan != chan; i++);
2046
2047 power = sc->txpow[i];
2048 if (power < 0) {

--- 839 unchanged lines hidden ---