From 0c5091c6bc2a036c1eb3272db0768ecb84559671 Mon Sep 17 00:00:00 2001 From: Christian Lamparter Date: Mon, 30 Aug 2010 05:30:25 +0200 Subject: [PATCH] carl9170 firmware: modify the right beacon Previously, the beacon address and length hardware registers were (ab-)used as additional parameters for the beacon modification functions. This idea worked fine, until I decided to change the associated code and moved the beacon address and length "set" _after_ the wlan_cab_modify_dtim_beacon... Signed-off-by: Christian Lamparter --- carlfw/include/wl.h | 4 +++- carlfw/src/cmd.c | 3 ++- carlfw/src/wlan.c | 16 ++++++---------- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/carlfw/include/wl.h b/carlfw/include/wl.h index fa3cb22..86a7abf 100644 --- a/carlfw/include/wl.h +++ b/carlfw/include/wl.h @@ -262,7 +262,9 @@ void handle_wlan(void); void wlan_tx_stuck(const struct carl9170_cmd *cmd, struct carl9170_rsp *rsp); void wlan_cab_flush_queue(const unsigned int vif); -void wlan_cab_modify_dtim_beacon(const unsigned int vif); +void wlan_cab_modify_dtim_beacon(const unsigned int vif, + const unsigned int bcn_addr, + const unsigned int bcn_len); static inline void __check_wlantx(void) { diff --git a/carlfw/src/cmd.c b/carlfw/src/cmd.c index 6c9f45e..b63f926 100644 --- a/carlfw/src/cmd.c +++ b/carlfw/src/cmd.c @@ -86,7 +86,8 @@ void handle_cmd(struct carl9170_rsp *resp) resp->hdr.len = 0; if (cmd->bcn_ctrl.mode & CARL9170_BCN_CTRL_CAB_TRIGGER) { - wlan_cab_modify_dtim_beacon(cmd->bcn_ctrl.vif_id); + wlan_cab_modify_dtim_beacon(cmd->bcn_ctrl.vif_id, + cmd->bcn_ctrl.bcn_addr, cmd->bcn_ctrl.bcn_len); set(AR9170_MAC_REG_BCN_ADDR, cmd->bcn_ctrl.bcn_addr); set(AR9170_MAC_REG_BCN_LENGTH, cmd->bcn_ctrl.bcn_len); set(AR9170_MAC_REG_BCN_CTRL, AR9170_BCN_CTRL_READY); diff --git a/carlfw/src/wlan.c b/carlfw/src/wlan.c index 8bc3d4f..9476524 100644 --- a/carlfw/src/wlan.c +++ b/carlfw/src/wlan.c @@ -625,16 +625,11 @@ void wlan_cab_flush_queue(const unsigned int vif) } } -static uint8_t *beacon_find_ie(uint8_t ie) +static uint8_t *beacon_find_ie(uint8_t ie, void *addr, + const unsigned int len) { - struct ieee80211_mgmt *mgmt = getp(AR9170_MAC_REG_BCN_ADDR); + struct ieee80211_mgmt *mgmt = addr; uint8_t *pos, *end; - unsigned int len; - - len = get(AR9170_MAC_REG_BCN_LENGTH); - - if (len < FCS_LEN + sizeof(mgmt)) - return NULL; pos = mgmt->u.beacon.variable; end = (uint8_t *) ((unsigned long)mgmt + (len - FCS_LEN)); @@ -651,12 +646,13 @@ static uint8_t *beacon_find_ie(uint8_t ie) return NULL; } -void wlan_cab_modify_dtim_beacon(const unsigned int vif) +void wlan_cab_modify_dtim_beacon(const unsigned int vif, + const unsigned int addr, const unsigned int len) { uint8_t *_ie; struct ieee80211_tim_ie *ie; - _ie = beacon_find_ie(WLAN_EID_TIM); + _ie = beacon_find_ie(WLAN_EID_TIM, (void *)addr, len); if (likely(_ie)) { ie = (struct ieee80211_tim_ie *) &_ie[2]; -- 2.31.1