Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 184457
b: refs/heads/master
c: 30240fc
h: refs/heads/master
i:
  184455: 48d89d4
v: v3
  • Loading branch information
Juuso Oikarinen authored and John W. Linville committed Feb 19, 2010
1 parent 54da685 commit 41c1466
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 29 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ddb01a5b368270f3cc86b606ba6f7ee8795a8a99
refs/heads/master: 30240fc76a57e37a4bb42976ff7162b5e45e6117
10 changes: 8 additions & 2 deletions trunk/drivers/net/wireless/wl12xx/wl1271_event.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,12 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
true);
} else {
wl1271_error("PSM entry failed, giving up.\n");
/* make sure the firmware goes into active mode */
/* FIXME: this may need to be reconsidered. for now it
is not possible to indicate to the mac80211
afterwards that PSM entry failed. To maximize
functionality (receiving data and remaining
associated) make sure that we are in sync with the
AP in regard of PSM mode. */
ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
false);
wl->psm_entry_retry = 0;
Expand Down Expand Up @@ -124,7 +129,8 @@ static int wl1271_event_ps_report(struct wl1271 *wl,
break;
}

/* make sure the firmware goes to active mode */
/* make sure the firmware goes to active mode - the frame to
be sent next will indicate to the AP, that we are active. */
ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
false);
break;
Expand Down
69 changes: 43 additions & 26 deletions trunk/drivers/net/wireless/wl12xx/wl1271_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1549,6 +1549,23 @@ static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
return ret;
}

static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *beacon)
{
u8 *ptr = beacon->data +
offsetof(struct ieee80211_mgmt, u.beacon.variable);

/* find the location of the ssid in the beacon */
while (ptr < beacon->data + beacon->len) {
if (ptr[0] == WLAN_EID_SSID) {
wl->ssid_len = ptr[1];
memcpy(wl->ssid, ptr+2, wl->ssid_len);
return;
}
ptr += ptr[1];
}
wl1271_error("ad-hoc beacon template has no SSID!\n");
}

static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
struct ieee80211_bss_conf *bss_conf,
Expand All @@ -1566,40 +1583,17 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
if (ret < 0)
goto out;

if ((changed & BSS_CHANGED_BSSID) &&
/*
* Now we know the correct bssid, so we send a new join command
* and enable the BSSID filter
*/
memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
wl->rx_config |= CFG_BSSID_FILTER_EN;
memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
ret = wl1271_cmd_build_null_data(wl);
if (ret < 0) {
wl1271_warning("cmd buld null data failed %d",
ret);
goto out_sleep;
}
ret = wl1271_cmd_join(wl);
if (ret < 0) {
wl1271_warning("cmd join failed %d", ret);
goto out_sleep;
}
set_bit(WL1271_FLAG_JOINED, &wl->flags);
}

if (wl->bss_type == BSS_TYPE_IBSS) {
/* FIXME: This implements rudimentary ad-hoc support -
proper templates are on the wish list and notification
on when they change. This patch will update the templates
on every call to this function. Also, the firmware will not
answer to probe-requests as it does not have the proper
SSID set in the JOIN command. The probe-response template
is set nevertheless, as the FW will ASSERT without it */
on every call to this function. */
struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);

if (beacon) {
struct ieee80211_hdr *hdr;

wl1271_ssid_set(wl, beacon);
ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
beacon->data,
beacon->len);
Expand All @@ -1624,6 +1618,29 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
}
}

if ((changed & BSS_CHANGED_BSSID) &&
/*
* Now we know the correct bssid, so we send a new join command
* and enable the BSSID filter
*/
memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
wl->rx_config |= CFG_BSSID_FILTER_EN;
memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
ret = wl1271_cmd_build_null_data(wl);
if (ret < 0) {
wl1271_warning("cmd buld null data failed %d",
ret);
goto out_sleep;
}

ret = wl1271_cmd_join(wl);
if (ret < 0) {
wl1271_warning("cmd join failed %d", ret);
goto out_sleep;
}
set_bit(WL1271_FLAG_JOINED, &wl->flags);
}

if (changed & BSS_CHANGED_ASSOC) {
if (bss_conf->assoc) {
wl->aid = bss_conf->aid;
Expand Down

0 comments on commit 41c1466

Please sign in to comment.