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> |
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> |
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 |
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; |
1302 if (ieee80211_rate2phytype(ic->ic_rt, rate) == IEEE80211_T_OFDM) { |
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 |
1388 dur = ieee80211_ack_duration(ic->ic_rt, |
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 |
1438 protrate = ieee80211_ctl_rate(ic->ic_rt, rate); 1439 ackrate = ieee80211_ack_rate(ic->ic_rt, rate); |
1440 1441 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0; |
1442 dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort) 1443 + ieee80211_ack_duration(ic->ic_rt, rate, isshort); |
1444 flags = RT2661_TX_MORE_FRAG; 1445 if (prot == IEEE80211_PROT_RTSCTS) { 1446 /* NB: CTS is the same size as an ACK */ |
1447 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort); |
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) && |
1544 ieee80211_rate2phytype(ic->ic_rt, rate) == IEEE80211_T_OFDM) |
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 |
1615 dur = ieee80211_ack_duration(ic->ic_rt, |
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 |
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 --- |