@ -153,7 +153,324 @@ enum wl18xx_hw_rates {
WL18XX_CONF_HW_RXTX_RATE_MAX ,
} ;
static struct wl18xx_conf wl18xx_default_conf = {
static struct wlcore_conf wl18xx_conf = {
. sg = {
. params = {
[ CONF_SG_ACL_BT_MASTER_MIN_BR ] = 10 ,
[ CONF_SG_ACL_BT_MASTER_MAX_BR ] = 180 ,
[ CONF_SG_ACL_BT_SLAVE_MIN_BR ] = 10 ,
[ CONF_SG_ACL_BT_SLAVE_MAX_BR ] = 180 ,
[ CONF_SG_ACL_BT_MASTER_MIN_EDR ] = 10 ,
[ CONF_SG_ACL_BT_MASTER_MAX_EDR ] = 80 ,
[ CONF_SG_ACL_BT_SLAVE_MIN_EDR ] = 10 ,
[ CONF_SG_ACL_BT_SLAVE_MAX_EDR ] = 80 ,
[ CONF_SG_ACL_WLAN_PS_MASTER_BR ] = 8 ,
[ CONF_SG_ACL_WLAN_PS_SLAVE_BR ] = 8 ,
[ CONF_SG_ACL_WLAN_PS_MASTER_EDR ] = 20 ,
[ CONF_SG_ACL_WLAN_PS_SLAVE_EDR ] = 20 ,
[ CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_BR ] = 20 ,
[ CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_BR ] = 35 ,
[ CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_BR ] = 16 ,
[ CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_BR ] = 35 ,
[ CONF_SG_ACL_WLAN_ACTIVE_MASTER_MIN_EDR ] = 32 ,
[ CONF_SG_ACL_WLAN_ACTIVE_MASTER_MAX_EDR ] = 50 ,
[ CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MIN_EDR ] = 28 ,
[ CONF_SG_ACL_WLAN_ACTIVE_SLAVE_MAX_EDR ] = 50 ,
[ CONF_SG_ACL_ACTIVE_SCAN_WLAN_BR ] = 10 ,
[ CONF_SG_ACL_ACTIVE_SCAN_WLAN_EDR ] = 20 ,
[ CONF_SG_ACL_PASSIVE_SCAN_BT_BR ] = 75 ,
[ CONF_SG_ACL_PASSIVE_SCAN_WLAN_BR ] = 15 ,
[ CONF_SG_ACL_PASSIVE_SCAN_BT_EDR ] = 27 ,
[ CONF_SG_ACL_PASSIVE_SCAN_WLAN_EDR ] = 17 ,
/* active scan params */
[ CONF_SG_AUTO_SCAN_PROBE_REQ ] = 170 ,
[ CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3 ] = 50 ,
[ CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP ] = 100 ,
/* passive scan params */
[ CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_BR ] = 800 ,
[ CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP_EDR ] = 200 ,
[ CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3 ] = 200 ,
/* passive scan in dual antenna params */
[ CONF_SG_CONSECUTIVE_HV3_IN_PASSIVE_SCAN ] = 0 ,
[ CONF_SG_BCN_HV3_COLLISION_THRESH_IN_PASSIVE_SCAN ] = 0 ,
[ CONF_SG_TX_RX_PROTECTION_BWIDTH_IN_PASSIVE_SCAN ] = 0 ,
/* general params */
[ CONF_SG_STA_FORCE_PS_IN_BT_SCO ] = 1 ,
[ CONF_SG_ANTENNA_CONFIGURATION ] = 0 ,
[ CONF_SG_BEACON_MISS_PERCENT ] = 60 ,
[ CONF_SG_DHCP_TIME ] = 5000 ,
[ CONF_SG_RXT ] = 1200 ,
[ CONF_SG_TXT ] = 1000 ,
[ CONF_SG_ADAPTIVE_RXT_TXT ] = 1 ,
[ CONF_SG_GENERAL_USAGE_BIT_MAP ] = 3 ,
[ CONF_SG_HV3_MAX_SERVED ] = 6 ,
[ CONF_SG_PS_POLL_TIMEOUT ] = 10 ,
[ CONF_SG_UPSD_TIMEOUT ] = 10 ,
[ CONF_SG_CONSECUTIVE_CTS_THRESHOLD ] = 2 ,
[ CONF_SG_STA_RX_WINDOW_AFTER_DTIM ] = 5 ,
[ CONF_SG_STA_CONNECTION_PROTECTION_TIME ] = 30 ,
/* AP params */
[ CONF_AP_BEACON_MISS_TX ] = 3 ,
[ CONF_AP_RX_WINDOW_AFTER_BEACON ] = 10 ,
[ CONF_AP_BEACON_WINDOW_INTERVAL ] = 2 ,
[ CONF_AP_CONNECTION_PROTECTION_TIME ] = 0 ,
[ CONF_AP_BT_ACL_VAL_BT_SERVE_TIME ] = 25 ,
[ CONF_AP_BT_ACL_VAL_WL_SERVE_TIME ] = 25 ,
/* CTS Diluting params */
[ CONF_SG_CTS_DILUTED_BAD_RX_PACKETS_TH ] = 0 ,
[ CONF_SG_CTS_CHOP_IN_DUAL_ANT_SCO_MASTER ] = 0 ,
} ,
. state = CONF_SG_PROTECTIVE ,
} ,
. rx = {
. rx_msdu_life_time = 512000 ,
. packet_detection_threshold = 0 ,
. ps_poll_timeout = 15 ,
. upsd_timeout = 15 ,
. rts_threshold = IEEE80211_MAX_RTS_THRESHOLD ,
. rx_cca_threshold = 0 ,
. irq_blk_threshold = 0xFFFF ,
. irq_pkt_threshold = 0 ,
. irq_timeout = 600 ,
. queue_type = CONF_RX_QUEUE_TYPE_LOW_PRIORITY ,
} ,
. tx = {
. tx_energy_detection = 0 ,
. sta_rc_conf = {
. enabled_rates = 0 ,
. short_retry_limit = 10 ,
. long_retry_limit = 10 ,
. aflags = 0 ,
} ,
. ac_conf_count = 4 ,
. ac_conf = {
[ CONF_TX_AC_BE ] = {
. ac = CONF_TX_AC_BE ,
. cw_min = 15 ,
. cw_max = 63 ,
. aifsn = 3 ,
. tx_op_limit = 0 ,
} ,
[ CONF_TX_AC_BK ] = {
. ac = CONF_TX_AC_BK ,
. cw_min = 15 ,
. cw_max = 63 ,
. aifsn = 7 ,
. tx_op_limit = 0 ,
} ,
[ CONF_TX_AC_VI ] = {
. ac = CONF_TX_AC_VI ,
. cw_min = 15 ,
. cw_max = 63 ,
. aifsn = CONF_TX_AIFS_PIFS ,
. tx_op_limit = 3008 ,
} ,
[ CONF_TX_AC_VO ] = {
. ac = CONF_TX_AC_VO ,
. cw_min = 15 ,
. cw_max = 63 ,
. aifsn = CONF_TX_AIFS_PIFS ,
. tx_op_limit = 1504 ,
} ,
} ,
. max_tx_retries = 100 ,
. ap_aging_period = 300 ,
. tid_conf_count = 4 ,
. tid_conf = {
[ CONF_TX_AC_BE ] = {
. queue_id = CONF_TX_AC_BE ,
. channel_type = CONF_CHANNEL_TYPE_EDCF ,
. tsid = CONF_TX_AC_BE ,
. ps_scheme = CONF_PS_SCHEME_LEGACY ,
. ack_policy = CONF_ACK_POLICY_LEGACY ,
. apsd_conf = { 0 , 0 } ,
} ,
[ CONF_TX_AC_BK ] = {
. queue_id = CONF_TX_AC_BK ,
. channel_type = CONF_CHANNEL_TYPE_EDCF ,
. tsid = CONF_TX_AC_BK ,
. ps_scheme = CONF_PS_SCHEME_LEGACY ,
. ack_policy = CONF_ACK_POLICY_LEGACY ,
. apsd_conf = { 0 , 0 } ,
} ,
[ CONF_TX_AC_VI ] = {
. queue_id = CONF_TX_AC_VI ,
. channel_type = CONF_CHANNEL_TYPE_EDCF ,
. tsid = CONF_TX_AC_VI ,
. ps_scheme = CONF_PS_SCHEME_LEGACY ,
. ack_policy = CONF_ACK_POLICY_LEGACY ,
. apsd_conf = { 0 , 0 } ,
} ,
[ CONF_TX_AC_VO ] = {
. queue_id = CONF_TX_AC_VO ,
. channel_type = CONF_CHANNEL_TYPE_EDCF ,
. tsid = CONF_TX_AC_VO ,
. ps_scheme = CONF_PS_SCHEME_LEGACY ,
. ack_policy = CONF_ACK_POLICY_LEGACY ,
. apsd_conf = { 0 , 0 } ,
} ,
} ,
. frag_threshold = IEEE80211_MAX_FRAG_THRESHOLD ,
. tx_compl_timeout = 350 ,
. tx_compl_threshold = 10 ,
. basic_rate = CONF_HW_BIT_RATE_1MBPS ,
. basic_rate_5 = CONF_HW_BIT_RATE_6MBPS ,
. tmpl_short_retry_limit = 10 ,
. tmpl_long_retry_limit = 10 ,
. tx_watchdog_timeout = 5000 ,
} ,
. conn = {
. wake_up_event = CONF_WAKE_UP_EVENT_DTIM ,
. listen_interval = 1 ,
. suspend_wake_up_event = CONF_WAKE_UP_EVENT_N_DTIM ,
. suspend_listen_interval = 3 ,
. bcn_filt_mode = CONF_BCN_FILT_MODE_ENABLED ,
. bcn_filt_ie_count = 2 ,
. bcn_filt_ie = {
[ 0 ] = {
. ie = WLAN_EID_CHANNEL_SWITCH ,
. rule = CONF_BCN_RULE_PASS_ON_APPEARANCE ,
} ,
[ 1 ] = {
. ie = WLAN_EID_HT_OPERATION ,
. rule = CONF_BCN_RULE_PASS_ON_CHANGE ,
} ,
} ,
. synch_fail_thold = 10 ,
. bss_lose_timeout = 100 ,
. beacon_rx_timeout = 10000 ,
. broadcast_timeout = 20000 ,
. rx_broadcast_in_ps = 1 ,
. ps_poll_threshold = 10 ,
. bet_enable = CONF_BET_MODE_ENABLE ,
. bet_max_consecutive = 50 ,
. psm_entry_retries = 8 ,
. psm_exit_retries = 16 ,
. psm_entry_nullfunc_retries = 3 ,
. dynamic_ps_timeout = 40 ,
. forced_ps = false ,
. keep_alive_interval = 55000 ,
. max_listen_interval = 20 ,
} ,
. itrim = {
. enable = false ,
. timeout = 50000 ,
} ,
. pm_config = {
. host_clk_settling_time = 5000 ,
. host_fast_wakeup_support = false
} ,
. roam_trigger = {
. trigger_pacing = 1 ,
. avg_weight_rssi_beacon = 20 ,
. avg_weight_rssi_data = 10 ,
. avg_weight_snr_beacon = 20 ,
. avg_weight_snr_data = 10 ,
} ,
. scan = {
. min_dwell_time_active = 7500 ,
. max_dwell_time_active = 30000 ,
. min_dwell_time_passive = 100000 ,
. max_dwell_time_passive = 100000 ,
. num_probe_reqs = 2 ,
. split_scan_timeout = 50000 ,
} ,
. sched_scan = {
/*
* Values are in TU / 1000 but since sched scan FW command
* params are in TUs rounding up may occur .
*/
. base_dwell_time = 7500 ,
. max_dwell_time_delta = 22500 ,
/* based on 250bits per probe @1Mbps */
. dwell_time_delta_per_probe = 2000 ,
/* based on 250bits per probe @6Mbps (plus a bit more) */
. dwell_time_delta_per_probe_5 = 350 ,
. dwell_time_passive = 100000 ,
. dwell_time_dfs = 150000 ,
. num_probe_reqs = 2 ,
. rssi_threshold = - 90 ,
. snr_threshold = 0 ,
} ,
. ht = {
. rx_ba_win_size = 10 ,
. tx_ba_win_size = 10 ,
. inactivity_timeout = 10000 ,
. tx_ba_tid_bitmap = CONF_TX_BA_ENABLED_TID_BITMAP ,
} ,
. mem = {
. num_stations = 1 ,
. ssid_profiles = 1 ,
. rx_block_num = 40 ,
. tx_min_block_num = 40 ,
. dynamic_memory = 1 ,
. min_req_tx_blocks = 45 ,
. min_req_rx_blocks = 22 ,
. tx_min = 27 ,
} ,
. fm_coex = {
. enable = true ,
. swallow_period = 5 ,
. n_divider_fref_set_1 = 0xff , /* default */
. n_divider_fref_set_2 = 12 ,
. m_divider_fref_set_1 = 148 ,
. m_divider_fref_set_2 = 0xffff , /* default */
. coex_pll_stabilization_time = 0xffffffff , /* default */
. ldo_stabilization_time = 0xffff , /* default */
. fm_disturbed_band_margin = 0xff , /* default */
. swallow_clk_diff = 0xff , /* default */
} ,
. rx_streaming = {
. duration = 150 ,
. queues = 0x1 ,
. interval = 20 ,
. always = 0 ,
} ,
. fwlog = {
. mode = WL12XX_FWLOG_ON_DEMAND ,
. mem_blocks = 2 ,
. severity = 0 ,
. timestamp = WL12XX_FWLOG_TIMESTAMP_DISABLED ,
. output = WL12XX_FWLOG_OUTPUT_HOST ,
. threshold = 0 ,
} ,
. rate = {
. rate_retry_score = 32000 ,
. per_add = 8192 ,
. per_th1 = 2048 ,
. per_th2 = 4096 ,
. max_per = 8100 ,
. inverse_curiosity_factor = 5 ,
. tx_fail_low_th = 4 ,
. tx_fail_high_th = 10 ,
. per_alpha_shift = 4 ,
. per_add_shift = 13 ,
. per_beta1_shift = 10 ,
. per_beta2_shift = 8 ,
. rate_check_up = 2 ,
. rate_check_down = 12 ,
. rate_retry_policy = {
0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 , 0x00 , 0x00 ,
0x00 , 0x00 , 0x00 ,
} ,
} ,
. hangover = {
. recover_time = 0 ,
. hangover_period = 20 ,
. dynamic_mode = 1 ,
. early_termination_mode = 1 ,
. max_period = 20 ,
. min_period = 1 ,
. increase_delta = 1 ,
. decrease_delta = 2 ,
. quiet_time = 4 ,
. increase_time = 1 ,
. window_size = 16 ,
} ,
} ;
static struct wl18xx_priv_conf wl18xx_default_priv_conf = {
. phy = {
. phy_standalone = 0x00 ,
. primary_clock_setting_time = 0x05 ,
@ -323,42 +640,43 @@ static void wl18xx_pre_upload(struct wl1271 *wl)
static void wl18xx_set_mac_and_phy ( struct wl1271 * wl )
{
struct wl18xx_priv * priv = wl - > priv ;
struct wl18xx_conf_phy * phy = & priv - > conf . phy ;
struct wl18xx_mac_and_phy_params params ;
memset ( & params , 0 , sizeof ( params ) ) ;
params . phy_standalone = wl18xx_default_conf . phy . phy_standalone ;
params . rdl = wl18xx_default_conf . phy . rdl ;
params . enable_clpc = wl18xx_default_conf . phy . enable_clpc ;
params . phy_standalone = phy - > phy_standalone ;
params . rdl = phy - > rdl ;
params . enable_clpc = phy - > enable_clpc ;
params . enable_tx_low_pwr_on_siso_rdl =
wl18xx_default_conf . phy . enable_tx_low_pwr_on_siso_rdl ;
params . auto_detect = wl18xx_default_conf . phy . auto_detect ;
params . dedicated_fem = wl18xx_default_conf . phy . dedicated_fem ;
params . low_band_component = wl18xx_default_conf . phy . low_band_component ;
phy - > enable_tx_low_pwr_on_siso_rdl ;
params . auto_detect = phy - > auto_detect ;
params . dedicated_fem = phy - > dedicated_fem ;
params . low_band_component = phy - > low_band_component ;
params . low_band_component_type =
wl18xx_default_conf . phy . low_band_component_type ;
params . high_band_component =
wl18xx_default_conf . phy . high_band_component ;
phy - > low_band_component_type ;
params . high_band_component = phy - > high_band_component ;
params . high_band_component_type =
wl18xx_default_conf . phy . high_band_component_type ;
phy - > high_band_component_type ;
params . number_of_assembled_ant2_4 =
wl18xx_default_conf . phy . number_of_assembled_ant2_4 ;
phy - > number_of_assembled_ant2_4 ;
params . number_of_assembled_ant5 =
wl18xx_default_conf . phy . number_of_assembled_ant5 ;
params . external_pa_dc2dc = wl18xx_default_conf . phy . external_pa_dc2dc ;
params . tcxo_ldo_voltage = wl18xx_default_conf . phy . tcxo_ldo_voltage ;
params . xtal_itrim_val = wl18xx_default_conf . phy . xtal_itrim_val ;
params . srf_state = wl18xx_default_conf . phy . srf_state ;
params . io_configuration = wl18xx_default_conf . phy . io_configuration ;
params . sdio_configuration = wl18xx_default_conf . phy . sdio_configuration ;
params . settings = wl18xx_default_conf . phy . settings ;
params . rx_profile = wl18xx_default_conf . phy . rx_profile ;
phy - > number_of_assembled_ant5 ;
params . external_pa_dc2dc = phy - > external_pa_dc2dc ;
params . tcxo_ldo_voltage = phy - > tcxo_ldo_voltage ;
params . xtal_itrim_val = phy - > xtal_itrim_val ;
params . srf_state = phy - > srf_state ;
params . io_configuration = phy - > io_configuration ;
params . sdio_configuration = phy - > sdio_configuration ;
params . settings = phy - > settings ;
params . rx_profile = phy - > rx_profile ;
params . primary_clock_setting_time =
wl18xx_default_conf . phy . primary_clock_setting_time ;
phy - > primary_clock_setting_time ;
params . clock_valid_on_wake_up =
wl18xx_default_conf . phy . clock_valid_on_wake_up ;
phy - > clock_valid_on_wake_up ;
params . secondary_clock_setting_time =
wl18xx_default_conf . phy . secondary_clock_setting_time ;
phy - > secondary_clock_setting_time ;
/* TODO: hardcoded for now */
params . board_type = BOARD_TYPE_DVP_EVB_18XX ;
@ -544,6 +862,17 @@ static void wl18xx_set_rx_csum(struct wl1271 *wl,
skb - > ip_summed = CHECKSUM_UNNECESSARY ;
}
static void wl18xx_conf_init ( struct wl1271 * wl )
{
struct wl18xx_priv * priv = wl - > priv ;
/* apply driver default configuration */
memcpy ( & wl - > conf , & wl18xx_conf , sizeof ( wl18xx_conf ) ) ;
/* apply default private configuration */
memcpy ( & priv - > conf , & wl18xx_default_priv_conf , sizeof ( priv - > conf ) ) ;
}
static struct wlcore_ops wl18xx_ops = {
. identify_chip = wl18xx_identify_chip ,
. boot = wl18xx_boot ,
@ -584,6 +913,8 @@ int __devinit wl18xx_probe(struct platform_device *pdev)
wl - > hw_tx_rate_tbl_size = WL18XX_CONF_HW_RXTX_RATE_MAX ;
wl - > hw_min_ht_rate = WL18XX_CONF_HW_RXTX_RATE_MCS0 ;
wl - > fw_status_priv_len = sizeof ( struct wl18xx_fw_status_priv ) ;
wl18xx_conf_init ( wl ) ;
return wlcore_probe ( wl , pdev ) ;
}