static int iwm_wext_siwpower(struct net_device *dev, struct iw_request_info *info, struct iw_param *wrq, char *extra) { struct iwm_priv *iwm = ndev_to_iwm(dev); u32 power_index; if (wrq->disabled) { power_index = IWM_POWER_INDEX_MIN; goto set; } else power_index = IWM_POWER_INDEX_DEFAULT; switch (wrq->flags & IW_POWER_MODE) { case IW_POWER_ON: case IW_POWER_MODE: case IW_POWER_ALL_R: break; default: return -EINVAL; } set: if (power_index == iwm->conf.power_index) return 0; iwm->conf.power_index = power_index; return iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_POWER_INDEX, iwm->conf.power_index); }
int iwm_send_umac_config(struct iwm_priv *iwm, __le32 reset_flags) { int ret; /* Use UMAC default values */ ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_POWER_INDEX, iwm->conf.power_index); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, CFG_FRAG_THRESHOLD, iwm->conf.frag_threshold); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_RTS_THRESHOLD, iwm->conf.rts_threshold); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_CTS_TO_SELF, iwm->conf.cts_to_self); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_COEX_MODE, iwm->conf.coexist_mode); if (ret < 0) return ret; /* ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_ASSOCIATION_TIMEOUT, iwm->conf.assoc_timeout); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_ROAM_TIMEOUT, iwm->conf.roam_timeout); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_WIRELESS_MODE, WIRELESS_MODE_11A | WIRELESS_MODE_11G); if (ret < 0) return ret; */ ret = iwm_umac_set_config_var(iwm, CFG_NET_ADDR, iwm_to_ndev(iwm)->dev_addr, ETH_ALEN); if (ret < 0) return ret; /* UMAC PM static configurations */ ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_LEGACY_RX_TIMEOUT, 0x12C); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_LEGACY_TX_TIMEOUT, 0x15E); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_CTRL_FLAGS, 0x30001); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_KEEP_ALIVE_IN_BEACONS, 0x80); if (ret < 0) return ret; /* reset UMAC */ ret = iwm_send_umac_reset(iwm, reset_flags, 1); if (ret < 0) return ret; ret = iwm_notif_handle(iwm, UMAC_CMD_OPCODE_RESET, IWM_SRC_UMAC, WAIT_NOTIF_TIMEOUT); if (ret) { IWM_ERR(iwm, "Wait for UMAC RESET timeout\n"); return ret; } return ret; }
int iwm_send_umac_config(struct iwm_priv *iwm, __le32 reset_flags) { int ret; /* */ ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_POWER_INDEX, iwm->conf.power_index); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_FA_CFG_FIX, CFG_FRAG_THRESHOLD, iwm->conf.frag_threshold); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_RTS_THRESHOLD, iwm->conf.rts_threshold); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_CTS_TO_SELF, iwm->conf.cts_to_self); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_WIRELESS_MODE, iwm->conf.wireless_mode); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_COEX_MODE, modparam_wiwi); if (ret < 0) return ret; /* */ ret = iwm_umac_set_config_var(iwm, CFG_NET_ADDR, iwm_to_ndev(iwm)->dev_addr, ETH_ALEN); if (ret < 0) return ret; /* */ ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_LEGACY_RX_TIMEOUT, 0x12C); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_LEGACY_TX_TIMEOUT, 0x15E); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_CTRL_FLAGS, 0x1); if (ret < 0) return ret; ret = iwm_umac_set_config_fix(iwm, UMAC_PARAM_TBL_CFG_FIX, CFG_PM_KEEP_ALIVE_IN_BEACONS, 0x80); if (ret < 0) return ret; /* */ ret = iwm_send_umac_reset(iwm, reset_flags, 1); if (ret < 0) return ret; ret = iwm_notif_handle(iwm, UMAC_CMD_OPCODE_RESET, IWM_SRC_UMAC, WAIT_NOTIF_TIMEOUT); if (ret) { IWM_ERR(iwm, "Wait for UMAC RESET timeout\n"); return ret; } return ret; }