summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2023-03-26 19:16:05 -0700
committerSecurityBot <android-nexus-securitybot@system.gserviceaccount.com>2023-03-26 19:16:05 -0700
commit2103b5afedd5b047a61a3625fdb6b312d97d0819 (patch)
treec8e33bae0fc090b300ccfaf9f4852c1b9d280414
parent77059fcfbfc9bcfb4fff2de59d2133d4ef0eaf69 (diff)
parent0457964d772872a2b8e8c5be2b0891e844d121a2 (diff)
downloaduwb-2103b5afedd5b047a61a3625fdb6b312d97d0819.tar.gz
Merge android13-gs-pixel-5.10-tm-qpr3 into android13-gs-pixel-5.10-udc
SBMerger: 516612970 Change-Id: If0776591f98cd9ddb79af1dbce36bff18dd6169b Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_calib.c30
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_core.c25
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_mcps.c4
-rw-r--r--mac/fira_session.c9
4 files changed, 38 insertions, 30 deletions
diff --git a/kernel/drivers/net/ieee802154/dw3000_calib.c b/kernel/drivers/net/ieee802154/dw3000_calib.c
index 31bd4a7..2527486 100644
--- a/kernel/drivers/net/ieee802154/dw3000_calib.c
+++ b/kernel/drivers/net/ieee802154/dw3000_calib.c
@@ -312,13 +312,17 @@ int dw3000_calib_update_config(struct dw3000 *dw)
ant_rf1 = config->ant[0];
ant_rf2 = config->ant[1];
- /* At least, RF1 port must have a valid antenna */
- if (ant_rf1 < 0)
+ if (ant_rf1 < 0 && ant_rf2 < 0) {
/* Not configured yet, does nothing. */
return 0;
- if (ant_rf1 >= ANTMAX)
+ }
+ /* Since both calibs can be used at this time, both needs to be safe. */
+ if (ant_rf1 >= ANTMAX || ant_rf2 >= ANTMAX)
return -1;
- ant_calib = &dw->calib_data.ant[ant_rf1];
+ if (ant_rf1 >= 0)
+ ant_calib = &dw->calib_data.ant[ant_rf1];
+ else
+ ant_calib = &dw->calib_data.ant[ant_rf2];
/* Convert config into index of array. */
chanidx = config->chan == 9 ? DW3000_CALIBRATION_CHANNEL_9 :
@@ -345,16 +349,16 @@ int dw3000_calib_update_config(struct dw3000 *dw)
/* Early exit if RF2 isn't configured yet. */
if (ant_rf2 < 0)
return 0;
- if (ant_rf2 >= ANTMAX)
- return -EINVAL;
- /* RF2 port has a valid antenna, so antpair can be used */
- antpair = ant_rf2 > ant_rf1 ? ANTPAIR_IDX(ant_rf1, ant_rf2) :
- ANTPAIR_IDX(ant_rf2, ant_rf1);
- antpair_calib = &dw->calib_data.antpair[antpair];
- /* Update PDOA offset */
- config->pdoaOffset = antpair_calib->ch[chanidx].pdoa_offset;
- config->pdoaLut = &antpair_calib->ch[chanidx].pdoa_lut;
+ if (ant_rf1 >= 0 && ant_rf2 >= 0) {
+ /* RF2 and RF1 port has a valid antenna, so antpair can be used */
+ antpair = ant_rf2 > ant_rf1 ? ANTPAIR_IDX(ant_rf1, ant_rf2) :
+ ANTPAIR_IDX(ant_rf2, ant_rf1);
+ antpair_calib = &dw->calib_data.antpair[antpair];
+ /* Update PDOA offset */
+ config->pdoaOffset = antpair_calib->ch[chanidx].pdoa_offset;
+ config->pdoaLut = &antpair_calib->ch[chanidx].pdoa_lut;
+ }
/* Smart TX power */
/* When deactivated, reset register to default value (if change occurs
while already started) */
diff --git a/kernel/drivers/net/ieee802154/dw3000_core.c b/kernel/drivers/net/ieee802154/dw3000_core.c
index 0c2c7f6..7772f16 100644
--- a/kernel/drivers/net/ieee802154/dw3000_core.c
+++ b/kernel/drivers/net/ieee802154/dw3000_core.c
@@ -1418,11 +1418,11 @@ static int dw3000_change_tx_rf_port(struct dw3000 *dw, bool use_rf2)
static int dw3000_change_rx_rf_port(struct dw3000 *dw, bool use_rf2)
{
int rc = 0;
- u32 val = DW3000_TXRXSWITCH_AUTO;
-
- if (use_rf2) {
- val |= DW3000_RF_SWITCH_RX_RF2;
- }
+ u32 val = DW3000_TXRXSWITCH_AUTO |
+ ((u32)use_rf2
+ << DW3000_RF_SWITCH_CTRL_ANT_TXRX_RXPORT_BIT_OFFSET) |
+ ((u32)use_rf2
+ << DW3000_RF_SWITCH_CTRL_ANT_TXRX_MODE_OVR_BIT_OFFSET);
rc = dw3000_reg_write32(dw, DW3000_RF_SWITCH_CTRL_ID, 0, val);
if (!rc)
dw->rx_rf2 = use_rf2;
@@ -6471,13 +6471,14 @@ int dw3000_set_tx_antenna(struct dw3000 *dw, int ant_set_id)
ant_set_id);
return -EINVAL;
}
- /* Early return if no change */
- if (ant_idx1 == config->ant[0])
- return 0;
/* Retrieve antenna GPIO configuration from calibration data */
ant_calib = &dw->calib_data.ant[ant_idx1];
+ /* Early return if no change */
+ if (ant_idx1 == config->ant[ant_calib->port])
+ return 0;
+
/* switching to RF2 port for TX if necessary */
- if (ant_calib->port == 1 || dw->tx_rf2)
+ if ((ant_calib->port == 1) || (dw->tx_rf2))
dw3000_change_tx_rf_port(dw, ant_calib->port == 1);
/* Set GPIO state according config to select this antenna */
@@ -6522,12 +6523,6 @@ int dw3000_set_rx_antennas(struct dw3000 *dw, int ant_set_id, bool pdoa_enabled,
port = ant_calib->port; /* Save port for later check */
if (((ant_calib->port == 1) || dw->rx_rf2) && ant_idx2 < 0) {
dw3000_change_rx_rf_port(dw, true);
- } else if (ant_calib->port == 1 && ant_idx2 > 0) {
- if (frame_idx == 5) {
- dw3000_change_rx_rf_port(dw, true);
- } else {
- dw3000_change_rx_rf_port(dw, false);
- }
} else {
dw3000_change_rx_rf_port(dw, false);
}
diff --git a/kernel/drivers/net/ieee802154/dw3000_mcps.c b/kernel/drivers/net/ieee802154/dw3000_mcps.c
index f1810a7..c9365b2 100644
--- a/kernel/drivers/net/ieee802154/dw3000_mcps.c
+++ b/kernel/drivers/net/ieee802154/dw3000_mcps.c
@@ -86,11 +86,11 @@ tx_rmarker_offset(struct dw3000 *dw,
return 0;
}
+ ant_calib = &dw->calib_data.ant[ant_idx1];
/* Current configured ant_id. */
- if (ant_idx1 == config->ant[0])
+ if (ant_idx1 == config->ant[ant_calib->port])
return config->rmarkerOffset;
- ant_calib = &dw->calib_data.ant[ant_idx1];
chanidx = chan == 9 ? DW3000_CALIBRATION_CHANNEL_9 :
DW3000_CALIBRATION_CHANNEL_5;
diff --git a/mac/fira_session.c b/mac/fira_session.c
index e5f2e3a..15f3b20 100644
--- a/mac/fira_session.c
+++ b/mac/fira_session.c
@@ -1117,6 +1117,15 @@ static bool range_data_notif_update(struct fira_local *local,
ri->short_addr);
fira_session_set_range_data_ntf_status(session, ri);
+ if (!controlee) {
+ /*
+ * This case can happen in Contention Based mode.
+ * In this mode, controlees are unknown. Let's notify.
+ */
+ ri->notify = true;
+ send_report = true;
+ continue;
+ }
ctlee_status = controlee->range_data_ntf_status;
ri->notify = send_ranging_data(
config, ri->range_data_ntf_status,