mirror of https://gitee.com/openkylin/linux.git
Merge branch 'wireless-next-2.6' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-2.6
This commit is contained in:
commit
1d7d969dd0
|
@ -22,5 +22,6 @@ iwlagn-$(CONFIG_IWL5000) += iwl-1000.o
|
||||||
# 3945
|
# 3945
|
||||||
obj-$(CONFIG_IWL3945) += iwl3945.o
|
obj-$(CONFIG_IWL3945) += iwl3945.o
|
||||||
iwl3945-objs := iwl3945-base.o iwl-3945.o iwl-3945-rs.o iwl-3945-led.o
|
iwl3945-objs := iwl3945-base.o iwl-3945.o iwl-3945-rs.o iwl-3945-led.o
|
||||||
|
iwl3945-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-3945-debugfs.o
|
||||||
|
|
||||||
ccflags-y += -D__CHECK_ENDIAN__
|
ccflags-y += -D__CHECK_ENDIAN__
|
||||||
|
|
|
@ -282,7 +282,6 @@ struct iwl_cfg iwl1000_bg_cfg = {
|
||||||
.use_bsm = false,
|
.use_bsm = false,
|
||||||
.max_ll_items = OTP_MAX_LL_ITEMS_1000,
|
.max_ll_items = OTP_MAX_LL_ITEMS_1000,
|
||||||
.shadow_ram_support = false,
|
.shadow_ram_support = false,
|
||||||
.ht_greenfield_support = true,
|
|
||||||
.led_compensation = 51,
|
.led_compensation = 51,
|
||||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
.support_ct_kill_exit = true,
|
.support_ct_kill_exit = true,
|
||||||
|
|
|
@ -0,0 +1,500 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* GPL LICENSE SUMMARY
|
||||||
|
*
|
||||||
|
* Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
|
||||||
|
* USA
|
||||||
|
*
|
||||||
|
* The full GNU General Public License is included in this distribution
|
||||||
|
* in the file called LICENSE.GPL.
|
||||||
|
*
|
||||||
|
* Contact Information:
|
||||||
|
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||||
|
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "iwl-3945-debugfs.h"
|
||||||
|
|
||||||
|
ssize_t iwl3945_ucode_rx_stats_read(struct file *file,
|
||||||
|
char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct iwl_priv *priv = file->private_data;
|
||||||
|
int pos = 0;
|
||||||
|
char *buf;
|
||||||
|
int bufsz = sizeof(struct iwl39_statistics_rx_phy) * 40 +
|
||||||
|
sizeof(struct iwl39_statistics_rx_non_phy) * 40 + 400;
|
||||||
|
ssize_t ret;
|
||||||
|
struct iwl39_statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm;
|
||||||
|
struct iwl39_statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck;
|
||||||
|
struct iwl39_statistics_rx_non_phy *general, *accum_general;
|
||||||
|
struct iwl39_statistics_rx_non_phy *delta_general, *max_general;
|
||||||
|
|
||||||
|
if (!iwl_is_alive(priv))
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
|
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||||
|
if (!buf) {
|
||||||
|
IWL_ERR(priv, "Can not allocate Buffer\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The statistic information display here is based on
|
||||||
|
* the last statistics notification from uCode
|
||||||
|
* might not reflect the current uCode activity
|
||||||
|
*/
|
||||||
|
ofdm = &priv->_3945.statistics.rx.ofdm;
|
||||||
|
cck = &priv->_3945.statistics.rx.cck;
|
||||||
|
general = &priv->_3945.statistics.rx.general;
|
||||||
|
accum_ofdm = &priv->_3945.accum_statistics.rx.ofdm;
|
||||||
|
accum_cck = &priv->_3945.accum_statistics.rx.cck;
|
||||||
|
accum_general = &priv->_3945.accum_statistics.rx.general;
|
||||||
|
delta_ofdm = &priv->_3945.delta_statistics.rx.ofdm;
|
||||||
|
delta_cck = &priv->_3945.delta_statistics.rx.cck;
|
||||||
|
delta_general = &priv->_3945.delta_statistics.rx.general;
|
||||||
|
max_ofdm = &priv->_3945.max_delta.rx.ofdm;
|
||||||
|
max_cck = &priv->_3945.max_delta.rx.cck;
|
||||||
|
max_general = &priv->_3945.max_delta.rx.general;
|
||||||
|
|
||||||
|
pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos, "%-32s current"
|
||||||
|
"acumulative delta max\n",
|
||||||
|
"Statistics_Rx - OFDM:");
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"ina_cnt:", le32_to_cpu(ofdm->ina_cnt),
|
||||||
|
accum_ofdm->ina_cnt,
|
||||||
|
delta_ofdm->ina_cnt, max_ofdm->ina_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"fina_cnt:",
|
||||||
|
le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt,
|
||||||
|
delta_ofdm->fina_cnt, max_ofdm->fina_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n", "plcp_err:",
|
||||||
|
le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err,
|
||||||
|
delta_ofdm->plcp_err, max_ofdm->plcp_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n", "crc32_err:",
|
||||||
|
le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err,
|
||||||
|
delta_ofdm->crc32_err, max_ofdm->crc32_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n", "overrun_err:",
|
||||||
|
le32_to_cpu(ofdm->overrun_err),
|
||||||
|
accum_ofdm->overrun_err, delta_ofdm->overrun_err,
|
||||||
|
max_ofdm->overrun_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"early_overrun_err:",
|
||||||
|
le32_to_cpu(ofdm->early_overrun_err),
|
||||||
|
accum_ofdm->early_overrun_err,
|
||||||
|
delta_ofdm->early_overrun_err,
|
||||||
|
max_ofdm->early_overrun_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"crc32_good:", le32_to_cpu(ofdm->crc32_good),
|
||||||
|
accum_ofdm->crc32_good, delta_ofdm->crc32_good,
|
||||||
|
max_ofdm->crc32_good);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n", "false_alarm_cnt:",
|
||||||
|
le32_to_cpu(ofdm->false_alarm_cnt),
|
||||||
|
accum_ofdm->false_alarm_cnt,
|
||||||
|
delta_ofdm->false_alarm_cnt,
|
||||||
|
max_ofdm->false_alarm_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"fina_sync_err_cnt:",
|
||||||
|
le32_to_cpu(ofdm->fina_sync_err_cnt),
|
||||||
|
accum_ofdm->fina_sync_err_cnt,
|
||||||
|
delta_ofdm->fina_sync_err_cnt,
|
||||||
|
max_ofdm->fina_sync_err_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sfd_timeout:",
|
||||||
|
le32_to_cpu(ofdm->sfd_timeout),
|
||||||
|
accum_ofdm->sfd_timeout,
|
||||||
|
delta_ofdm->sfd_timeout,
|
||||||
|
max_ofdm->sfd_timeout);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"fina_timeout:",
|
||||||
|
le32_to_cpu(ofdm->fina_timeout),
|
||||||
|
accum_ofdm->fina_timeout,
|
||||||
|
delta_ofdm->fina_timeout,
|
||||||
|
max_ofdm->fina_timeout);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"unresponded_rts:",
|
||||||
|
le32_to_cpu(ofdm->unresponded_rts),
|
||||||
|
accum_ofdm->unresponded_rts,
|
||||||
|
delta_ofdm->unresponded_rts,
|
||||||
|
max_ofdm->unresponded_rts);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"rxe_frame_lmt_ovrun:",
|
||||||
|
le32_to_cpu(ofdm->rxe_frame_limit_overrun),
|
||||||
|
accum_ofdm->rxe_frame_limit_overrun,
|
||||||
|
delta_ofdm->rxe_frame_limit_overrun,
|
||||||
|
max_ofdm->rxe_frame_limit_overrun);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sent_ack_cnt:",
|
||||||
|
le32_to_cpu(ofdm->sent_ack_cnt),
|
||||||
|
accum_ofdm->sent_ack_cnt,
|
||||||
|
delta_ofdm->sent_ack_cnt,
|
||||||
|
max_ofdm->sent_ack_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sent_cts_cnt:",
|
||||||
|
le32_to_cpu(ofdm->sent_cts_cnt),
|
||||||
|
accum_ofdm->sent_cts_cnt,
|
||||||
|
delta_ofdm->sent_cts_cnt, max_ofdm->sent_cts_cnt);
|
||||||
|
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos, "%-32s current"
|
||||||
|
"acumulative delta max\n",
|
||||||
|
"Statistics_Rx - CCK:");
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"ina_cnt:",
|
||||||
|
le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt,
|
||||||
|
delta_cck->ina_cnt, max_cck->ina_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"fina_cnt:",
|
||||||
|
le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt,
|
||||||
|
delta_cck->fina_cnt, max_cck->fina_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"plcp_err:",
|
||||||
|
le32_to_cpu(cck->plcp_err), accum_cck->plcp_err,
|
||||||
|
delta_cck->plcp_err, max_cck->plcp_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"crc32_err:",
|
||||||
|
le32_to_cpu(cck->crc32_err), accum_cck->crc32_err,
|
||||||
|
delta_cck->crc32_err, max_cck->crc32_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"overrun_err:",
|
||||||
|
le32_to_cpu(cck->overrun_err),
|
||||||
|
accum_cck->overrun_err,
|
||||||
|
delta_cck->overrun_err, max_cck->overrun_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"early_overrun_err:",
|
||||||
|
le32_to_cpu(cck->early_overrun_err),
|
||||||
|
accum_cck->early_overrun_err,
|
||||||
|
delta_cck->early_overrun_err,
|
||||||
|
max_cck->early_overrun_err);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"crc32_good:",
|
||||||
|
le32_to_cpu(cck->crc32_good), accum_cck->crc32_good,
|
||||||
|
delta_cck->crc32_good,
|
||||||
|
max_cck->crc32_good);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"false_alarm_cnt:",
|
||||||
|
le32_to_cpu(cck->false_alarm_cnt),
|
||||||
|
accum_cck->false_alarm_cnt,
|
||||||
|
delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"fina_sync_err_cnt:",
|
||||||
|
le32_to_cpu(cck->fina_sync_err_cnt),
|
||||||
|
accum_cck->fina_sync_err_cnt,
|
||||||
|
delta_cck->fina_sync_err_cnt,
|
||||||
|
max_cck->fina_sync_err_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sfd_timeout:",
|
||||||
|
le32_to_cpu(cck->sfd_timeout),
|
||||||
|
accum_cck->sfd_timeout,
|
||||||
|
delta_cck->sfd_timeout, max_cck->sfd_timeout);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"fina_timeout:",
|
||||||
|
le32_to_cpu(cck->fina_timeout),
|
||||||
|
accum_cck->fina_timeout,
|
||||||
|
delta_cck->fina_timeout, max_cck->fina_timeout);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"unresponded_rts:",
|
||||||
|
le32_to_cpu(cck->unresponded_rts),
|
||||||
|
accum_cck->unresponded_rts,
|
||||||
|
delta_cck->unresponded_rts,
|
||||||
|
max_cck->unresponded_rts);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"rxe_frame_lmt_ovrun:",
|
||||||
|
le32_to_cpu(cck->rxe_frame_limit_overrun),
|
||||||
|
accum_cck->rxe_frame_limit_overrun,
|
||||||
|
delta_cck->rxe_frame_limit_overrun,
|
||||||
|
max_cck->rxe_frame_limit_overrun);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sent_ack_cnt:",
|
||||||
|
le32_to_cpu(cck->sent_ack_cnt),
|
||||||
|
accum_cck->sent_ack_cnt,
|
||||||
|
delta_cck->sent_ack_cnt,
|
||||||
|
max_cck->sent_ack_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sent_cts_cnt:",
|
||||||
|
le32_to_cpu(cck->sent_cts_cnt),
|
||||||
|
accum_cck->sent_cts_cnt,
|
||||||
|
delta_cck->sent_cts_cnt,
|
||||||
|
max_cck->sent_cts_cnt);
|
||||||
|
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos, "%-32s current"
|
||||||
|
"acumulative delta max\n",
|
||||||
|
"Statistics_Rx - GENERAL:");
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"bogus_cts:",
|
||||||
|
le32_to_cpu(general->bogus_cts),
|
||||||
|
accum_general->bogus_cts,
|
||||||
|
delta_general->bogus_cts, max_general->bogus_cts);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"bogus_ack:",
|
||||||
|
le32_to_cpu(general->bogus_ack),
|
||||||
|
accum_general->bogus_ack,
|
||||||
|
delta_general->bogus_ack, max_general->bogus_ack);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"non_bssid_frames:",
|
||||||
|
le32_to_cpu(general->non_bssid_frames),
|
||||||
|
accum_general->non_bssid_frames,
|
||||||
|
delta_general->non_bssid_frames,
|
||||||
|
max_general->non_bssid_frames);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"filtered_frames:",
|
||||||
|
le32_to_cpu(general->filtered_frames),
|
||||||
|
accum_general->filtered_frames,
|
||||||
|
delta_general->filtered_frames,
|
||||||
|
max_general->filtered_frames);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"non_channel_beacons:",
|
||||||
|
le32_to_cpu(general->non_channel_beacons),
|
||||||
|
accum_general->non_channel_beacons,
|
||||||
|
delta_general->non_channel_beacons,
|
||||||
|
max_general->non_channel_beacons);
|
||||||
|
|
||||||
|
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||||
|
kfree(buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t iwl3945_ucode_tx_stats_read(struct file *file,
|
||||||
|
char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct iwl_priv *priv = file->private_data;
|
||||||
|
int pos = 0;
|
||||||
|
char *buf;
|
||||||
|
int bufsz = (sizeof(struct iwl39_statistics_tx) * 48) + 250;
|
||||||
|
ssize_t ret;
|
||||||
|
struct iwl39_statistics_tx *tx, *accum_tx, *delta_tx, *max_tx;
|
||||||
|
|
||||||
|
if (!iwl_is_alive(priv))
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
|
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||||
|
if (!buf) {
|
||||||
|
IWL_ERR(priv, "Can not allocate Buffer\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The statistic information display here is based on
|
||||||
|
* the last statistics notification from uCode
|
||||||
|
* might not reflect the current uCode activity
|
||||||
|
*/
|
||||||
|
tx = &priv->_3945.statistics.tx;
|
||||||
|
accum_tx = &priv->_3945.accum_statistics.tx;
|
||||||
|
delta_tx = &priv->_3945.delta_statistics.tx;
|
||||||
|
max_tx = &priv->_3945.max_delta.tx;
|
||||||
|
pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos, "%-32s current"
|
||||||
|
"acumulative delta max\n",
|
||||||
|
"Statistics_Tx:");
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"preamble:",
|
||||||
|
le32_to_cpu(tx->preamble_cnt),
|
||||||
|
accum_tx->preamble_cnt,
|
||||||
|
delta_tx->preamble_cnt, max_tx->preamble_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"rx_detected_cnt:",
|
||||||
|
le32_to_cpu(tx->rx_detected_cnt),
|
||||||
|
accum_tx->rx_detected_cnt,
|
||||||
|
delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"bt_prio_defer_cnt:",
|
||||||
|
le32_to_cpu(tx->bt_prio_defer_cnt),
|
||||||
|
accum_tx->bt_prio_defer_cnt,
|
||||||
|
delta_tx->bt_prio_defer_cnt,
|
||||||
|
max_tx->bt_prio_defer_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"bt_prio_kill_cnt:",
|
||||||
|
le32_to_cpu(tx->bt_prio_kill_cnt),
|
||||||
|
accum_tx->bt_prio_kill_cnt,
|
||||||
|
delta_tx->bt_prio_kill_cnt,
|
||||||
|
max_tx->bt_prio_kill_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"few_bytes_cnt:",
|
||||||
|
le32_to_cpu(tx->few_bytes_cnt),
|
||||||
|
accum_tx->few_bytes_cnt,
|
||||||
|
delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"cts_timeout:",
|
||||||
|
le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout,
|
||||||
|
delta_tx->cts_timeout, max_tx->cts_timeout);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"ack_timeout:",
|
||||||
|
le32_to_cpu(tx->ack_timeout),
|
||||||
|
accum_tx->ack_timeout,
|
||||||
|
delta_tx->ack_timeout, max_tx->ack_timeout);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"expected_ack_cnt:",
|
||||||
|
le32_to_cpu(tx->expected_ack_cnt),
|
||||||
|
accum_tx->expected_ack_cnt,
|
||||||
|
delta_tx->expected_ack_cnt,
|
||||||
|
max_tx->expected_ack_cnt);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"actual_ack_cnt:",
|
||||||
|
le32_to_cpu(tx->actual_ack_cnt),
|
||||||
|
accum_tx->actual_ack_cnt,
|
||||||
|
delta_tx->actual_ack_cnt,
|
||||||
|
max_tx->actual_ack_cnt);
|
||||||
|
|
||||||
|
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||||
|
kfree(buf);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t iwl3945_ucode_general_stats_read(struct file *file,
|
||||||
|
char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
struct iwl_priv *priv = file->private_data;
|
||||||
|
int pos = 0;
|
||||||
|
char *buf;
|
||||||
|
int bufsz = sizeof(struct iwl39_statistics_general) * 10 + 300;
|
||||||
|
ssize_t ret;
|
||||||
|
struct iwl39_statistics_general *general, *accum_general;
|
||||||
|
struct iwl39_statistics_general *delta_general, *max_general;
|
||||||
|
struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg;
|
||||||
|
struct iwl39_statistics_div *div, *accum_div, *delta_div, *max_div;
|
||||||
|
|
||||||
|
if (!iwl_is_alive(priv))
|
||||||
|
return -EAGAIN;
|
||||||
|
|
||||||
|
buf = kzalloc(bufsz, GFP_KERNEL);
|
||||||
|
if (!buf) {
|
||||||
|
IWL_ERR(priv, "Can not allocate Buffer\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The statistic information display here is based on
|
||||||
|
* the last statistics notification from uCode
|
||||||
|
* might not reflect the current uCode activity
|
||||||
|
*/
|
||||||
|
general = &priv->_3945.statistics.general;
|
||||||
|
dbg = &priv->_3945.statistics.general.dbg;
|
||||||
|
div = &priv->_3945.statistics.general.div;
|
||||||
|
accum_general = &priv->_3945.accum_statistics.general;
|
||||||
|
delta_general = &priv->_3945.delta_statistics.general;
|
||||||
|
max_general = &priv->_3945.max_delta.general;
|
||||||
|
accum_dbg = &priv->_3945.accum_statistics.general.dbg;
|
||||||
|
delta_dbg = &priv->_3945.delta_statistics.general.dbg;
|
||||||
|
max_dbg = &priv->_3945.max_delta.general.dbg;
|
||||||
|
accum_div = &priv->_3945.accum_statistics.general.div;
|
||||||
|
delta_div = &priv->_3945.delta_statistics.general.div;
|
||||||
|
max_div = &priv->_3945.max_delta.general.div;
|
||||||
|
pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos, "%-32s current"
|
||||||
|
"acumulative delta max\n",
|
||||||
|
"Statistics_General:");
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"burst_check:",
|
||||||
|
le32_to_cpu(dbg->burst_check),
|
||||||
|
accum_dbg->burst_check,
|
||||||
|
delta_dbg->burst_check, max_dbg->burst_check);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"burst_count:",
|
||||||
|
le32_to_cpu(dbg->burst_count),
|
||||||
|
accum_dbg->burst_count,
|
||||||
|
delta_dbg->burst_count, max_dbg->burst_count);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"sleep_time:",
|
||||||
|
le32_to_cpu(general->sleep_time),
|
||||||
|
accum_general->sleep_time,
|
||||||
|
delta_general->sleep_time, max_general->sleep_time);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"slots_out:",
|
||||||
|
le32_to_cpu(general->slots_out),
|
||||||
|
accum_general->slots_out,
|
||||||
|
delta_general->slots_out, max_general->slots_out);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"slots_idle:",
|
||||||
|
le32_to_cpu(general->slots_idle),
|
||||||
|
accum_general->slots_idle,
|
||||||
|
delta_general->slots_idle, max_general->slots_idle);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos, "ttl_timestamp:\t\t\t%u\n",
|
||||||
|
le32_to_cpu(general->ttl_timestamp));
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"tx_on_a:",
|
||||||
|
le32_to_cpu(div->tx_on_a), accum_div->tx_on_a,
|
||||||
|
delta_div->tx_on_a, max_div->tx_on_a);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"tx_on_b:",
|
||||||
|
le32_to_cpu(div->tx_on_b), accum_div->tx_on_b,
|
||||||
|
delta_div->tx_on_b, max_div->tx_on_b);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"exec_time:",
|
||||||
|
le32_to_cpu(div->exec_time), accum_div->exec_time,
|
||||||
|
delta_div->exec_time, max_div->exec_time);
|
||||||
|
pos += scnprintf(buf + pos, bufsz - pos,
|
||||||
|
" %-30s %10u %10u %10u %10u\n",
|
||||||
|
"probe_time:",
|
||||||
|
le32_to_cpu(div->probe_time), accum_div->probe_time,
|
||||||
|
delta_div->probe_time, max_div->probe_time);
|
||||||
|
ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
|
||||||
|
kfree(buf);
|
||||||
|
return ret;
|
||||||
|
}
|
|
@ -0,0 +1,60 @@
|
||||||
|
/******************************************************************************
|
||||||
|
*
|
||||||
|
* GPL LICENSE SUMMARY
|
||||||
|
*
|
||||||
|
* Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of version 2 of the GNU General Public License as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
|
||||||
|
* USA
|
||||||
|
*
|
||||||
|
* The full GNU General Public License is included in this distribution
|
||||||
|
* in the file called LICENSE.GPL.
|
||||||
|
*
|
||||||
|
* Contact Information:
|
||||||
|
* Intel Linux Wireless <ilw@linux.intel.com>
|
||||||
|
* Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include "iwl-dev.h"
|
||||||
|
#include "iwl-core.h"
|
||||||
|
#include "iwl-debug.h"
|
||||||
|
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||||
|
ssize_t iwl3945_ucode_rx_stats_read(struct file *file, char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos);
|
||||||
|
ssize_t iwl3945_ucode_tx_stats_read(struct file *file, char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos);
|
||||||
|
ssize_t iwl3945_ucode_general_stats_read(struct file *file,
|
||||||
|
char __user *user_buf, size_t count,
|
||||||
|
loff_t *ppos);
|
||||||
|
#else
|
||||||
|
static ssize_t iwl3945_ucode_rx_stats_read(struct file *file,
|
||||||
|
char __user *user_buf, size_t count,
|
||||||
|
loff_t *ppos)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static ssize_t iwl3945_ucode_tx_stats_read(struct file *file,
|
||||||
|
char __user *user_buf, size_t count,
|
||||||
|
loff_t *ppos)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
static ssize_t iwl3945_ucode_general_stats_read(struct file *file,
|
||||||
|
char __user *user_buf,
|
||||||
|
size_t count, loff_t *ppos)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
|
@ -49,6 +49,7 @@
|
||||||
#include "iwl-helpers.h"
|
#include "iwl-helpers.h"
|
||||||
#include "iwl-led.h"
|
#include "iwl-led.h"
|
||||||
#include "iwl-3945-led.h"
|
#include "iwl-3945-led.h"
|
||||||
|
#include "iwl-3945-debugfs.h"
|
||||||
|
|
||||||
#define IWL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np) \
|
#define IWL_DECLARE_RATE_INFO(r, ip, in, rp, rn, pp, np) \
|
||||||
[IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \
|
[IWL_RATE_##r##M_INDEX] = { IWL_RATE_##r##M_PLCP, \
|
||||||
|
@ -292,7 +293,7 @@ static void iwl3945_tx_queue_reclaim(struct iwl_priv *priv,
|
||||||
* iwl3945_rx_reply_tx - Handle Tx response
|
* iwl3945_rx_reply_tx - Handle Tx response
|
||||||
*/
|
*/
|
||||||
static void iwl3945_rx_reply_tx(struct iwl_priv *priv,
|
static void iwl3945_rx_reply_tx(struct iwl_priv *priv,
|
||||||
struct iwl_rx_mem_buffer *rxb)
|
struct iwl_rx_mem_buffer *rxb)
|
||||||
{
|
{
|
||||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
u16 sequence = le16_to_cpu(pkt->hdr.sequence);
|
u16 sequence = le16_to_cpu(pkt->hdr.sequence);
|
||||||
|
@ -350,18 +351,81 @@ static void iwl3945_rx_reply_tx(struct iwl_priv *priv,
|
||||||
* RX handler implementations
|
* RX handler implementations
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
/*
|
||||||
|
* based on the assumption of all statistics counter are in DWORD
|
||||||
|
* FIXME: This function is for debugging, do not deal with
|
||||||
|
* the case of counters roll-over.
|
||||||
|
*/
|
||||||
|
static void iwl3945_accumulative_statistics(struct iwl_priv *priv,
|
||||||
|
__le32 *stats)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
__le32 *prev_stats;
|
||||||
|
u32 *accum_stats;
|
||||||
|
u32 *delta, *max_delta;
|
||||||
|
|
||||||
|
prev_stats = (__le32 *)&priv->_3945.statistics;
|
||||||
|
accum_stats = (u32 *)&priv->_3945.accum_statistics;
|
||||||
|
delta = (u32 *)&priv->_3945.delta_statistics;
|
||||||
|
max_delta = (u32 *)&priv->_3945.max_delta;
|
||||||
|
|
||||||
|
for (i = sizeof(__le32); i < sizeof(struct iwl3945_notif_statistics);
|
||||||
|
i += sizeof(__le32), stats++, prev_stats++, delta++,
|
||||||
|
max_delta++, accum_stats++) {
|
||||||
|
if (le32_to_cpu(*stats) > le32_to_cpu(*prev_stats)) {
|
||||||
|
*delta = (le32_to_cpu(*stats) -
|
||||||
|
le32_to_cpu(*prev_stats));
|
||||||
|
*accum_stats += *delta;
|
||||||
|
if (*delta > *max_delta)
|
||||||
|
*max_delta = *delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset accumulative statistics for "no-counter" type statistics */
|
||||||
|
priv->_3945.accum_statistics.general.temperature =
|
||||||
|
priv->_3945.statistics.general.temperature;
|
||||||
|
priv->_3945.accum_statistics.general.ttl_timestamp =
|
||||||
|
priv->_3945.statistics.general.ttl_timestamp;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
|
void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
|
||||||
struct iwl_rx_mem_buffer *rxb)
|
struct iwl_rx_mem_buffer *rxb)
|
||||||
{
|
{
|
||||||
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
|
|
||||||
IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
|
IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
|
||||||
(int)sizeof(struct iwl3945_notif_statistics),
|
(int)sizeof(struct iwl3945_notif_statistics),
|
||||||
le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
|
le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
iwl3945_accumulative_statistics(priv, (__le32 *)&pkt->u.raw);
|
||||||
|
#endif
|
||||||
|
|
||||||
memcpy(&priv->_3945.statistics, pkt->u.raw, sizeof(priv->_3945.statistics));
|
memcpy(&priv->_3945.statistics, pkt->u.raw, sizeof(priv->_3945.statistics));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void iwl3945_reply_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb)
|
||||||
|
{
|
||||||
|
struct iwl_rx_packet *pkt = rxb_addr(rxb);
|
||||||
|
__le32 *flag = (__le32 *)&pkt->u.raw;
|
||||||
|
|
||||||
|
if (le32_to_cpu(*flag) & UCODE_STATISTICS_CLEAR_MSK) {
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
memset(&priv->_3945.accum_statistics, 0,
|
||||||
|
sizeof(struct iwl3945_notif_statistics));
|
||||||
|
memset(&priv->_3945.delta_statistics, 0,
|
||||||
|
sizeof(struct iwl3945_notif_statistics));
|
||||||
|
memset(&priv->_3945.max_delta, 0,
|
||||||
|
sizeof(struct iwl3945_notif_statistics));
|
||||||
|
#endif
|
||||||
|
IWL_DEBUG_RX(priv, "Statistics have been cleared\n");
|
||||||
|
}
|
||||||
|
iwl3945_hw_rx_statistics(priv, rxb);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
*
|
*
|
||||||
* Misc. internal state and helper functions
|
* Misc. internal state and helper functions
|
||||||
|
@ -2735,6 +2799,12 @@ static struct iwl_lib_ops iwl3945_lib = {
|
||||||
.isr = iwl_isr_legacy,
|
.isr = iwl_isr_legacy,
|
||||||
.config_ap = iwl3945_config_ap,
|
.config_ap = iwl3945_config_ap,
|
||||||
.add_bcast_station = iwl3945_add_bcast_station,
|
.add_bcast_station = iwl3945_add_bcast_station,
|
||||||
|
|
||||||
|
.debugfs_ops = {
|
||||||
|
.rx_stats_read = iwl3945_ucode_rx_stats_read,
|
||||||
|
.tx_stats_read = iwl3945_ucode_tx_stats_read,
|
||||||
|
.general_stats_read = iwl3945_ucode_general_stats_read,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = {
|
static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = {
|
||||||
|
|
|
@ -264,6 +264,8 @@ extern int iwl3945_hw_reg_send_txpower(struct iwl_priv *priv);
|
||||||
extern int iwl3945_hw_reg_set_txpower(struct iwl_priv *priv, s8 power);
|
extern int iwl3945_hw_reg_set_txpower(struct iwl_priv *priv, s8 power);
|
||||||
extern void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
|
extern void iwl3945_hw_rx_statistics(struct iwl_priv *priv,
|
||||||
struct iwl_rx_mem_buffer *rxb);
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
|
void iwl3945_reply_statistics(struct iwl_priv *priv,
|
||||||
|
struct iwl_rx_mem_buffer *rxb);
|
||||||
extern void iwl3945_disable_events(struct iwl_priv *priv);
|
extern void iwl3945_disable_events(struct iwl_priv *priv);
|
||||||
extern int iwl4965_get_temperature(const struct iwl_priv *priv);
|
extern int iwl4965_get_temperature(const struct iwl_priv *priv);
|
||||||
extern void iwl3945_post_associate(struct iwl_priv *priv);
|
extern void iwl3945_post_associate(struct iwl_priv *priv);
|
||||||
|
|
|
@ -200,26 +200,57 @@ static int iwl5000_hw_set_hw_params(struct iwl_priv *priv)
|
||||||
|
|
||||||
/* Set initial sensitivity parameters */
|
/* Set initial sensitivity parameters */
|
||||||
/* Set initial calibration set */
|
/* Set initial calibration set */
|
||||||
switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) {
|
priv->hw_params.sens = &iwl5000_sensitivity;
|
||||||
case CSR_HW_REV_TYPE_5150:
|
priv->hw_params.calib_init_cfg =
|
||||||
priv->hw_params.sens = &iwl5150_sensitivity;
|
BIT(IWL_CALIB_XTAL) |
|
||||||
priv->hw_params.calib_init_cfg =
|
BIT(IWL_CALIB_LO) |
|
||||||
BIT(IWL_CALIB_DC) |
|
BIT(IWL_CALIB_TX_IQ) |
|
||||||
BIT(IWL_CALIB_LO) |
|
BIT(IWL_CALIB_TX_IQ_PERD) |
|
||||||
BIT(IWL_CALIB_TX_IQ) |
|
BIT(IWL_CALIB_BASE_BAND);
|
||||||
BIT(IWL_CALIB_BASE_BAND);
|
|
||||||
|
|
||||||
break;
|
return 0;
|
||||||
default:
|
}
|
||||||
priv->hw_params.sens = &iwl5000_sensitivity;
|
|
||||||
priv->hw_params.calib_init_cfg =
|
static int iwl5150_hw_set_hw_params(struct iwl_priv *priv)
|
||||||
BIT(IWL_CALIB_XTAL) |
|
{
|
||||||
BIT(IWL_CALIB_LO) |
|
if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES &&
|
||||||
BIT(IWL_CALIB_TX_IQ) |
|
priv->cfg->mod_params->num_of_queues <= IWLAGN_NUM_QUEUES)
|
||||||
BIT(IWL_CALIB_TX_IQ_PERD) |
|
priv->cfg->num_of_queues =
|
||||||
BIT(IWL_CALIB_BASE_BAND);
|
priv->cfg->mod_params->num_of_queues;
|
||||||
break;
|
|
||||||
}
|
priv->hw_params.max_txq_num = priv->cfg->num_of_queues;
|
||||||
|
priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
|
||||||
|
priv->hw_params.scd_bc_tbls_size =
|
||||||
|
priv->cfg->num_of_queues *
|
||||||
|
sizeof(struct iwlagn_scd_bc_tbl);
|
||||||
|
priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
|
||||||
|
priv->hw_params.max_stations = IWL5000_STATION_COUNT;
|
||||||
|
priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID;
|
||||||
|
|
||||||
|
priv->hw_params.max_data_size = IWLAGN_RTC_DATA_SIZE;
|
||||||
|
priv->hw_params.max_inst_size = IWLAGN_RTC_INST_SIZE;
|
||||||
|
|
||||||
|
priv->hw_params.max_bsm_size = 0;
|
||||||
|
priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
|
||||||
|
BIT(IEEE80211_BAND_5GHZ);
|
||||||
|
priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
|
||||||
|
|
||||||
|
priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
|
||||||
|
priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant);
|
||||||
|
priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
|
||||||
|
priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
|
||||||
|
|
||||||
|
if (priv->cfg->ops->lib->temp_ops.set_ct_kill)
|
||||||
|
priv->cfg->ops->lib->temp_ops.set_ct_kill(priv);
|
||||||
|
|
||||||
|
/* Set initial sensitivity parameters */
|
||||||
|
/* Set initial calibration set */
|
||||||
|
priv->hw_params.sens = &iwl5150_sensitivity;
|
||||||
|
priv->hw_params.calib_init_cfg =
|
||||||
|
BIT(IWL_CALIB_DC) |
|
||||||
|
BIT(IWL_CALIB_LO) |
|
||||||
|
BIT(IWL_CALIB_TX_IQ) |
|
||||||
|
BIT(IWL_CALIB_BASE_BAND);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -332,7 +363,7 @@ static struct iwl_lib_ops iwl5000_lib = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct iwl_lib_ops iwl5150_lib = {
|
static struct iwl_lib_ops iwl5150_lib = {
|
||||||
.set_hw_params = iwl5000_hw_set_hw_params,
|
.set_hw_params = iwl5150_hw_set_hw_params,
|
||||||
.txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
|
.txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
|
||||||
.txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
|
.txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
|
||||||
.txq_set_sched = iwlagn_txq_set_sched,
|
.txq_set_sched = iwlagn_txq_set_sched,
|
||||||
|
|
|
@ -176,24 +176,56 @@ static int iwl6000_hw_set_hw_params(struct iwl_priv *priv)
|
||||||
/* Set initial sensitivity parameters */
|
/* Set initial sensitivity parameters */
|
||||||
/* Set initial calibration set */
|
/* Set initial calibration set */
|
||||||
priv->hw_params.sens = &iwl6000_sensitivity;
|
priv->hw_params.sens = &iwl6000_sensitivity;
|
||||||
switch (priv->hw_rev & CSR_HW_REV_TYPE_MSK) {
|
priv->hw_params.calib_init_cfg =
|
||||||
case CSR_HW_REV_TYPE_6x50:
|
BIT(IWL_CALIB_XTAL) |
|
||||||
priv->hw_params.calib_init_cfg =
|
BIT(IWL_CALIB_LO) |
|
||||||
BIT(IWL_CALIB_XTAL) |
|
BIT(IWL_CALIB_TX_IQ) |
|
||||||
BIT(IWL_CALIB_DC) |
|
BIT(IWL_CALIB_BASE_BAND);
|
||||||
BIT(IWL_CALIB_LO) |
|
|
||||||
BIT(IWL_CALIB_TX_IQ) |
|
|
||||||
BIT(IWL_CALIB_BASE_BAND);
|
|
||||||
|
|
||||||
break;
|
return 0;
|
||||||
default:
|
}
|
||||||
priv->hw_params.calib_init_cfg =
|
|
||||||
BIT(IWL_CALIB_XTAL) |
|
static int iwl6050_hw_set_hw_params(struct iwl_priv *priv)
|
||||||
BIT(IWL_CALIB_LO) |
|
{
|
||||||
BIT(IWL_CALIB_TX_IQ) |
|
if (priv->cfg->mod_params->num_of_queues >= IWL_MIN_NUM_QUEUES &&
|
||||||
BIT(IWL_CALIB_BASE_BAND);
|
priv->cfg->mod_params->num_of_queues <= IWLAGN_NUM_QUEUES)
|
||||||
break;
|
priv->cfg->num_of_queues =
|
||||||
}
|
priv->cfg->mod_params->num_of_queues;
|
||||||
|
|
||||||
|
priv->hw_params.max_txq_num = priv->cfg->num_of_queues;
|
||||||
|
priv->hw_params.dma_chnl_num = FH50_TCSR_CHNL_NUM;
|
||||||
|
priv->hw_params.scd_bc_tbls_size =
|
||||||
|
priv->cfg->num_of_queues *
|
||||||
|
sizeof(struct iwlagn_scd_bc_tbl);
|
||||||
|
priv->hw_params.tfd_size = sizeof(struct iwl_tfd);
|
||||||
|
priv->hw_params.max_stations = IWL5000_STATION_COUNT;
|
||||||
|
priv->hw_params.bcast_sta_id = IWL5000_BROADCAST_ID;
|
||||||
|
|
||||||
|
priv->hw_params.max_data_size = IWL60_RTC_DATA_SIZE;
|
||||||
|
priv->hw_params.max_inst_size = IWL60_RTC_INST_SIZE;
|
||||||
|
|
||||||
|
priv->hw_params.max_bsm_size = 0;
|
||||||
|
priv->hw_params.ht40_channel = BIT(IEEE80211_BAND_2GHZ) |
|
||||||
|
BIT(IEEE80211_BAND_5GHZ);
|
||||||
|
priv->hw_params.rx_wrt_ptr_reg = FH_RSCSR_CHNL0_WPTR;
|
||||||
|
|
||||||
|
priv->hw_params.tx_chains_num = num_of_ant(priv->cfg->valid_tx_ant);
|
||||||
|
priv->hw_params.rx_chains_num = num_of_ant(priv->cfg->valid_rx_ant);
|
||||||
|
priv->hw_params.valid_tx_ant = priv->cfg->valid_tx_ant;
|
||||||
|
priv->hw_params.valid_rx_ant = priv->cfg->valid_rx_ant;
|
||||||
|
|
||||||
|
if (priv->cfg->ops->lib->temp_ops.set_ct_kill)
|
||||||
|
priv->cfg->ops->lib->temp_ops.set_ct_kill(priv);
|
||||||
|
|
||||||
|
/* Set initial sensitivity parameters */
|
||||||
|
/* Set initial calibration set */
|
||||||
|
priv->hw_params.sens = &iwl6000_sensitivity;
|
||||||
|
priv->hw_params.calib_init_cfg =
|
||||||
|
BIT(IWL_CALIB_XTAL) |
|
||||||
|
BIT(IWL_CALIB_DC) |
|
||||||
|
BIT(IWL_CALIB_LO) |
|
||||||
|
BIT(IWL_CALIB_TX_IQ) |
|
||||||
|
BIT(IWL_CALIB_BASE_BAND);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -304,7 +336,7 @@ static const struct iwl_ops iwl6000_ops = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct iwl_lib_ops iwl6050_lib = {
|
static struct iwl_lib_ops iwl6050_lib = {
|
||||||
.set_hw_params = iwl6000_hw_set_hw_params,
|
.set_hw_params = iwl6050_hw_set_hw_params,
|
||||||
.txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
|
.txq_update_byte_cnt_tbl = iwlagn_txq_update_byte_cnt_tbl,
|
||||||
.txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
|
.txq_inval_byte_cnt_tbl = iwlagn_txq_inval_byte_cnt_tbl,
|
||||||
.txq_set_sched = iwlagn_txq_set_sched,
|
.txq_set_sched = iwlagn_txq_set_sched,
|
||||||
|
@ -468,7 +500,6 @@ struct iwl_cfg iwl6000i_2abg_cfg = {
|
||||||
.pa_type = IWL_PA_INTERNAL,
|
.pa_type = IWL_PA_INTERNAL,
|
||||||
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
|
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
|
||||||
.shadow_ram_support = true,
|
.shadow_ram_support = true,
|
||||||
.ht_greenfield_support = true,
|
|
||||||
.led_compensation = 51,
|
.led_compensation = 51,
|
||||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
.supports_idle = true,
|
.supports_idle = true,
|
||||||
|
@ -501,7 +532,6 @@ struct iwl_cfg iwl6000i_2bg_cfg = {
|
||||||
.pa_type = IWL_PA_INTERNAL,
|
.pa_type = IWL_PA_INTERNAL,
|
||||||
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
|
.max_ll_items = OTP_MAX_LL_ITEMS_6x00,
|
||||||
.shadow_ram_support = true,
|
.shadow_ram_support = true,
|
||||||
.ht_greenfield_support = true,
|
|
||||||
.led_compensation = 51,
|
.led_compensation = 51,
|
||||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
.supports_idle = true,
|
.supports_idle = true,
|
||||||
|
@ -568,7 +598,6 @@ struct iwl_cfg iwl6050_2abg_cfg = {
|
||||||
.pa_type = IWL_PA_SYSTEM,
|
.pa_type = IWL_PA_SYSTEM,
|
||||||
.max_ll_items = OTP_MAX_LL_ITEMS_6x50,
|
.max_ll_items = OTP_MAX_LL_ITEMS_6x50,
|
||||||
.shadow_ram_support = true,
|
.shadow_ram_support = true,
|
||||||
.ht_greenfield_support = true,
|
|
||||||
.led_compensation = 51,
|
.led_compensation = 51,
|
||||||
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
.chain_noise_num_beacons = IWL_CAL_NUM_BEACONS,
|
||||||
.supports_idle = true,
|
.supports_idle = true,
|
||||||
|
|
|
@ -1395,16 +1395,29 @@ void iwlagn_request_scan(struct iwl_priv *priv)
|
||||||
rate = IWL_RATE_1M_PLCP;
|
rate = IWL_RATE_1M_PLCP;
|
||||||
rate_flags = RATE_MCS_CCK_MSK;
|
rate_flags = RATE_MCS_CCK_MSK;
|
||||||
}
|
}
|
||||||
scan->good_CRC_th = 0;
|
scan->good_CRC_th = IWL_GOOD_CRC_TH_DISABLED;
|
||||||
break;
|
break;
|
||||||
case IEEE80211_BAND_5GHZ:
|
case IEEE80211_BAND_5GHZ:
|
||||||
rate = IWL_RATE_6M_PLCP;
|
rate = IWL_RATE_6M_PLCP;
|
||||||
/*
|
/*
|
||||||
* If active scaning is requested but a certain channel
|
* If active scanning is requested but a certain channel is
|
||||||
* is marked passive, we can do active scanning if we
|
* marked passive, we can do active scanning if we detect
|
||||||
* detect transmissions.
|
* transmissions.
|
||||||
|
*
|
||||||
|
* There is an issue with some firmware versions that triggers
|
||||||
|
* a sysassert on a "good CRC threshold" of zero (== disabled),
|
||||||
|
* on a radar channel even though this means that we should NOT
|
||||||
|
* send probes.
|
||||||
|
*
|
||||||
|
* The "good CRC threshold" is the number of frames that we
|
||||||
|
* need to receive during our dwell time on a channel before
|
||||||
|
* sending out probes -- setting this to a huge value will
|
||||||
|
* mean we never reach it, but at the same time work around
|
||||||
|
* the aforementioned issue. Thus use IWL_GOOD_CRC_TH_NEVER
|
||||||
|
* here instead of IWL_GOOD_CRC_TH_DISABLED.
|
||||||
*/
|
*/
|
||||||
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0;
|
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
|
||||||
|
IWL_GOOD_CRC_TH_NEVER;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
IWL_WARN(priv, "Invalid scan band count\n");
|
IWL_WARN(priv, "Invalid scan band count\n");
|
||||||
|
|
|
@ -867,14 +867,14 @@ static void rs_tx_status(void *priv_r, struct ieee80211_supported_band *sband,
|
||||||
rs_get_tbl_info_from_mcs(tx_rate, priv->band, &tbl_type,
|
rs_get_tbl_info_from_mcs(tx_rate, priv->band, &tbl_type,
|
||||||
&rs_index);
|
&rs_index);
|
||||||
rs_collect_tx_data(curr_tbl, rs_index,
|
rs_collect_tx_data(curr_tbl, rs_index,
|
||||||
info->status.ampdu_ack_len,
|
info->status.ampdu_len,
|
||||||
info->status.ampdu_ack_map);
|
info->status.ampdu_ack_len);
|
||||||
|
|
||||||
/* Update success/fail counts if not searching for new mode */
|
/* Update success/fail counts if not searching for new mode */
|
||||||
if (lq_sta->stay_in_tbl) {
|
if (lq_sta->stay_in_tbl) {
|
||||||
lq_sta->total_success += info->status.ampdu_ack_map;
|
lq_sta->total_success += info->status.ampdu_ack_len;
|
||||||
lq_sta->total_failed += (info->status.ampdu_ack_len -
|
lq_sta->total_failed += (info->status.ampdu_len -
|
||||||
info->status.ampdu_ack_map);
|
info->status.ampdu_ack_len);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -83,6 +83,15 @@ static inline int get_fifo_from_ac(u8 ac)
|
||||||
return ac_to_fifo[ac];
|
return ac_to_fifo[ac];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int get_ac_from_tid(u16 tid)
|
||||||
|
{
|
||||||
|
if (likely(tid < ARRAY_SIZE(tid_to_ac)))
|
||||||
|
return tid_to_ac[tid];
|
||||||
|
|
||||||
|
/* no support for TIDs 8-15 yet */
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline int get_fifo_from_tid(u16 tid)
|
static inline int get_fifo_from_tid(u16 tid)
|
||||||
{
|
{
|
||||||
if (likely(tid < ARRAY_SIZE(tid_to_ac)))
|
if (likely(tid < ARRAY_SIZE(tid_to_ac)))
|
||||||
|
@ -991,7 +1000,7 @@ int iwlagn_tx_agg_start(struct iwl_priv *priv, const u8 *ra, u16 tid, u16 *ssn)
|
||||||
tid_data = &priv->stations[sta_id].tid[tid];
|
tid_data = &priv->stations[sta_id].tid[tid];
|
||||||
*ssn = SEQ_TO_SN(tid_data->seq_number);
|
*ssn = SEQ_TO_SN(tid_data->seq_number);
|
||||||
tid_data->agg.txq_id = txq_id;
|
tid_data->agg.txq_id = txq_id;
|
||||||
priv->txq[txq_id].swq_id = iwl_virtual_agg_queue_num(tx_fifo, txq_id);
|
priv->txq[txq_id].swq_id = iwl_virtual_agg_queue_num(get_ac_from_tid(tid), txq_id);
|
||||||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||||
|
|
||||||
ret = priv->cfg->ops->lib->txq_agg_enable(priv, txq_id, tx_fifo,
|
ret = priv->cfg->ops->lib->txq_agg_enable(priv, txq_id, tx_fifo,
|
||||||
|
@ -1224,8 +1233,9 @@ static int iwlagn_tx_status_reply_compressed_ba(struct iwl_priv *priv,
|
||||||
memset(&info->status, 0, sizeof(info->status));
|
memset(&info->status, 0, sizeof(info->status));
|
||||||
info->flags |= IEEE80211_TX_STAT_ACK;
|
info->flags |= IEEE80211_TX_STAT_ACK;
|
||||||
info->flags |= IEEE80211_TX_STAT_AMPDU;
|
info->flags |= IEEE80211_TX_STAT_AMPDU;
|
||||||
info->status.ampdu_ack_map = successes;
|
info->status.ampdu_ack_len = successes;
|
||||||
info->status.ampdu_ack_len = agg->frame_count;
|
info->status.ampdu_ack_map = bitmap;
|
||||||
|
info->status.ampdu_len = agg->frame_count;
|
||||||
iwlagn_hwrate_to_tx_control(priv, agg->rate_n_flags, info);
|
iwlagn_hwrate_to_tx_control(priv, agg->rate_n_flags, info);
|
||||||
|
|
||||||
IWL_DEBUG_TX_REPLY(priv, "Bitmap %llx\n", (unsigned long long)bitmap);
|
IWL_DEBUG_TX_REPLY(priv, "Bitmap %llx\n", (unsigned long long)bitmap);
|
||||||
|
|
|
@ -3000,18 +3000,6 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iwl_mac_get_stats(struct ieee80211_hw *hw,
|
|
||||||
struct ieee80211_low_level_stats *stats)
|
|
||||||
{
|
|
||||||
struct iwl_priv *priv = hw->priv;
|
|
||||||
|
|
||||||
priv = hw->priv;
|
|
||||||
IWL_DEBUG_MAC80211(priv, "enter\n");
|
|
||||||
IWL_DEBUG_MAC80211(priv, "leave\n");
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void iwl_mac_sta_notify(struct ieee80211_hw *hw,
|
static void iwl_mac_sta_notify(struct ieee80211_hw *hw,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
enum sta_notify_cmd cmd,
|
enum sta_notify_cmd cmd,
|
||||||
|
@ -3389,7 +3377,6 @@ static struct ieee80211_ops iwl_hw_ops = {
|
||||||
.configure_filter = iwl_configure_filter,
|
.configure_filter = iwl_configure_filter,
|
||||||
.set_key = iwl_mac_set_key,
|
.set_key = iwl_mac_set_key,
|
||||||
.update_tkip_key = iwl_mac_update_tkip_key,
|
.update_tkip_key = iwl_mac_update_tkip_key,
|
||||||
.get_stats = iwl_mac_get_stats,
|
|
||||||
.conf_tx = iwl_mac_conf_tx,
|
.conf_tx = iwl_mac_conf_tx,
|
||||||
.reset_tsf = iwl_mac_reset_tsf,
|
.reset_tsf = iwl_mac_reset_tsf,
|
||||||
.bss_info_changed = iwl_bss_info_changed,
|
.bss_info_changed = iwl_bss_info_changed,
|
||||||
|
|
|
@ -2663,7 +2663,9 @@ struct iwl_ssid_ie {
|
||||||
#define PROBE_OPTION_MAX_3945 4
|
#define PROBE_OPTION_MAX_3945 4
|
||||||
#define PROBE_OPTION_MAX 20
|
#define PROBE_OPTION_MAX 20
|
||||||
#define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF)
|
#define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF)
|
||||||
#define IWL_GOOD_CRC_TH cpu_to_le16(1)
|
#define IWL_GOOD_CRC_TH_DISABLED 0
|
||||||
|
#define IWL_GOOD_CRC_TH_DEFAULT cpu_to_le16(1)
|
||||||
|
#define IWL_GOOD_CRC_TH_NEVER cpu_to_le16(0xffff)
|
||||||
#define IWL_MAX_SCAN_SIZE 1024
|
#define IWL_MAX_SCAN_SIZE 1024
|
||||||
#define IWL_MAX_CMD_SIZE 4096
|
#define IWL_MAX_CMD_SIZE 4096
|
||||||
#define IWL_MAX_PROBE_REQUEST 200
|
#define IWL_MAX_PROBE_REQUEST 200
|
||||||
|
|
|
@ -2116,10 +2116,6 @@ EXPORT_SYMBOL(iwl_mac_remove_interface);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iwl_mac_config - mac80211 config callback
|
* iwl_mac_config - mac80211 config callback
|
||||||
*
|
|
||||||
* We ignore conf->flags & IEEE80211_CONF_SHORT_SLOT_TIME since it seems to
|
|
||||||
* be set inappropriately and the driver currently sets the hardware up to
|
|
||||||
* use it whenever needed.
|
|
||||||
*/
|
*/
|
||||||
int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
int iwl_mac_config(struct ieee80211_hw *hw, u32 changed)
|
||||||
{
|
{
|
||||||
|
@ -2934,6 +2930,12 @@ int iwl_pci_resume(struct pci_dev *pdev)
|
||||||
struct iwl_priv *priv = pci_get_drvdata(pdev);
|
struct iwl_priv *priv = pci_get_drvdata(pdev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We disable the RETRY_TIMEOUT register (0x41) to keep
|
||||||
|
* PCI Tx retries from interfering with C3 CPU state.
|
||||||
|
*/
|
||||||
|
pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00);
|
||||||
|
|
||||||
pci_set_power_state(pdev, PCI_D0);
|
pci_set_power_state(pdev, PCI_D0);
|
||||||
ret = pci_enable_device(pdev);
|
ret = pci_enable_device(pdev);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -1053,10 +1053,8 @@ static ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct iwl_priv *priv = file->private_data;
|
struct iwl_priv *priv = file->private_data;
|
||||||
if (priv->cfg->ops->lib->debugfs_ops.rx_stats_read)
|
return priv->cfg->ops->lib->debugfs_ops.rx_stats_read(file,
|
||||||
return priv->cfg->ops->lib->debugfs_ops.rx_stats_read(file,
|
user_buf, count, ppos);
|
||||||
user_buf, count, ppos);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file,
|
static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file,
|
||||||
|
@ -1064,10 +1062,8 @@ static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct iwl_priv *priv = file->private_data;
|
struct iwl_priv *priv = file->private_data;
|
||||||
if (priv->cfg->ops->lib->debugfs_ops.tx_stats_read)
|
return priv->cfg->ops->lib->debugfs_ops.tx_stats_read(file,
|
||||||
return priv->cfg->ops->lib->debugfs_ops.tx_stats_read(file,
|
user_buf, count, ppos);
|
||||||
user_buf, count, ppos);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file,
|
static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file,
|
||||||
|
@ -1075,10 +1071,8 @@ static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file,
|
||||||
size_t count, loff_t *ppos)
|
size_t count, loff_t *ppos)
|
||||||
{
|
{
|
||||||
struct iwl_priv *priv = file->private_data;
|
struct iwl_priv *priv = file->private_data;
|
||||||
if (priv->cfg->ops->lib->debugfs_ops.general_stats_read)
|
return priv->cfg->ops->lib->debugfs_ops.general_stats_read(file,
|
||||||
return priv->cfg->ops->lib->debugfs_ops.general_stats_read(file,
|
user_buf, count, ppos);
|
||||||
user_buf, count, ppos);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t iwl_dbgfs_sensitivity_read(struct file *file,
|
static ssize_t iwl_dbgfs_sensitivity_read(struct file *file,
|
||||||
|
|
|
@ -1202,6 +1202,11 @@ struct iwl_priv {
|
||||||
struct delayed_work rfkill_poll;
|
struct delayed_work rfkill_poll;
|
||||||
|
|
||||||
struct iwl3945_notif_statistics statistics;
|
struct iwl3945_notif_statistics statistics;
|
||||||
|
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||||
|
struct iwl3945_notif_statistics accum_statistics;
|
||||||
|
struct iwl3945_notif_statistics delta_statistics;
|
||||||
|
struct iwl3945_notif_statistics max_delta;
|
||||||
|
#endif
|
||||||
|
|
||||||
u32 sta_supp_rates;
|
u32 sta_supp_rates;
|
||||||
int last_rx_rssi; /* From Rx packet statistics */
|
int last_rx_rssi; /* From Rx packet statistics */
|
||||||
|
|
|
@ -956,7 +956,7 @@ static void iwl3945_setup_rx_handlers(struct iwl_priv *priv)
|
||||||
* statistics request from the host as well as for the periodic
|
* statistics request from the host as well as for the periodic
|
||||||
* statistics notifications (after received beacons) from the uCode.
|
* statistics notifications (after received beacons) from the uCode.
|
||||||
*/
|
*/
|
||||||
priv->rx_handlers[REPLY_STATISTICS_CMD] = iwl3945_hw_rx_statistics;
|
priv->rx_handlers[REPLY_STATISTICS_CMD] = iwl3945_reply_statistics;
|
||||||
priv->rx_handlers[STATISTICS_NOTIFICATION] = iwl3945_hw_rx_statistics;
|
priv->rx_handlers[STATISTICS_NOTIFICATION] = iwl3945_hw_rx_statistics;
|
||||||
|
|
||||||
iwl_setup_rx_scan_handlers(priv);
|
iwl_setup_rx_scan_handlers(priv);
|
||||||
|
@ -2938,7 +2938,8 @@ void iwl3945_request_scan(struct iwl_priv *priv)
|
||||||
* is marked passive, we can do active scanning if we
|
* is marked passive, we can do active scanning if we
|
||||||
* detect transmissions.
|
* detect transmissions.
|
||||||
*/
|
*/
|
||||||
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0;
|
scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH_DEFAULT :
|
||||||
|
IWL_GOOD_CRC_TH_DISABLED;
|
||||||
band = IEEE80211_BAND_5GHZ;
|
band = IEEE80211_BAND_5GHZ;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -245,7 +245,7 @@ static void p54p_check_tx_ring(struct ieee80211_hw *dev, u32 *index,
|
||||||
u32 idx, i;
|
u32 idx, i;
|
||||||
|
|
||||||
i = (*index) % ring_limit;
|
i = (*index) % ring_limit;
|
||||||
(*index) = idx = le32_to_cpu(ring_control->device_idx[1]);
|
(*index) = idx = le32_to_cpu(ring_control->device_idx[ring_index]);
|
||||||
idx %= ring_limit;
|
idx %= ring_limit;
|
||||||
|
|
||||||
while (i != idx) {
|
while (i != idx) {
|
||||||
|
|
|
@ -183,7 +183,6 @@ static void sta_addba_resp_timer_expired(unsigned long data)
|
||||||
HT_AGG_STATE_REQ_STOP_BA_MSK)) !=
|
HT_AGG_STATE_REQ_STOP_BA_MSK)) !=
|
||||||
HT_ADDBA_REQUESTED_MSK) {
|
HT_ADDBA_REQUESTED_MSK) {
|
||||||
spin_unlock_bh(&sta->lock);
|
spin_unlock_bh(&sta->lock);
|
||||||
*state = HT_AGG_STATE_IDLE;
|
|
||||||
#ifdef CONFIG_MAC80211_HT_DEBUG
|
#ifdef CONFIG_MAC80211_HT_DEBUG
|
||||||
printk(KERN_DEBUG "timer expired on tid %d but we are not "
|
printk(KERN_DEBUG "timer expired on tid %d but we are not "
|
||||||
"(or no longer) expecting addBA response there\n",
|
"(or no longer) expecting addBA response there\n",
|
||||||
|
|
|
@ -174,6 +174,8 @@ static u32 ieee80211_enable_ht(struct ieee80211_sub_if_data *sdata,
|
||||||
ht_changed = conf_is_ht(&local->hw.conf) != enable_ht ||
|
ht_changed = conf_is_ht(&local->hw.conf) != enable_ht ||
|
||||||
channel_type != local->hw.conf.channel_type;
|
channel_type != local->hw.conf.channel_type;
|
||||||
|
|
||||||
|
if (local->tmp_channel)
|
||||||
|
local->tmp_channel_type = channel_type;
|
||||||
local->oper_channel_type = channel_type;
|
local->oper_channel_type = channel_type;
|
||||||
|
|
||||||
if (ht_changed) {
|
if (ht_changed) {
|
||||||
|
|
Loading…
Reference in New Issue