diff options
author | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2014-06-25 07:08:58 -0400 |
---|---|---|
committer | Emmanuel Grumbach <emmanuel.grumbach@intel.com> | 2014-07-06 04:16:15 -0400 |
commit | 655e6d6db21b0c0d411aef9d816816fb68b0496c (patch) | |
tree | e6bced23090bf8024e930cf4789a63f52a53c0a5 /drivers/net | |
parent | 78dae98fab85f4cd2d38cfc3474dea6e87e7b53a (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.c | 100 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/mvm.h | 6 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/ops.c | 83 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/utils.c | 43 |
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 | ||
84 | static const struct ieee80211_iface_limit iwl_mvm_limits[] = { | 86 | static 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 | ||
651 | static 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 | |||
648 | static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm) | 748 | static 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); |
731 | u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx); | 729 | u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx); |
732 | void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm); | 730 | void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm); |
733 | #ifdef CONFIG_IWLWIFI_DEBUGFS | ||
734 | void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm); | ||
735 | void iwl_mvm_fw_error_rxf_dump(struct iwl_mvm *mvm); | ||
736 | #endif | ||
737 | u8 first_antenna(u8 mask); | 731 | u8 first_antenna(u8 mask); |
738 | u8 iwl_mvm_next_antenna(struct iwl_mvm *mvm, u8 valid, u8 last_idx); | 732 | u8 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 | ||
825 | void 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 | |||
906 | static void iwl_mvm_nic_error(struct iwl_op_mode *op_mode) | 823 | static 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 | ||
523 | void 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 |