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 --- |