wlcore: move ps change handling to .bss_info_changed()
Adapt the new mac80211 BSS_CHANGED_PS notification, and do the ps handling in mac80211's per-vif callback (.bss_info_changed), rather than in the per-device (.config) callback. Make sure to configure it only after association. Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Arik Nemtsov <arik@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
		
					parent
					
						
							
								873d2a4034
							
						
					
				
			
			
				commit
				
					
						518b680a8e
					
				
			
		
					 1 changed files with 32 additions and 38 deletions
				
			
		| 
						 | 
					@ -2781,46 +2781,8 @@ static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif)
 | 
				
			||||||
static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 | 
					static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 | 
				
			||||||
			     struct ieee80211_conf *conf, u32 changed)
 | 
								     struct ieee80211_conf *conf, u32 changed)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
 | 
					 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((changed & IEEE80211_CONF_CHANGE_PS) && !is_ap) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if ((conf->flags & IEEE80211_CONF_PS) &&
 | 
					 | 
				
			||||||
		    test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
 | 
					 | 
				
			||||||
		    !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			int ps_mode;
 | 
					 | 
				
			||||||
			char *ps_mode_str;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (wl->conf.conn.forced_ps) {
 | 
					 | 
				
			||||||
				ps_mode = STATION_POWER_SAVE_MODE;
 | 
					 | 
				
			||||||
				ps_mode_str = "forced";
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				ps_mode = STATION_AUTO_PS_MODE;
 | 
					 | 
				
			||||||
				ps_mode_str = "auto";
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (ret < 0)
 | 
					 | 
				
			||||||
				wl1271_warning("enter %s ps failed %d",
 | 
					 | 
				
			||||||
					       ps_mode_str, ret);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		} else if (!(conf->flags & IEEE80211_CONF_PS) &&
 | 
					 | 
				
			||||||
			   test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			wl1271_debug(DEBUG_PSM, "auto ps disabled");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			ret = wl1271_ps_set_mode(wl, wlvif,
 | 
					 | 
				
			||||||
						 STATION_ACTIVE_MODE);
 | 
					 | 
				
			||||||
			if (ret < 0)
 | 
					 | 
				
			||||||
				wl1271_warning("exit auto ps failed %d", ret);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (conf->power_level != wlvif->power_level) {
 | 
						if (conf->power_level != wlvif->power_level) {
 | 
				
			||||||
		ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
 | 
							ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
 | 
				
			||||||
		if (ret < 0)
 | 
							if (ret < 0)
 | 
				
			||||||
| 
						 | 
					@ -4115,6 +4077,38 @@ static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (changed & BSS_CHANGED_PS) {
 | 
				
			||||||
 | 
							if ((bss_conf->ps) &&
 | 
				
			||||||
 | 
							    test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
 | 
				
			||||||
 | 
							    !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
 | 
				
			||||||
 | 
								int ps_mode;
 | 
				
			||||||
 | 
								char *ps_mode_str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (wl->conf.conn.forced_ps) {
 | 
				
			||||||
 | 
									ps_mode = STATION_POWER_SAVE_MODE;
 | 
				
			||||||
 | 
									ps_mode_str = "forced";
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									ps_mode = STATION_AUTO_PS_MODE;
 | 
				
			||||||
 | 
									ps_mode_str = "auto";
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
 | 
				
			||||||
 | 
								if (ret < 0)
 | 
				
			||||||
 | 
									wl1271_warning("enter %s ps failed %d",
 | 
				
			||||||
 | 
										       ps_mode_str, ret);
 | 
				
			||||||
 | 
							} else if (!bss_conf->ps &&
 | 
				
			||||||
 | 
								   test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
 | 
				
			||||||
 | 
								wl1271_debug(DEBUG_PSM, "auto ps disabled");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ret = wl1271_ps_set_mode(wl, wlvif,
 | 
				
			||||||
 | 
											 STATION_ACTIVE_MODE);
 | 
				
			||||||
 | 
								if (ret < 0)
 | 
				
			||||||
 | 
									wl1271_warning("exit auto ps failed %d", ret);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Handle new association with HT. Do this after join. */
 | 
						/* Handle new association with HT. Do this after join. */
 | 
				
			||||||
	if (sta_exists &&
 | 
						if (sta_exists &&
 | 
				
			||||||
	    (changed & BSS_CHANGED_HT)) {
 | 
						    (changed & BSS_CHANGED_HT)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue