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>
void wlan_tx_stuck(const struct carl9170_cmd *cmd, struct carl9170_rsp *rsp);
void wlan_cab_flush_queue(const unsigned int vif);
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)
{
static inline void __check_wlantx(void)
{
resp->hdr.len = 0;
if (cmd->bcn_ctrl.mode & CARL9170_BCN_CTRL_CAB_TRIGGER) {
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);
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);
-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;
- 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));
pos = mgmt->u.beacon.variable;
end = (uint8_t *) ((unsigned long)mgmt + (len - FCS_LEN));
-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;
{
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];
if (likely(_ie)) {
ie = (struct ieee80211_tim_ie *) &_ie[2];