diff options
Diffstat (limited to 'drivers/net/wireless/wl12xx/wl1271_init.c')
| -rw-r--r-- | drivers/net/wireless/wl12xx/wl1271_init.c | 141 | 
1 files changed, 29 insertions, 112 deletions
diff --git a/drivers/net/wireless/wl12xx/wl1271_init.c b/drivers/net/wireless/wl12xx/wl1271_init.c index 490df217605..11249b436cf 100644 --- a/drivers/net/wireless/wl12xx/wl1271_init.c +++ b/drivers/net/wireless/wl12xx/wl1271_init.c @@ -59,6 +59,14 @@ static int wl1271_init_templates_config(struct wl1271 *wl)  	if (ret < 0)  		return ret; +	if (wl1271_11a_enabled()) { +		ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5, +				NULL, +				sizeof(struct wl12xx_probe_req_template)); +		if (ret < 0) +			return ret; +	} +  	ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, NULL,  				      sizeof(struct wl12xx_null_data_template));  	if (ret < 0) @@ -94,7 +102,7 @@ static int wl1271_init_rx_config(struct wl1271 *wl, u32 config, u32 filter)  {  	int ret; -	ret = wl1271_acx_rx_msdu_life_time(wl, RX_MSDU_LIFETIME_DEF); +	ret = wl1271_acx_rx_msdu_life_time(wl);  	if (ret < 0)  		return ret; @@ -117,7 +125,7 @@ static int wl1271_init_phy_config(struct wl1271 *wl)  	if (ret < 0)  		return ret; -	ret = wl1271_acx_group_address_tbl(wl); +	ret = wl1271_acx_group_address_tbl(wl, true, NULL, 0);  	if (ret < 0)  		return ret; @@ -125,7 +133,7 @@ static int wl1271_init_phy_config(struct wl1271 *wl)  	if (ret < 0)  		return ret; -	ret = wl1271_acx_rts_threshold(wl, RTS_THRESHOLD_DEF); +	ret = wl1271_acx_rts_threshold(wl, wl->conf.rx.rts_threshold);  	if (ret < 0)  		return ret; @@ -136,7 +144,8 @@ static int wl1271_init_beacon_filter(struct wl1271 *wl)  {  	int ret; -	ret = wl1271_acx_beacon_filter_opt(wl); +	/* disable beacon filtering at this stage */ +	ret = wl1271_acx_beacon_filter_opt(wl, false);  	if (ret < 0)  		return ret; @@ -184,118 +193,15 @@ static int wl1271_init_beacon_broadcast(struct wl1271 *wl)  	return 0;  } -static int wl1271_init_general_parms(struct wl1271 *wl) -{ -	struct wl1271_general_parms *gen_parms; -	int ret; - -	gen_parms = kzalloc(sizeof(*gen_parms), GFP_KERNEL); -	if (!gen_parms) -		return -ENOMEM; - -	gen_parms->id = TEST_CMD_INI_FILE_GENERAL_PARAM; - -	gen_parms->ref_clk = REF_CLK_38_4_E; -	/* FIXME: magic numbers */ -	gen_parms->settling_time = 5; -	gen_parms->clk_valid_on_wakeup = 0; -	gen_parms->dc2dcmode = 0; -	gen_parms->single_dual_band = 0; -	gen_parms->tx_bip_fem_autodetect = 1; -	gen_parms->tx_bip_fem_manufacturer = 1; -	gen_parms->settings = 1; - -	ret = wl1271_cmd_test(wl, gen_parms, sizeof(*gen_parms), 0); -	if (ret < 0) { -		wl1271_warning("CMD_INI_FILE_GENERAL_PARAM failed"); -		return ret; -	} - -	kfree(gen_parms); -	return 0; -} - -static int wl1271_init_radio_parms(struct wl1271 *wl) -{ -	/* -	 * FIXME: All these magic numbers should be moved to some place where -	 * they can be configured (separate file?) -	 */ - -	struct wl1271_radio_parms *radio_parms; -	int ret; -	u8 compensation[] = { 0xec, 0xf6, 0x00, 0x0c, 0x18, 0xf8, 0xfc, 0x00, -			      0x08, 0x10, 0xf0, 0xf8, 0x00, 0x0a, 0x14 }; - -	u8 tx_rate_limits_normal[]   = { 0x1e, 0x1f, 0x22, 0x24, 0x28, 0x29 }; -	u8 tx_rate_limits_degraded[] = { 0x1b, 0x1c, 0x1e, 0x20, 0x24, 0x25 }; - -	u8 tx_channel_limits_11b[] = { 0x22, 0x50, 0x50, 0x50, -				       0x50, 0x50, 0x50, 0x50, -				       0x50, 0x50, 0x22, 0x50, -				       0x22, 0x50 }; - -	u8 tx_channel_limits_ofdm[] = { 0x20, 0x50, 0x50, 0x50, -					0x50, 0x50, 0x50, 0x50, -					0x50, 0x50, 0x20, 0x50, -					0x20, 0x50 }; - -	u8 tx_pdv_rate_offsets[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; - -	u8 tx_ibias[] = { 0x1a, 0x1a, 0x1a, 0x1a, 0x1a, 0x27 }; - -	radio_parms = kzalloc(sizeof(*radio_parms), GFP_KERNEL); -	if (!radio_parms) -		return -ENOMEM; - -	radio_parms->id = TEST_CMD_INI_FILE_RADIO_PARAM; - -	/* Static radio parameters */ -	radio_parms->rx_trace_loss = 10; -	radio_parms->tx_trace_loss = 10; -	memcpy(radio_parms->rx_rssi_and_proc_compens, compensation, -	       sizeof(compensation)); - -	/* We don't set the 5GHz -- N/A */ - -	/* Dynamic radio parameters */ -	radio_parms->tx_ref_pd_voltage = cpu_to_le16(0x24e); -	radio_parms->tx_ref_power = 0x78; -	radio_parms->tx_offset_db = 0x0; - -	memcpy(radio_parms->tx_rate_limits_normal, tx_rate_limits_normal, -	       sizeof(tx_rate_limits_normal)); -	memcpy(radio_parms->tx_rate_limits_degraded, tx_rate_limits_degraded, -	       sizeof(tx_rate_limits_degraded)); - -	memcpy(radio_parms->tx_channel_limits_11b, tx_channel_limits_11b, -	       sizeof(tx_channel_limits_11b)); -	memcpy(radio_parms->tx_channel_limits_ofdm, tx_channel_limits_ofdm, -	       sizeof(tx_channel_limits_ofdm)); -	memcpy(radio_parms->tx_pdv_rate_offsets, tx_pdv_rate_offsets, -	       sizeof(tx_pdv_rate_offsets)); -	memcpy(radio_parms->tx_ibias, tx_ibias, -	       sizeof(tx_ibias)); - -	radio_parms->rx_fem_insertion_loss = 0x14; - -	ret = wl1271_cmd_test(wl, radio_parms, sizeof(*radio_parms), 0); -	if (ret < 0) -		wl1271_warning("CMD_INI_FILE_RADIO_PARAM failed"); - -	kfree(radio_parms); -	return ret; -} -  int wl1271_hw_init(struct wl1271 *wl)  {  	int ret; -	ret = wl1271_init_general_parms(wl); +	ret = wl1271_cmd_general_parms(wl);  	if (ret < 0)  		return ret; -	ret = wl1271_init_radio_parms(wl); +	ret = wl1271_cmd_radio_parms(wl);  	if (ret < 0)  		return ret; @@ -311,8 +217,8 @@ int wl1271_hw_init(struct wl1271 *wl)  	/* RX config */  	ret = wl1271_init_rx_config(wl, -				       RX_CFG_PROMISCUOUS | RX_CFG_TSF, -				       RX_FILTER_OPTION_DEF); +				    RX_CFG_PROMISCUOUS | RX_CFG_TSF, +				    RX_FILTER_OPTION_DEF);  	/* RX_CONFIG_OPTION_ANY_DST_ANY_BSS,  	   RX_FILTER_OPTION_FILTER_ALL); */  	if (ret < 0) @@ -323,6 +229,11 @@ int wl1271_hw_init(struct wl1271 *wl)  	if (ret < 0)  		goto out_free_memmap; +	/* Initialize connection monitoring thresholds */ +	ret = wl1271_acx_conn_monit_params(wl); +	if (ret < 0) +		goto out_free_memmap; +  	/* Beacon filtering */  	ret = wl1271_init_beacon_filter(wl);  	if (ret < 0) @@ -369,7 +280,7 @@ int wl1271_hw_init(struct wl1271 *wl)  		goto out_free_memmap;  	/* Configure TX rate classes */ -	ret = wl1271_acx_rate_policies(wl); +	ret = wl1271_acx_rate_policies(wl, CONF_TX_RATE_MASK_ALL);  	if (ret < 0)  		goto out_free_memmap; @@ -388,10 +299,16 @@ int wl1271_hw_init(struct wl1271 *wl)  	if (ret < 0)  		goto out_free_memmap; +	/* Configure smart reflex */ +	ret = wl1271_acx_smart_reflex(wl); +	if (ret < 0) +		goto out_free_memmap; +  	return 0;   out_free_memmap:  	kfree(wl->target_mem_map); +	wl->target_mem_map = NULL;  	return ret;  }  |