> Date: Thu, 25 Jul 2013 10:33:12 +0200 (CEST)
> From: Mark Kettenis <[email protected]>
>
> Looked at your diff, and then noticed that run(4) already had support
> for the RT3572 MAC/BBP. It has a few more RT3572-specific bits that
> match what the Linux driver does. So I ported them over to ral(4).
> Could you give the attached diff a go?
Actually, this diff isn't quite right. I'll send a new one shortly.
> Index: rt2860.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/rt2860.c,v
> retrieving revision 1.68
> diff -u -p -r1.68 rt2860.c
> --- rt2860.c 11 Jun 2013 18:15:53 -0000 1.68
> +++ rt2860.c 25 Jul 2013 08:24:44 -0000
> @@ -130,6 +130,7 @@ void rt2860_set_basicrates(struct rt286
> void rt2860_select_chan_group(struct rt2860_softc *, int);
> void rt2860_set_chan(struct rt2860_softc *, u_int);
> void rt3090_set_chan(struct rt2860_softc *, u_int);
> +void rt3572_set_chan(struct rt2860_softc *, u_int);
> int rt3090_rf_init(struct rt2860_softc *);
> void rt3090_rf_wakeup(struct rt2860_softc *);
> int rt3090_filter_calib(struct rt2860_softc *, uint8_t, uint8_t,
> @@ -197,6 +198,8 @@ static const struct {
> uint8_t val;
> } rt3090_def_rf[] = {
> RT3070_DEF_RF
> +}, rt3572_def_rf[] = {
> + RT3572_DEF_RF
> };
>
> int
> @@ -2158,13 +2161,15 @@ rt2860_select_chan_group(struct rt2860_s
> rt2860_mcu_bbp_write(sc, 75, 0x50);
> }
> } else {
> - if (sc->ext_5ghz_lna) {
> + if (sc->mac_ver == 0x3572)
> + rt2860_mcu_bbp_write(sc, 82, 0x94);
> + else
> rt2860_mcu_bbp_write(sc, 82, 0xf2);
> +
> + if (sc->ext_5ghz_lna)
> rt2860_mcu_bbp_write(sc, 75, 0x46);
> - } else {
> - rt2860_mcu_bbp_write(sc, 82, 0xf2);
> + else
> rt2860_mcu_bbp_write(sc, 75, 0x50);
> - }
> }
>
> tmp = RAL_READ(sc, RT2860_TX_BAND_CFG);
> @@ -2191,7 +2196,12 @@ rt2860_select_chan_group(struct rt2860_s
> if (sc->mac_ver == 0x3593 && sc->ntxchains > 2)
> tmp |= RT3593_PA_PE_A2_EN;
> }
> - RAL_WRITE(sc, RT2860_TX_PIN_CFG, tmp);
> + if (sc->mac_ver == 0x3572) {
> + rt3090_rf_write(sc, 8, 0x00);
> + RAL_WRITE(sc, RT2860_TX_PIN_CFG, tmp);
> + rt3090_rf_write(sc, 8, 0x80);
> + } else
> + RAL_WRITE(sc, RT2860_TX_PIN_CFG, tmp);
>
> if (sc->mac_ver == 0x3593) {
> tmp = RAL_READ(sc, RT2860_GPIO_CTRL);
> @@ -2215,7 +2225,10 @@ rt2860_select_chan_group(struct rt2860_s
> else
> agc = 0x2e + sc->lna[0];
> } else { /* 5GHz band */
> - agc = 0x32 + (sc->lna[group] * 5) / 3;
> + if (sc->mac_ver == 0x3572)
> + agc = 0x22 + (sc->lna[group] * 5) / 3;
> + else
> + agc = 0x32 + (sc->lna[group] * 5) / 3;
> }
> rt2860_mcu_bbp_write(sc, 66, agc);
>
> @@ -2341,6 +2354,154 @@ rt3090_set_chan(struct rt2860_softc *sc,
> rt3090_rf_write(sc, 7, rf | RT3070_TUNE);
> }
>
> +void
> +rt3572_set_chan(struct rt2860_softc *sc, u_int chan)
> +{
> + int8_t txpow1, txpow2;
> + uint32_t tmp;
> + uint8_t rf;
> + int i;
> +
> + /* find the settings for this channel (we know it exists) */
> + for (i = 0; rt2860_rf2850[i].chan != chan; i++);
> +
> + /* use Tx power values from EEPROM */
> + txpow1 = sc->txpow1[i];
> + txpow2 = sc->txpow2[i];
> +
> + if (chan <= 14) {
> + rt2860_mcu_bbp_write(sc, 25, sc->bbp25);
> + rt2860_mcu_bbp_write(sc, 26, sc->bbp26);
> + } else {
> + /* enable IQ phase correction */
> + rt2860_mcu_bbp_write(sc, 25, 0x09);
> + rt2860_mcu_bbp_write(sc, 26, 0xff);
> + }
> +
> + rt3090_rf_write(sc, 2, rt3090_freqs[i].n);
> + rt3090_rf_write(sc, 3, rt3090_freqs[i].k);
> + rf = rt3090_rf_read(sc, 6);
> + rf = (rf & ~0x0f) | rt3090_freqs[i].r;
> + rf |= (chan <= 14) ? 0x08 : 0x04;
> + rt3090_rf_write(sc, 6, rf);
> +
> + /* set PLL mode */
> + rf = rt3090_rf_read(sc, 5);
> + rf &= ~(0x08 | 0x04);
> + rf |= (chan <= 14) ? 0x04 : 0x08;
> + rt3090_rf_write(sc, 5, rf);
> +
> + /* set Tx power for chain 0 */
> + if (chan <= 14)
> + rf = 0x60 | txpow1;
> + else
> + rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
> + rt3090_rf_write(sc, 12, rf);
> +
> + /* set Tx power for chain 1 */
> + if (chan <= 14)
> + rf = 0x60 | txpow2;
> + else
> + rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
> + rt3090_rf_write(sc, 13, rf);
> +
> + /* set Tx/Rx streams */
> + rf = rt3090_rf_read(sc, 1);
> + rf &= ~0xfc;
> + if (sc->ntxchains == 1)
> + rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */
> + else if (sc->ntxchains == 2)
> + rf |= 1 << 7; /* 2T: disable Tx chain 3 */
> + if (sc->nrxchains == 1)
> + rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
> + else if (sc->nrxchains == 2)
> + rf |= 1 << 6; /* 2R: disable Rx chain 3 */
> + rt3090_rf_write(sc, 1, rf);
> +
> + /* set RF offset */
> + rf = rt3090_rf_read(sc, 23);
> + rf = (rf & ~0x7f) | sc->freq;
> + rt3090_rf_write(sc, 23, rf);
> +
> + /* program RF filter */
> + rf = sc->rf24_20mhz;
> + rt3090_rf_write(sc, 24, rf); /* Tx */
> + rt3090_rf_write(sc, 31, rf); /* Rx */
> +
> + /* enable RF tuning */
> + rf = rt3090_rf_read(sc, 7);
> + rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
> + rt3090_rf_write(sc, 7, rf);
> +
> + /* TSSI */
> + rf = (chan <= 14) ? 0xc3 : 0xc0;
> + rt3090_rf_write(sc, 9, rf);
> +
> + /* set loop filter 1 */
> + rt3090_rf_write(sc, 10, 0xf1);
> + /* set loop filter 2 */
> + rt3090_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
> +
> + /* set tx_mx2_ic */
> + rt3090_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
> + /* set tx_mx1_ic */
> + if (chan <= 14)
> + rf = 0x48 | sc->txmixgain_2ghz;
> + else
> + rf = 0x78 | sc->txmixgain_5ghz;
> + rt3090_rf_write(sc, 16, rf);
> +
> + /* set tx_lo1 */
> + rt3090_rf_write(sc, 17, 0x23);
> + /* set tx_lo2 */
> + if (chan <= 14)
> + rf = 0x93;
> + else if (chan <= 64)
> + rf = 0xb7;
> + else if (chan <= 128)
> + rf = 0x74;
> + else
> + rf = 0x72;
> + rt3090_rf_write(sc, 19, rf);
> +
> + /* set rx_lo1 */
> + if (chan <= 14)
> + rf = 0xb3;
> + else if (chan <= 64)
> + rf = 0xf6;
> + else if (chan <= 128)
> + rf = 0xf4;
> + else
> + rf = 0xf3;
> + rt3090_rf_write(sc, 20, rf);
> +
> + /* set pfd_delay */
> + if (chan <= 14)
> + rf = 0x15;
> + else if (chan <= 64)
> + rf = 0x3d;
> + else
> + rf = 0x01;
> + rt3090_rf_write(sc, 25, rf);
> +
> + /* set rx_lo2 */
> + rt3090_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
> + /* set ldo_rf_vc */
> + rt3090_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
> + /* set drv_cc */
> + rt3090_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
> +
> + tmp = RAL_READ(sc, RT2860_GPIO_CTRL);
> + tmp &= ~0x8080;
> + if (chan <= 14)
> + tmp |= 0x80;
> + RAL_WRITE(sc, RT2860_GPIO_CTRL, tmp);
> +
> + /* enable RF tuning */
> + rf = rt3090_rf_read(sc, 7);
> + rt3090_rf_write(sc, 7, rf | 0x01);
> +}
> +
> int
> rt3090_rf_init(struct rt2860_softc *sc)
> {
> @@ -2367,9 +2528,16 @@ rt3090_rf_init(struct rt2860_softc *sc)
> RAL_WRITE(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
>
> /* initialize RF registers to default value */
> - for (i = 0; i < nitems(rt3090_def_rf); i++) {
> - rt3090_rf_write(sc, rt3090_def_rf[i].reg,
> - rt3090_def_rf[i].val);
> + if (sc->mac_ver == 0x3572) {
> + for (i = 0; i < nitems(rt3090_def_rf); i++) {
> + rt3090_rf_write(sc, rt3090_def_rf[i].reg,
> + rt3090_def_rf[i].val);
> + }
> + } else {
> + for (i = 0; i < nitems(rt3090_def_rf); i++) {
> + rt3090_rf_write(sc, rt3090_def_rf[i].reg,
> + rt3090_def_rf[i].val);
> + }
> }
>
> /* select 20MHz bandwidth */
> @@ -2396,6 +2564,12 @@ rt3090_rf_init(struct rt2860_softc *sc)
> /* go back to 20MHz bandwidth */
> bbp = rt2860_mcu_bbp_read(sc, 4);
> rt2860_mcu_bbp_write(sc, 4, bbp & ~0x18);
> +
> + if (sc->mac_ver == 0x3572) {
> + /* save default BBP registers 25 and 26 values */
> + sc->bbp25 = rt2860_mcu_bbp_read(sc, 25);
> + sc->bbp26 = rt2860_mcu_bbp_read(sc, 26);
> + }
> }
> if (sc->mac_rev < 0x0211)
> rt3090_rf_write(sc, 27, 0x03);
> @@ -3756,7 +3930,9 @@ rt2860_switch_chan(struct rt2860_softc *
> if (chan == 0 || chan == IEEE80211_CHAN_ANY)
> return;
>
> - if (sc->mac_ver >= 0x3071)
> + if (sc->mac_ver == 0x3572)
> + rt3572_set_chan(sc, chan);
> + else if (sc->mac_ver >= 0x3071)
> rt3090_set_chan(sc, chan);
> else
> rt2860_set_chan(sc, chan);
> Index: rt2860var.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/rt2860var.h,v
> retrieving revision 1.20
> diff -u -p -r1.20 rt2860var.h
> --- rt2860var.h 7 Sep 2010 16:21:42 -0000 1.20
> +++ rt2860var.h 25 Jul 2013 08:24:44 -0000
> @@ -156,6 +156,8 @@ struct rt2860_softc {
> int8_t rssi_2ghz[3];
> int8_t rssi_5ghz[3];
> uint8_t lna[4];
> + uint8_t bbp25;
> + uint8_t bbp26;
> uint8_t rf24_20mhz;
> uint8_t rf24_40mhz;
> uint8_t patch_dac;
>
>