aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-06-25 07:08:58 -0400
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>2014-07-06 04:16:15 -0400
commit655e6d6db21b0c0d411aef9d816816fb68b0496c (patch)
treee6bced23090bf8024e930cf4789a63f52a53c0a5 /drivers/net
parent78dae98fab85f4cd2d38cfc3474dea6e87e7b53a (diff)
iwlwifi: mvm: kill iwl_mvm_fw_error_rxf_dump
Its content can move to the caller. While at it, move iwl_mvm_fw_error_rxf_dump to caller. Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c100
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h6
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c83
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c43
4 files changed, 100 insertions, 132 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 9feca4a6bacf..9661a526ed51 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -80,6 +80,8 @@
80#include "fw-api-scan.h" 80#include "fw-api-scan.h"
81#include "iwl-phy-db.h" 81#include "iwl-phy-db.h"
82#include "testmode.h" 82#include "testmode.h"
83#include "iwl-fw-error-dump.h"
84#include "iwl-prph.h"
83 85
84static const struct ieee80211_iface_limit iwl_mvm_limits[] = { 86static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
85 { 87 {
@@ -645,6 +647,104 @@ static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
645 mvmvif->phy_ctxt = NULL; 647 mvmvif->phy_ctxt = NULL;
646} 648}
647 649
650#ifdef CONFIG_IWLWIFI_DEBUGFS
651static void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
652{
653 struct iwl_fw_error_dump_file *dump_file;
654 struct iwl_fw_error_dump_data *dump_data;
655 struct iwl_fw_error_dump_info *dump_info;
656 const struct fw_img *img;
657 u32 sram_len, sram_ofs;
658 u32 file_len, rxf_len;
659 unsigned long flags;
660 u32 trans_len;
661 int reg_val;
662
663 lockdep_assert_held(&mvm->mutex);
664
665 if (mvm->fw_error_dump)
666 return;
667
668 img = &mvm->fw->img[mvm->cur_ucode];
669 sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset;
670 sram_len = img->sec[IWL_UCODE_SECTION_DATA].len;
671
672 /* reading buffer size */
673 reg_val = iwl_trans_read_prph(mvm->trans, RXF_SIZE_ADDR);
674 rxf_len = (reg_val & RXF_SIZE_BYTE_CNT_MSK) >> RXF_SIZE_BYTE_CND_POS;
675
676 /* the register holds the value divided by 128 */
677 rxf_len = rxf_len << 7;
678
679 file_len = sizeof(*dump_file) +
680 sizeof(*dump_data) * 3 +
681 sram_len +
682 rxf_len +
683 sizeof(*dump_info);
684
685 trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
686 if (trans_len)
687 file_len += trans_len;
688
689 dump_file = vmalloc(file_len);
690 if (!dump_file)
691 return;
692
693 mvm->fw_error_dump = dump_file;
694
695 dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
696 dump_file->file_len = cpu_to_le32(file_len);
697 dump_data = (void *)dump_file->data;
698
699 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO);
700 dump_data->len = cpu_to_le32(sizeof(*dump_info));
701 dump_info = (void *) dump_data->data;
702 dump_info->device_family =
703 mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ?
704 cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) :
705 cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8);
706 memcpy(dump_info->fw_human_readable, mvm->fw->human_readable,
707 sizeof(dump_info->fw_human_readable));
708 strncpy(dump_info->dev_human_readable, mvm->cfg->name,
709 sizeof(dump_info->dev_human_readable));
710 strncpy(dump_info->bus_human_readable, mvm->dev->bus->name,
711 sizeof(dump_info->bus_human_readable));
712
713 dump_data = iwl_fw_error_next_data(dump_data);
714 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
715 dump_data->len = cpu_to_le32(rxf_len);
716
717 if (iwl_trans_grab_nic_access(mvm->trans, false, &flags)) {
718 u32 *rxf = (void *)dump_data->data;
719 int i;
720
721 for (i = 0; i < (rxf_len / sizeof(u32)); i++) {
722 iwl_trans_write_prph(mvm->trans,
723 RXF_LD_FENCE_OFFSET_ADDR,
724 i * sizeof(u32));
725 rxf[i] = iwl_trans_read_prph(mvm->trans,
726 RXF_FIFO_RD_FENCE_ADDR);
727 }
728 iwl_trans_release_nic_access(mvm->trans, &flags);
729 }
730
731 dump_data = iwl_fw_error_next_data(dump_data);
732 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_SRAM);
733 dump_data->len = cpu_to_le32(sram_len);
734 iwl_trans_read_mem_bytes(mvm->trans, sram_ofs, dump_data->data,
735 sram_len);
736
737 if (trans_len) {
738 void *buf = iwl_fw_error_next_data(dump_data);
739 u32 real_trans_len = iwl_trans_dump_data(mvm->trans, buf,
740 trans_len);
741 dump_data = (void *)((u8 *)buf + real_trans_len);
742 dump_file->file_len =
743 cpu_to_le32(file_len - trans_len + real_trans_len);
744 }
745}
746#endif
747
648static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm) 748static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
649{ 749{
650#ifdef CONFIG_IWLWIFI_DEBUGFS 750#ifdef CONFIG_IWLWIFI_DEBUGFS
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index 4cc6788c68fb..e067d9762603 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -595,8 +595,6 @@ struct iwl_mvm {
595 /* -1 for always, 0 for never, >0 for that many times */ 595 /* -1 for always, 0 for never, >0 for that many times */
596 s8 restart_fw; 596 s8 restart_fw;
597 void *fw_error_dump; 597 void *fw_error_dump;
598 u32 *fw_error_rxf;
599 u32 fw_error_rxf_len;
600 598
601#ifdef CONFIG_IWLWIFI_LEDS 599#ifdef CONFIG_IWLWIFI_LEDS
602 struct led_classdev led; 600 struct led_classdev led;
@@ -730,10 +728,6 @@ void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
730 struct ieee80211_tx_rate *r); 728 struct ieee80211_tx_rate *r);
731u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx); 729u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
732void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm); 730void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm);
733#ifdef CONFIG_IWLWIFI_DEBUGFS
734void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm);
735void iwl_mvm_fw_error_rxf_dump(struct iwl_mvm *mvm);
736#endif
737u8 first_antenna(u8 mask); 731u8 first_antenna(u8 mask);
738u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx); 732u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx);
739 733
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index 889374d04fb1..15c13a722a93 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -550,7 +550,6 @@ static void iwl_op_mode_mvm_stop(struct iwl_op_mode *op_mode)
550 550
551 kfree(mvm->scan_cmd); 551 kfree(mvm->scan_cmd);
552 vfree(mvm->fw_error_dump); 552 vfree(mvm->fw_error_dump);
553 kfree(mvm->fw_error_rxf);
554 kfree(mvm->mcast_filter_cmd); 553 kfree(mvm->mcast_filter_cmd);
555 mvm->mcast_filter_cmd = NULL; 554 mvm->mcast_filter_cmd = NULL;
556 555
@@ -821,88 +820,6 @@ static void iwl_mvm_nic_restart(struct iwl_mvm *mvm)
821 } 820 }
822} 821}
823 822
824#ifdef CONFIG_IWLWIFI_DEBUGFS
825void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
826{
827 struct iwl_fw_error_dump_file *dump_file;
828 struct iwl_fw_error_dump_data *dump_data;
829 struct iwl_fw_error_dump_info *dump_info;
830 const struct fw_img *img;
831 u32 sram_len, sram_ofs;
832 u32 file_len;
833 u32 trans_len;
834
835 lockdep_assert_held(&mvm->mutex);
836
837 if (mvm->fw_error_dump)
838 return;
839
840 img = &mvm->fw->img[mvm->cur_ucode];
841 sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset;
842 sram_len = img->sec[IWL_UCODE_SECTION_DATA].len;
843
844 file_len = sizeof(*dump_file) +
845 sizeof(*dump_data) * 3 +
846 sram_len +
847 mvm->fw_error_rxf_len +
848 sizeof(*dump_info);
849
850 trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
851 if (trans_len)
852 file_len += trans_len;
853
854 dump_file = vmalloc(file_len);
855 if (!dump_file)
856 return;
857
858 mvm->fw_error_dump = dump_file;
859
860 dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
861 dump_file->file_len = cpu_to_le32(file_len);
862 dump_data = (void *)dump_file->data;
863
864 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO);
865 dump_data->len = cpu_to_le32(sizeof(*dump_info));
866 dump_info = (void *) dump_data->data;
867 dump_info->device_family =
868 mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ?
869 cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) :
870 cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8);
871 memcpy(dump_info->fw_human_readable, mvm->fw->human_readable,
872 sizeof(dump_info->fw_human_readable));
873 strncpy(dump_info->dev_human_readable, mvm->cfg->name,
874 sizeof(dump_info->dev_human_readable));
875 strncpy(dump_info->bus_human_readable, mvm->dev->bus->name,
876 sizeof(dump_info->bus_human_readable));
877
878 iwl_mvm_fw_error_rxf_dump(mvm);
879
880 dump_data = iwl_fw_error_next_data(dump_data);
881 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
882 dump_data->len = cpu_to_le32(mvm->fw_error_rxf_len);
883 memcpy(dump_data->data, mvm->fw_error_rxf, mvm->fw_error_rxf_len);
884
885 dump_data = iwl_fw_error_next_data(dump_data);
886 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_SRAM);
887 dump_data->len = cpu_to_le32(sram_len);
888 iwl_trans_read_mem_bytes(mvm->trans, sram_ofs, dump_data->data,
889 sram_len);
890
891 kfree(mvm->fw_error_rxf);
892 mvm->fw_error_rxf = NULL;
893 mvm->fw_error_rxf_len = 0;
894
895 if (trans_len) {
896 void *buf = iwl_fw_error_next_data(dump_data);
897 u32 real_trans_len = iwl_trans_dump_data(mvm->trans, buf,
898 trans_len);
899 dump_data = (void *)((u8 *)buf + real_trans_len);
900 dump_file->file_len =
901 cpu_to_le32(file_len - trans_len + real_trans_len);
902 }
903}
904#endif
905
906static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode) 823static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode)
907{ 824{
908 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); 825 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index 15db97c7d822..ac249da8a22b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -519,49 +519,6 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
519 iwl_mvm_dump_umac_error_log(mvm); 519 iwl_mvm_dump_umac_error_log(mvm);
520} 520}
521 521
522#ifdef CONFIG_IWLWIFI_DEBUGFS
523void iwl_mvm_fw_error_rxf_dump(struct iwl_mvm *mvm)
524{
525 int i, reg_val;
526 unsigned long flags;
527
528 if (!mvm->ucode_loaded || mvm->fw_error_rxf || mvm->fw_error_dump)
529 return;
530
531 /* reading buffer size */
532 reg_val = iwl_trans_read_prph(mvm->trans, RXF_SIZE_ADDR);
533 mvm->fw_error_rxf_len =
534 (reg_val & RXF_SIZE_BYTE_CNT_MSK) >> RXF_SIZE_BYTE_CND_POS;
535
536 /* the register holds the value divided by 128 */
537 mvm->fw_error_rxf_len = mvm->fw_error_rxf_len << 7;
538
539 if (!mvm->fw_error_rxf_len)
540 return;
541
542 mvm->fw_error_rxf = kzalloc(mvm->fw_error_rxf_len, GFP_ATOMIC);
543 if (!mvm->fw_error_rxf) {
544 mvm->fw_error_rxf_len = 0;
545 return;
546 }
547
548 if (!iwl_trans_grab_nic_access(mvm->trans, false, &flags)) {
549 kfree(mvm->fw_error_rxf);
550 mvm->fw_error_rxf = NULL;
551 mvm->fw_error_rxf_len = 0;
552 return;
553 }
554
555 for (i = 0; i < (mvm->fw_error_rxf_len / sizeof(u32)); i++) {
556 iwl_trans_write_prph(mvm->trans, RXF_LD_FENCE_OFFSET_ADDR,
557 i * sizeof(u32));
558 mvm->fw_error_rxf[i] =
559 iwl_trans_read_prph(mvm->trans, RXF_FIFO_RD_FENCE_ADDR);
560 }
561 iwl_trans_release_nic_access(mvm->trans, &flags);
562}
563#endif
564
565/** 522/**
566 * iwl_mvm_send_lq_cmd() - Send link quality command 523 * iwl_mvm_send_lq_cmd() - Send link quality command
567 * @init: This command is sent as part of station initialization right 524 * @init: This command is sent as part of station initialization right