Add support for Ralink RT2800/RT3000 chipsets.

Thanks to ray@, Sevan and Sergey Dyatko for feedback and testing!

Obtained from:	OpenBSD
MFC after:	3 weeks
This commit is contained in:
Bernhard Schmidt 2012-05-10 17:41:16 +00:00
parent d0cea659af
commit 4310d6deb2
6 changed files with 5619 additions and 4 deletions

View File

@ -1759,6 +1759,7 @@ dev/puc/pucdata.c optional puc pci
dev/quicc/quicc_core.c optional quicc
dev/ral/rt2560.c optional ral
dev/ral/rt2661.c optional ral
dev/ral/rt2860.c optional ral
dev/ral/if_ral_pci.c optional ral pci
rt2561fw.c optional rt2561fw | ralfw \
compile-with "${AWK} -f $S/tools/fw_stub.awk rt2561.fw:rt2561fw -mrt2561 -c${.TARGET}" \

View File

@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
#include <dev/ral/rt2560var.h>
#include <dev/ral/rt2661var.h>
#include <dev/ral/rt2860var.h>
MODULE_DEPEND(ral, pci, 1, 1, 1);
MODULE_DEPEND(ral, firmware, 1, 1, 1);
@ -70,11 +71,37 @@ struct ral_pci_ident {
};
static const struct ral_pci_ident ral_pci_ids[] = {
{ 0x1432, 0x7708, "Edimax RT2860" },
{ 0x1432, 0x7711, "Edimax RT3591" },
{ 0x1432, 0x7722, "Edimax RT3591" },
{ 0x1432, 0x7727, "Edimax RT2860" },
{ 0x1432, 0x7728, "Edimax RT2860" },
{ 0x1432, 0x7738, "Edimax RT2860" },
{ 0x1432, 0x7748, "Edimax RT2860" },
{ 0x1432, 0x7758, "Edimax RT2860" },
{ 0x1432, 0x7768, "Edimax RT2860" },
{ 0x1462, 0x891a, "MSI RT3090" },
{ 0x1814, 0x0201, "Ralink Technology RT2560" },
{ 0x1814, 0x0301, "Ralink Technology RT2561S" },
{ 0x1814, 0x0302, "Ralink Technology RT2561" },
{ 0x1814, 0x0401, "Ralink Technology RT2661" },
{ 0x1814, 0x0601, "Ralink Technology RT2860" },
{ 0x1814, 0x0681, "Ralink Technology RT2890" },
{ 0x1814, 0x0701, "Ralink Technology RT2760" },
{ 0x1814, 0x0781, "Ralink Technology RT2790" },
{ 0x1814, 0x3060, "Ralink Technology RT3060" },
{ 0x1814, 0x3062, "Ralink Technology RT3062" },
{ 0x1814, 0x3090, "Ralink Technology RT3090" },
{ 0x1814, 0x3091, "Ralink Technology RT3091" },
{ 0x1814, 0x3092, "Ralink Technology RT3092" },
{ 0x1814, 0x3390, "Ralink Technology RT3390" },
{ 0x1814, 0x3562, "Ralink Technology RT3562" },
{ 0x1814, 0x3592, "Ralink Technology RT3592" },
{ 0x1814, 0x3593, "Ralink Technology RT3593" },
{ 0x1814, 0x5390, "Ralink Technology RT5390" },
{ 0x1814, 0x539a, "Ralink Technology RT5390" },
{ 0x1814, 0x539f, "Ralink Technology RT5390" },
{ 0x1a3b, 0x1059, "AWT RT2890" },
{ 0, 0, NULL }
};
@ -101,12 +128,20 @@ static struct ral_opns {
rt2661_suspend,
rt2661_resume,
rt2661_intr
}, ral_rt2860_opns = {
rt2860_attach,
rt2860_detach,
rt2860_shutdown,
rt2860_suspend,
rt2860_resume,
rt2860_intr
};
struct ral_pci_softc {
union {
struct rt2560_softc sc_rt2560;
struct rt2661_softc sc_rt2661;
struct rt2860_softc sc_rt2860;
} u;
struct ral_opns *sc_opns;
@ -180,8 +215,19 @@ ral_pci_attach(device_t dev)
/* enable bus-mastering */
pci_enable_busmaster(dev);
psc->sc_opns = (pci_get_device(dev) == 0x0201) ? &ral_rt2560_opns :
&ral_rt2661_opns;
switch (pci_get_device(dev)) {
case 0x0201:
psc->sc_opns = &ral_rt2560_opns;
break;
case 0x0301:
case 0x0302:
case 0x0401:
psc->sc_opns = &ral_rt2661_opns;
break;
default:
psc->sc_opns = &ral_rt2860_opns;
break;
}
psc->mem_rid = RAL_PCI_BAR0;
psc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &psc->mem_rid,

4103
sys/dev/ral/rt2860.c Normal file

File diff suppressed because it is too large Load Diff

1255
sys/dev/ral/rt2860reg.h Normal file

File diff suppressed because it is too large Load Diff

210
sys/dev/ral/rt2860var.h Normal file
View File

@ -0,0 +1,210 @@
/*-
* Copyright (c) 2007 Damien Bergamini <damien.bergamini@free.fr>
* Copyright (c) 2012 Bernhard Schmidt <bschmidt@FreeBSD.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* $OpenBSD: rt2860var.h,v 1.20 2010/09/07 16:21:42 deraadt Exp $
* $FreeBSD$
*/
#define RT2860_TX_RING_COUNT 64
#define RT2860_RX_RING_COUNT 128
#define RT2860_TX_POOL_COUNT (RT2860_TX_RING_COUNT * 2)
#define RT2860_MAX_SCATTER ((RT2860_TX_RING_COUNT * 2) - 1)
/* HW supports up to 255 STAs */
#define RT2860_WCID_MAX 254
#define RT2860_AID2WCID(aid) ((aid) & 0xff)
struct rt2860_rx_radiotap_header {
struct ieee80211_radiotap_header wr_ihdr;
uint64_t wr_tsf;
uint8_t wr_flags;
uint8_t wr_rate;
uint16_t wr_chan_freq;
uint16_t wr_chan_flags;
uint8_t wr_antenna;
int8_t wr_antsignal;
int8_t wr_antnoise;
} __packed;
#define RT2860_RX_RADIOTAP_PRESENT \
((1 << IEEE80211_RADIOTAP_TSFT) | \
(1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_RATE) | \
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
(1 << IEEE80211_RADIOTAP_ANTENNA) | \
(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
struct rt2860_tx_radiotap_header {
struct ieee80211_radiotap_header wt_ihdr;
uint8_t wt_flags;
uint8_t wt_rate;
uint16_t wt_chan_freq;
uint16_t wt_chan_flags;
} __packed;
#define RT2860_TX_RADIOTAP_PRESENT \
((1 << IEEE80211_RADIOTAP_FLAGS) | \
(1 << IEEE80211_RADIOTAP_RATE) | \
(1 << IEEE80211_RADIOTAP_CHANNEL))
struct rt2860_tx_data {
struct rt2860_txwi *txwi;
struct mbuf *m;
struct ieee80211_node *ni;
bus_dmamap_t map;
bus_addr_t paddr;
SLIST_ENTRY(rt2860_tx_data) next;
};
struct rt2860_tx_ring {
struct rt2860_txd *txd;
bus_addr_t paddr;
bus_dma_tag_t desc_dmat;
bus_dmamap_t desc_map;
bus_dma_segment_t seg;
struct rt2860_tx_data *data[RT2860_TX_RING_COUNT];
int cur;
int next;
int queued;
};
struct rt2860_rx_data {
struct mbuf *m;
bus_dmamap_t map;
};
struct rt2860_rx_ring {
struct rt2860_rxd *rxd;
bus_addr_t paddr;
bus_dma_tag_t desc_dmat;
bus_dmamap_t desc_map;
bus_dma_tag_t data_dmat;
bus_dma_segment_t seg;
unsigned int cur; /* must be unsigned */
struct rt2860_rx_data data[RT2860_RX_RING_COUNT];
};
struct rt2860_node {
struct ieee80211_node ni;
uint8_t wcid;
uint8_t ridx[IEEE80211_RATE_MAXSIZE];
uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE];
};
struct rt2860_vap {
struct ieee80211vap ral_vap;
int (*ral_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define RT2860_VAP(vap) ((struct rt2860_vap *)(vap))
struct rt2860_softc {
struct ifnet *sc_ifp;
device_t sc_dev;
bus_space_tag_t sc_st;
bus_space_handle_t sc_sh;
struct mtx sc_mtx;
struct callout watchdog_ch;
int sc_invalid;
int sc_debug;
/*
* The same in both up to here
* ------------------------------------------------
*/
uint16_t (*sc_srom_read)(struct rt2860_softc *,
uint16_t);
void (*sc_node_free)(struct ieee80211_node *);
int sc_flags;
#define RT2860_ENABLED (1 << 0)
#define RT2860_ADVANCED_PS (1 << 1)
#define RT2860_PCIE (1 << 2)
struct ieee80211_node *wcid2ni[RT2860_WCID_MAX];
struct rt2860_tx_ring txq[6];
struct rt2860_rx_ring rxq;
SLIST_HEAD(, rt2860_tx_data) data_pool;
struct rt2860_tx_data data[RT2860_TX_POOL_COUNT];
bus_dma_tag_t txwi_dmat;
bus_dmamap_t txwi_map;
bus_dma_segment_t txwi_seg;
caddr_t txwi_vaddr;
int sc_tx_timer;
int mgtqid;
uint8_t qfullmsk;
uint16_t mac_ver;
uint16_t mac_rev;
uint8_t rf_rev;
uint8_t freq;
uint8_t ntxchains;
uint8_t nrxchains;
uint8_t pslevel;
int8_t txpow1[54];
int8_t txpow2[54];
int8_t rssi_2ghz[3];
int8_t rssi_5ghz[3];
uint8_t lna[4];
uint8_t rf24_20mhz;
uint8_t rf24_40mhz;
uint8_t patch_dac;
uint8_t rfswitch;
uint8_t ext_2ghz_lna;
uint8_t ext_5ghz_lna;
uint8_t calib_2ghz;
uint8_t calib_5ghz;
uint8_t txmixgain_2ghz;
uint8_t txmixgain_5ghz;
uint8_t tssi_2ghz[9];
uint8_t tssi_5ghz[9];
uint8_t step_2ghz;
uint8_t step_5ghz;
struct {
uint8_t reg;
uint8_t val;
} bbp[8], rf[10];
uint8_t leds;
uint16_t led[3];
uint32_t txpow20mhz[5];
uint32_t txpow40mhz_2ghz[5];
uint32_t txpow40mhz_5ghz[5];
struct rt2860_rx_radiotap_header sc_rxtap;
int sc_rxtap_len;
struct rt2860_tx_radiotap_header sc_txtap;
int sc_txtap_len;
};
int rt2860_attach(device_t, int);
int rt2860_detach(void *);
void rt2860_shutdown(void *);
void rt2860_suspend(void *);
void rt2860_resume(void *);
void rt2860_intr(void *);
#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
#define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)

View File

@ -3,7 +3,7 @@
.PATH: ${.CURDIR}/../../dev/ral
KMOD= if_ral
SRCS= rt2560.c rt2661.c if_ral_pci.c
SRCS= rt2560.c rt2661.c rt2860.c if_ral_pci.c
SRCS+= device_if.h bus_if.h pci_if.h
.include <bsd.kmod.mk>