Experimental patch. Signed-off-by: Kalle Valo <kalle.valo@xxxxxxxxx> --- stlc45xx.c | 38 +++++++++++++++++++++++++++++++++----- 1 files changed, 33 insertions(+), 5 deletions(-) diff --git a/stlc45xx.c b/stlc45xx.c index 7d6f909..276339f 100644 --- a/stlc45xx.c +++ b/stlc45xx.c @@ -1217,6 +1217,28 @@ static int stlc45xx_rx_txack(struct stlc45xx *stlc, struct sk_buff *skb) return 0; } +static int stlc45xx_rx_trap(struct stlc45xx *stlc, struct sk_buff *skb) +{ + struct s_lm_control *control; + struct s_lmo_trap *trap; + + stlc45xx_debug(DEBUG_FUNC, "%s", __func__); + + control = (struct s_lm_control *) skb->data; + trap = (struct s_lmo_trap *) (control + 1); + + switch (trap->event) { + case LM_TRAP_NO_BEACON: + ieee80211_beacon_loss(stlc->hw); + break; + default: + stlc45xx_warning("unhandled trap: %d\n", trap->event); + break; + } + + return 0; +} + static int stlc45xx_rx_control(struct stlc45xx *stlc, struct sk_buff *skb) { struct s_lm_control *control; @@ -1230,9 +1252,11 @@ static int stlc45xx_rx_control(struct stlc45xx *stlc, struct sk_buff *skb) case LM_OID_TX: ret = stlc45xx_rx_txack(stlc, skb); break; + case LM_OID_TRAP: + ret = stlc45xx_rx_trap(stlc, skb); + break; case LM_OID_SETUP: case LM_OID_SCAN: - case LM_OID_TRAP: case LM_OID_EDCF: case LM_OID_KEYCACHE: case LM_OID_PSM: @@ -1587,7 +1611,7 @@ static void stlc45xx_tx_setup(struct stlc45xx *stlc) setup->rx_buffer = FIRMWARE_RXBUFFER_START; setup->rx_mtu = FIRMWARE_MTU; setup->frontend = 5; - setup->timeout = 0; + setup->timeout = 2; setup->truncate = 48896; setup->bratemask = 0xffffffff; setup->ref_clock = 644245094; @@ -1662,11 +1686,13 @@ static void stlc45xx_tx_psm(struct stlc45xx *stlc, bool enable) control->oid = LM_OID_PSM; if (enable) - psm->flags |= LM_PSM; + psm->flags |= LM_PSM | LM_PSM_MCBC | + LM_PSM_CHECKSUM | LM_PSM_BEACON_TIMEOUT; psm->aid = stlc->aid; psm->beacon_rcpi_skip_max = 60; + psm->rcpi_delta_threshold = 0; psm->intervals[0].interval = 1; psm->intervals[0].periods = 1; @@ -1677,7 +1703,7 @@ static void stlc45xx_tx_psm(struct stlc45xx *stlc, bool enable) psm->intervals[3].interval = 1; psm->intervals[3].periods = 1; - psm->nr = 0; + psm->nr = 10; psm->exclude[0] = 0; stlc45xx_debug(DEBUG_PSM, "sending LM_OID_PSM (aid %d, interval %d)", @@ -2107,7 +2133,9 @@ static int __devinit stlc45xx_probe(struct spi_device *spi) IEEE80211_HW_SIGNAL_DBM | IEEE80211_HW_NOISE_DBM | IEEE80211_HW_SUPPORTS_PS | - IEEE80211_HW_PS_NULLFUNC_STACK; + IEEE80211_HW_PS_NULLFUNC_STACK | + IEEE80211_HW_BEACON_FILTERING; + /* four bytes for padding */ hw->extra_tx_headroom = sizeof(struct s_lm_data_out) + 4; -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html