diff options
author | 2014-09-26 12:04:07 +0000 | |
---|---|---|
committer | 2014-09-26 12:04:07 +0000 | |
commit | 2548be7aad344ce86be119ed1a868b356801d3f7 (patch) | |
tree | 411991ceb8cdde5a62209c9dd3b812f9f1774c8b | |
parent | zap now unused "PERFINC" (diff) | |
download | wireguard-openbsd-2548be7aad344ce86be119ed1a868b356801d3f7.tar.xz wireguard-openbsd-2548be7aad344ce86be119ed1a868b356801d3f7.zip |
Revert a part of r1.98 if_run.c which caused a regression on older gen
run(4) devices.
ok stsp@
-rw-r--r-- | sys/dev/usb/if_run.c | 78 |
1 files changed, 33 insertions, 45 deletions
diff --git a/sys/dev/usb/if_run.c b/sys/dev/usb/if_run.c index 4c9cd62de75..5288e982087 100644 --- a/sys/dev/usb/if_run.c +++ b/sys/dev/usb/if_run.c @@ -1,4 +1,4 @@ -/* $OpenBSD: if_run.c,v 1.103 2014/07/13 15:52:49 mpi Exp $ */ +/* $OpenBSD: if_run.c,v 1.104 2014/09/26 12:04:07 mlarkin Exp $ */ /*- * Copyright (c) 2008-2010 Damien Bergamini <damien.bergamini@free.fr> @@ -345,7 +345,7 @@ int run_set_region_4(struct run_softc *, uint16_t, uint32_t, int); int run_efuse_read(struct run_softc *, uint16_t, uint16_t *); int run_efuse_read_2(struct run_softc *, uint16_t, uint16_t *); int run_eeprom_read_2(struct run_softc *, uint16_t, uint16_t *); -int run_rt2870_rf_write(struct run_softc *, uint32_t); +int run_rt2870_rf_write(struct run_softc *, uint8_t, uint32_t); int run_rt3070_rf_read(struct run_softc *, uint8_t, uint8_t *); int run_rt3070_rf_write(struct run_softc *, uint8_t, uint8_t); int run_bbp_read(struct run_softc *, uint8_t, uint8_t *); @@ -1119,7 +1119,7 @@ run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val) } int -run_rt2870_rf_write(struct run_softc *sc, uint32_t val) +run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val) { uint32_t tmp; int error, ntries; @@ -1133,7 +1133,10 @@ run_rt2870_rf_write(struct run_softc *sc, uint32_t val) if (ntries == 10) return ETIMEDOUT; - return run_write(sc, RT2860_RF_CSR_CFG0, val); + /* RF registers are 24-bit on the RT2860 */ + tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT | + (val & 0x3fffff) << 2 | (reg & 3); + return run_write(sc, RT2860_RF_CSR_CFG0, tmp); } int @@ -2917,61 +2920,46 @@ run_rt2870_set_chan(struct run_softc *sc, u_int chan) r2 = rfprog[i].r2; if (sc->ntxchains == 1) - r2 |= 1 << 14; /* 1T: disable Tx chain 2 */ + r2 |= 1 << 12; /* 1T: disable Tx chain 2 */ if (sc->nrxchains == 1) - r2 |= 1 << 17 | 1 << 6; /* 1R: disable Rx chains 2 & 3 */ + r2 |= 1 << 15 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ else if (sc->nrxchains == 2) - r2 |= 1 << 6; /* 2R: disable Rx chain 3 */ + r2 |= 1 << 4; /* 2R: disable Rx chain 3 */ /* use Tx power values from EEPROM */ txpow1 = sc->txpow1[i]; txpow2 = sc->txpow2[i]; - - /* Initialize RF R3 and R4. */ - r3 = rfprog[i].r3 & 0xffffc1ff; - r4 = (rfprog[i].r4 & ~(0x001f87c0)) | (sc->freq << 15); if (chan > 14) { - if (txpow1 >= 0) { - txpow1 = (txpow1 > 0xf) ? (0xf) : (txpow1); - r3 |= (txpow1 << 10) | (1 << 9); - } else { - txpow1 += 7; - - /* txpow1 is not possible larger than 15. */ - r3 |= (txpow1 << 10); - } - if (txpow2 >= 0) { - txpow2 = (txpow2 > 0xf) ? (0xf) : (txpow2); - r4 |= (txpow2 << 7) | (1 << 6); - } else { - txpow2 += 7; - r4 |= (txpow2 << 7); - } - } else { - /* Set Tx0 power. */ - r3 |= (txpow1 << 9); - - /* Set frequency offset and Tx1 power. */ - r4 |= (txpow2 << 6); + if (txpow1 >= 0) + txpow1 = txpow1 << 1 | 1; + else + txpow1 = (7 + txpow1) << 1; + if (txpow2 >= 0) + txpow2 = txpow2 << 1 | 1; + else + txpow2 = (7 + txpow2) << 1; } - run_rt2870_rf_write(sc, rfprog[i].r1); - run_rt2870_rf_write(sc, r2); - run_rt2870_rf_write(sc, r3 & ~(1 << 2)); - run_rt2870_rf_write(sc, r4); + r3 = rfprog[i].r3 | txpow1 << 7; + r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4; + + run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); + run_rt2870_rf_write(sc, RT2860_RF2, r2); + run_rt2870_rf_write(sc, RT2860_RF3, r3); + run_rt2870_rf_write(sc, RT2860_RF4, r4); DELAY(200); - run_rt2870_rf_write(sc, rfprog[i].r1); - run_rt2870_rf_write(sc, r2); - run_rt2870_rf_write(sc, r3 | (1 << 2)); - run_rt2870_rf_write(sc, r4); + run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); + run_rt2870_rf_write(sc, RT2860_RF2, r2); + run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1); + run_rt2870_rf_write(sc, RT2860_RF4, r4); DELAY(200); - run_rt2870_rf_write(sc, rfprog[i].r1); - run_rt2870_rf_write(sc, r2); - run_rt2870_rf_write(sc, r3 & ~(1 << 2)); - run_rt2870_rf_write(sc, r4); + run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); + run_rt2870_rf_write(sc, RT2860_RF2, r2); + run_rt2870_rf_write(sc, RT2860_RF3, r3); + run_rt2870_rf_write(sc, RT2860_RF4, r4); } void |