carl9170 firmware: modify the right beacon
authorChristian Lamparter <chunkeey@googlemail.com>
Mon, 30 Aug 2010 03:30:25 +0000 (05:30 +0200)
committerChristian Lamparter <chunkeey@googlemail.com>
Mon, 30 Aug 2010 03:30:25 +0000 (05:30 +0200)
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 <chunkeey@googlemail.com>
carlfw/include/wl.h
carlfw/src/cmd.c
carlfw/src/wlan.c

index fa3cb229afeb41e0d1ab6f70b344268755172315..86a7abfea818d2e47aeae75e230375d0072f2dd0 100644 (file)
@@ -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)
 {
index 6c9f45e91c06ef0dddfe6e2582e9e0f16c3915bd..b63f9262012aae3afbf3f4e8fa97f8780b7b86db 100644 (file)
@@ -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);
index 8bc3d4fa4dcc21cdb493d05357c7f941aa72dc1d..947652486205e9092689327a08b5000e3bc56c63 100644 (file)
@@ -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];