diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-calib.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-calib.c | 75 |
1 files changed, 71 insertions, 4 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-calib.c b/drivers/net/wireless/iwlwifi/iwl-calib.c index ef49440bd7f6..72fbf47229db 100644 --- a/drivers/net/wireless/iwlwifi/iwl-calib.c +++ b/drivers/net/wireless/iwlwifi/iwl-calib.c | |||
@@ -66,6 +66,66 @@ | |||
66 | #include "iwl-core.h" | 66 | #include "iwl-core.h" |
67 | #include "iwl-calib.h" | 67 | #include "iwl-calib.h" |
68 | 68 | ||
69 | /***************************************************************************** | ||
70 | * INIT calibrations framework | ||
71 | *****************************************************************************/ | ||
72 | |||
73 | int iwl_send_calib_results(struct iwl_priv *priv) | ||
74 | { | ||
75 | int ret = 0; | ||
76 | int i = 0; | ||
77 | |||
78 | struct iwl_host_cmd hcmd = { | ||
79 | .id = REPLY_PHY_CALIBRATION_CMD, | ||
80 | .meta.flags = CMD_SIZE_HUGE, | ||
81 | }; | ||
82 | |||
83 | for (i = 0; i < IWL_CALIB_MAX; i++) | ||
84 | if (priv->calib_results[i].buf) { | ||
85 | hcmd.len = priv->calib_results[i].buf_len; | ||
86 | hcmd.data = priv->calib_results[i].buf; | ||
87 | ret = iwl_send_cmd_sync(priv, &hcmd); | ||
88 | if (ret) | ||
89 | goto err; | ||
90 | } | ||
91 | |||
92 | return 0; | ||
93 | err: | ||
94 | IWL_ERROR("Error %d iteration %d\n", ret, i); | ||
95 | return ret; | ||
96 | } | ||
97 | EXPORT_SYMBOL(iwl_send_calib_results); | ||
98 | |||
99 | int iwl_calib_set(struct iwl_calib_result *res, const u8 *buf, int len) | ||
100 | { | ||
101 | if (res->buf_len != len) { | ||
102 | kfree(res->buf); | ||
103 | res->buf = kzalloc(len, GFP_ATOMIC); | ||
104 | } | ||
105 | if (unlikely(res->buf == NULL)) | ||
106 | return -ENOMEM; | ||
107 | |||
108 | res->buf_len = len; | ||
109 | memcpy(res->buf, buf, len); | ||
110 | return 0; | ||
111 | } | ||
112 | EXPORT_SYMBOL(iwl_calib_set); | ||
113 | |||
114 | void iwl_calib_free_results(struct iwl_priv *priv) | ||
115 | { | ||
116 | int i; | ||
117 | |||
118 | for (i = 0; i < IWL_CALIB_MAX; i++) { | ||
119 | kfree(priv->calib_results[i].buf); | ||
120 | priv->calib_results[i].buf = NULL; | ||
121 | priv->calib_results[i].buf_len = 0; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | /***************************************************************************** | ||
126 | * RUNTIME calibrations framework | ||
127 | *****************************************************************************/ | ||
128 | |||
69 | /* "false alarms" are signals that our DSP tries to lock onto, | 129 | /* "false alarms" are signals that our DSP tries to lock onto, |
70 | * but then determines that they are either noise, or transmissions | 130 | * but then determines that they are either noise, or transmissions |
71 | * from a distant wireless network (also "noise", really) that get | 131 | * from a distant wireless network (also "noise", really) that get |
@@ -748,13 +808,11 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, | |||
748 | } | 808 | } |
749 | } | 809 | } |
750 | 810 | ||
811 | /* Save for use within RXON, TX, SCAN commands, etc. */ | ||
812 | priv->chain_noise_data.active_chains = active_chains; | ||
751 | IWL_DEBUG_CALIB("active_chains (bitwise) = 0x%x\n", | 813 | IWL_DEBUG_CALIB("active_chains (bitwise) = 0x%x\n", |
752 | active_chains); | 814 | active_chains); |
753 | 815 | ||
754 | /* Save for use within RXON, TX, SCAN commands, etc. */ | ||
755 | /*priv->valid_antenna = active_chains;*/ | ||
756 | /*FIXME: should be reflected in RX chains in RXON */ | ||
757 | |||
758 | /* Analyze noise for rx balance */ | 816 | /* Analyze noise for rx balance */ |
759 | average_noise[0] = ((data->chain_noise_a)/CAL_NUM_OF_BEACONS); | 817 | average_noise[0] = ((data->chain_noise_a)/CAL_NUM_OF_BEACONS); |
760 | average_noise[1] = ((data->chain_noise_b)/CAL_NUM_OF_BEACONS); | 818 | average_noise[1] = ((data->chain_noise_b)/CAL_NUM_OF_BEACONS); |
@@ -779,6 +837,15 @@ void iwl_chain_noise_calibration(struct iwl_priv *priv, | |||
779 | 837 | ||
780 | priv->cfg->ops->utils->gain_computation(priv, average_noise, | 838 | priv->cfg->ops->utils->gain_computation(priv, average_noise, |
781 | min_average_noise_antenna_i, min_average_noise); | 839 | min_average_noise_antenna_i, min_average_noise); |
840 | |||
841 | /* Some power changes may have been made during the calibration. | ||
842 | * Update and commit the RXON | ||
843 | */ | ||
844 | if (priv->cfg->ops->lib->update_chain_flags) | ||
845 | priv->cfg->ops->lib->update_chain_flags(priv); | ||
846 | |||
847 | data->state = IWL_CHAIN_NOISE_DONE; | ||
848 | iwl_power_enable_management(priv); | ||
782 | } | 849 | } |
783 | EXPORT_SYMBOL(iwl_chain_noise_calibration); | 850 | EXPORT_SYMBOL(iwl_chain_noise_calibration); |
784 | 851 | ||