diff options
author | Matt Carlson <mcarlson@broadcom.com> | 2011-08-31 07:44:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-09-15 15:56:40 -0400 |
commit | 997b4f135b8dffea812eda0311c142873804a785 (patch) | |
tree | 192d6a6709269594f9c55c7abf6629fab261238a /drivers/net/ethernet/broadcom/tg3.c | |
parent | fd6d3f0ec7050681f65445a38f81c43caea15ea6 (diff) |
tg3: Eliminate tg3_halt_cpu() prototype
This patch moves the implementatino of tg3_halt_cpu() earlier in the
file to eliminate its prototype.
Signed-off-by: Matt Carlson <mcarlson@broadcom.com>
Reviewed-by: Benjamin Li <benli@broadcom.com>
Reviewed-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r-- | drivers/net/ethernet/broadcom/tg3.c | 443 |
1 files changed, 222 insertions, 221 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index f045ee5d5ca9..5af560966c70 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
@@ -2999,6 +2999,228 @@ static int tg3_nvram_read_be32(struct tg3 *tp, u32 offset, __be32 *val) | |||
2999 | return res; | 2999 | return res; |
3000 | } | 3000 | } |
3001 | 3001 | ||
3002 | #define RX_CPU_SCRATCH_BASE 0x30000 | ||
3003 | #define RX_CPU_SCRATCH_SIZE 0x04000 | ||
3004 | #define TX_CPU_SCRATCH_BASE 0x34000 | ||
3005 | #define TX_CPU_SCRATCH_SIZE 0x04000 | ||
3006 | |||
3007 | /* tp->lock is held. */ | ||
3008 | static int tg3_halt_cpu(struct tg3 *tp, u32 offset) | ||
3009 | { | ||
3010 | int i; | ||
3011 | |||
3012 | BUG_ON(offset == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)); | ||
3013 | |||
3014 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
3015 | u32 val = tr32(GRC_VCPU_EXT_CTRL); | ||
3016 | |||
3017 | tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU); | ||
3018 | return 0; | ||
3019 | } | ||
3020 | if (offset == RX_CPU_BASE) { | ||
3021 | for (i = 0; i < 10000; i++) { | ||
3022 | tw32(offset + CPU_STATE, 0xffffffff); | ||
3023 | tw32(offset + CPU_MODE, CPU_MODE_HALT); | ||
3024 | if (tr32(offset + CPU_MODE) & CPU_MODE_HALT) | ||
3025 | break; | ||
3026 | } | ||
3027 | |||
3028 | tw32(offset + CPU_STATE, 0xffffffff); | ||
3029 | tw32_f(offset + CPU_MODE, CPU_MODE_HALT); | ||
3030 | udelay(10); | ||
3031 | } else { | ||
3032 | for (i = 0; i < 10000; i++) { | ||
3033 | tw32(offset + CPU_STATE, 0xffffffff); | ||
3034 | tw32(offset + CPU_MODE, CPU_MODE_HALT); | ||
3035 | if (tr32(offset + CPU_MODE) & CPU_MODE_HALT) | ||
3036 | break; | ||
3037 | } | ||
3038 | } | ||
3039 | |||
3040 | if (i >= 10000) { | ||
3041 | netdev_err(tp->dev, "%s timed out, %s CPU\n", | ||
3042 | __func__, offset == RX_CPU_BASE ? "RX" : "TX"); | ||
3043 | return -ENODEV; | ||
3044 | } | ||
3045 | |||
3046 | /* Clear firmware's nvram arbitration. */ | ||
3047 | if (tg3_flag(tp, NVRAM)) | ||
3048 | tw32(NVRAM_SWARB, SWARB_REQ_CLR0); | ||
3049 | return 0; | ||
3050 | } | ||
3051 | |||
3052 | struct fw_info { | ||
3053 | unsigned int fw_base; | ||
3054 | unsigned int fw_len; | ||
3055 | const __be32 *fw_data; | ||
3056 | }; | ||
3057 | |||
3058 | /* tp->lock is held. */ | ||
3059 | static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, | ||
3060 | u32 cpu_scratch_base, int cpu_scratch_size, | ||
3061 | struct fw_info *info) | ||
3062 | { | ||
3063 | int err, lock_err, i; | ||
3064 | void (*write_op)(struct tg3 *, u32, u32); | ||
3065 | |||
3066 | if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) { | ||
3067 | netdev_err(tp->dev, | ||
3068 | "%s: Trying to load TX cpu firmware which is 5705\n", | ||
3069 | __func__); | ||
3070 | return -EINVAL; | ||
3071 | } | ||
3072 | |||
3073 | if (tg3_flag(tp, 5705_PLUS)) | ||
3074 | write_op = tg3_write_mem; | ||
3075 | else | ||
3076 | write_op = tg3_write_indirect_reg32; | ||
3077 | |||
3078 | /* It is possible that bootcode is still loading at this point. | ||
3079 | * Get the nvram lock first before halting the cpu. | ||
3080 | */ | ||
3081 | lock_err = tg3_nvram_lock(tp); | ||
3082 | err = tg3_halt_cpu(tp, cpu_base); | ||
3083 | if (!lock_err) | ||
3084 | tg3_nvram_unlock(tp); | ||
3085 | if (err) | ||
3086 | goto out; | ||
3087 | |||
3088 | for (i = 0; i < cpu_scratch_size; i += sizeof(u32)) | ||
3089 | write_op(tp, cpu_scratch_base + i, 0); | ||
3090 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
3091 | tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT); | ||
3092 | for (i = 0; i < (info->fw_len / sizeof(u32)); i++) | ||
3093 | write_op(tp, (cpu_scratch_base + | ||
3094 | (info->fw_base & 0xffff) + | ||
3095 | (i * sizeof(u32))), | ||
3096 | be32_to_cpu(info->fw_data[i])); | ||
3097 | |||
3098 | err = 0; | ||
3099 | |||
3100 | out: | ||
3101 | return err; | ||
3102 | } | ||
3103 | |||
3104 | /* tp->lock is held. */ | ||
3105 | static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) | ||
3106 | { | ||
3107 | struct fw_info info; | ||
3108 | const __be32 *fw_data; | ||
3109 | int err, i; | ||
3110 | |||
3111 | fw_data = (void *)tp->fw->data; | ||
3112 | |||
3113 | /* Firmware blob starts with version numbers, followed by | ||
3114 | start address and length. We are setting complete length. | ||
3115 | length = end_address_of_bss - start_address_of_text. | ||
3116 | Remainder is the blob to be loaded contiguously | ||
3117 | from start address. */ | ||
3118 | |||
3119 | info.fw_base = be32_to_cpu(fw_data[1]); | ||
3120 | info.fw_len = tp->fw->size - 12; | ||
3121 | info.fw_data = &fw_data[3]; | ||
3122 | |||
3123 | err = tg3_load_firmware_cpu(tp, RX_CPU_BASE, | ||
3124 | RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE, | ||
3125 | &info); | ||
3126 | if (err) | ||
3127 | return err; | ||
3128 | |||
3129 | err = tg3_load_firmware_cpu(tp, TX_CPU_BASE, | ||
3130 | TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE, | ||
3131 | &info); | ||
3132 | if (err) | ||
3133 | return err; | ||
3134 | |||
3135 | /* Now startup only the RX cpu. */ | ||
3136 | tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); | ||
3137 | tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); | ||
3138 | |||
3139 | for (i = 0; i < 5; i++) { | ||
3140 | if (tr32(RX_CPU_BASE + CPU_PC) == info.fw_base) | ||
3141 | break; | ||
3142 | tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); | ||
3143 | tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT); | ||
3144 | tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); | ||
3145 | udelay(1000); | ||
3146 | } | ||
3147 | if (i >= 5) { | ||
3148 | netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x " | ||
3149 | "should be %08x\n", __func__, | ||
3150 | tr32(RX_CPU_BASE + CPU_PC), info.fw_base); | ||
3151 | return -ENODEV; | ||
3152 | } | ||
3153 | tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); | ||
3154 | tw32_f(RX_CPU_BASE + CPU_MODE, 0x00000000); | ||
3155 | |||
3156 | return 0; | ||
3157 | } | ||
3158 | |||
3159 | /* tp->lock is held. */ | ||
3160 | static int tg3_load_tso_firmware(struct tg3 *tp) | ||
3161 | { | ||
3162 | struct fw_info info; | ||
3163 | const __be32 *fw_data; | ||
3164 | unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; | ||
3165 | int err, i; | ||
3166 | |||
3167 | if (tg3_flag(tp, HW_TSO_1) || | ||
3168 | tg3_flag(tp, HW_TSO_2) || | ||
3169 | tg3_flag(tp, HW_TSO_3)) | ||
3170 | return 0; | ||
3171 | |||
3172 | fw_data = (void *)tp->fw->data; | ||
3173 | |||
3174 | /* Firmware blob starts with version numbers, followed by | ||
3175 | start address and length. We are setting complete length. | ||
3176 | length = end_address_of_bss - start_address_of_text. | ||
3177 | Remainder is the blob to be loaded contiguously | ||
3178 | from start address. */ | ||
3179 | |||
3180 | info.fw_base = be32_to_cpu(fw_data[1]); | ||
3181 | cpu_scratch_size = tp->fw_len; | ||
3182 | info.fw_len = tp->fw->size - 12; | ||
3183 | info.fw_data = &fw_data[3]; | ||
3184 | |||
3185 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { | ||
3186 | cpu_base = RX_CPU_BASE; | ||
3187 | cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705; | ||
3188 | } else { | ||
3189 | cpu_base = TX_CPU_BASE; | ||
3190 | cpu_scratch_base = TX_CPU_SCRATCH_BASE; | ||
3191 | cpu_scratch_size = TX_CPU_SCRATCH_SIZE; | ||
3192 | } | ||
3193 | |||
3194 | err = tg3_load_firmware_cpu(tp, cpu_base, | ||
3195 | cpu_scratch_base, cpu_scratch_size, | ||
3196 | &info); | ||
3197 | if (err) | ||
3198 | return err; | ||
3199 | |||
3200 | /* Now startup the cpu. */ | ||
3201 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
3202 | tw32_f(cpu_base + CPU_PC, info.fw_base); | ||
3203 | |||
3204 | for (i = 0; i < 5; i++) { | ||
3205 | if (tr32(cpu_base + CPU_PC) == info.fw_base) | ||
3206 | break; | ||
3207 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
3208 | tw32(cpu_base + CPU_MODE, CPU_MODE_HALT); | ||
3209 | tw32_f(cpu_base + CPU_PC, info.fw_base); | ||
3210 | udelay(1000); | ||
3211 | } | ||
3212 | if (i >= 5) { | ||
3213 | netdev_err(tp->dev, | ||
3214 | "%s fails to set CPU PC, is %08x should be %08x\n", | ||
3215 | __func__, tr32(cpu_base + CPU_PC), info.fw_base); | ||
3216 | return -ENODEV; | ||
3217 | } | ||
3218 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
3219 | tw32_f(cpu_base + CPU_MODE, 0x00000000); | ||
3220 | return 0; | ||
3221 | } | ||
3222 | |||
3223 | |||
3002 | /* tp->lock is held. */ | 3224 | /* tp->lock is held. */ |
3003 | static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1) | 3225 | static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1) |
3004 | { | 3226 | { |
@@ -7707,227 +7929,6 @@ static int tg3_halt(struct tg3 *tp, int kind, int silent) | |||
7707 | return 0; | 7929 | return 0; |
7708 | } | 7930 | } |
7709 | 7931 | ||
7710 | #define RX_CPU_SCRATCH_BASE 0x30000 | ||
7711 | #define RX_CPU_SCRATCH_SIZE 0x04000 | ||
7712 | #define TX_CPU_SCRATCH_BASE 0x34000 | ||
7713 | #define TX_CPU_SCRATCH_SIZE 0x04000 | ||
7714 | |||
7715 | /* tp->lock is held. */ | ||
7716 | static int tg3_halt_cpu(struct tg3 *tp, u32 offset) | ||
7717 | { | ||
7718 | int i; | ||
7719 | |||
7720 | BUG_ON(offset == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)); | ||
7721 | |||
7722 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5906) { | ||
7723 | u32 val = tr32(GRC_VCPU_EXT_CTRL); | ||
7724 | |||
7725 | tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU); | ||
7726 | return 0; | ||
7727 | } | ||
7728 | if (offset == RX_CPU_BASE) { | ||
7729 | for (i = 0; i < 10000; i++) { | ||
7730 | tw32(offset + CPU_STATE, 0xffffffff); | ||
7731 | tw32(offset + CPU_MODE, CPU_MODE_HALT); | ||
7732 | if (tr32(offset + CPU_MODE) & CPU_MODE_HALT) | ||
7733 | break; | ||
7734 | } | ||
7735 | |||
7736 | tw32(offset + CPU_STATE, 0xffffffff); | ||
7737 | tw32_f(offset + CPU_MODE, CPU_MODE_HALT); | ||
7738 | udelay(10); | ||
7739 | } else { | ||
7740 | for (i = 0; i < 10000; i++) { | ||
7741 | tw32(offset + CPU_STATE, 0xffffffff); | ||
7742 | tw32(offset + CPU_MODE, CPU_MODE_HALT); | ||
7743 | if (tr32(offset + CPU_MODE) & CPU_MODE_HALT) | ||
7744 | break; | ||
7745 | } | ||
7746 | } | ||
7747 | |||
7748 | if (i >= 10000) { | ||
7749 | netdev_err(tp->dev, "%s timed out, %s CPU\n", | ||
7750 | __func__, offset == RX_CPU_BASE ? "RX" : "TX"); | ||
7751 | return -ENODEV; | ||
7752 | } | ||
7753 | |||
7754 | /* Clear firmware's nvram arbitration. */ | ||
7755 | if (tg3_flag(tp, NVRAM)) | ||
7756 | tw32(NVRAM_SWARB, SWARB_REQ_CLR0); | ||
7757 | return 0; | ||
7758 | } | ||
7759 | |||
7760 | struct fw_info { | ||
7761 | unsigned int fw_base; | ||
7762 | unsigned int fw_len; | ||
7763 | const __be32 *fw_data; | ||
7764 | }; | ||
7765 | |||
7766 | /* tp->lock is held. */ | ||
7767 | static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, u32 cpu_scratch_base, | ||
7768 | int cpu_scratch_size, struct fw_info *info) | ||
7769 | { | ||
7770 | int err, lock_err, i; | ||
7771 | void (*write_op)(struct tg3 *, u32, u32); | ||
7772 | |||
7773 | if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) { | ||
7774 | netdev_err(tp->dev, | ||
7775 | "%s: Trying to load TX cpu firmware which is 5705\n", | ||
7776 | __func__); | ||
7777 | return -EINVAL; | ||
7778 | } | ||
7779 | |||
7780 | if (tg3_flag(tp, 5705_PLUS)) | ||
7781 | write_op = tg3_write_mem; | ||
7782 | else | ||
7783 | write_op = tg3_write_indirect_reg32; | ||
7784 | |||
7785 | /* It is possible that bootcode is still loading at this point. | ||
7786 | * Get the nvram lock first before halting the cpu. | ||
7787 | */ | ||
7788 | lock_err = tg3_nvram_lock(tp); | ||
7789 | err = tg3_halt_cpu(tp, cpu_base); | ||
7790 | if (!lock_err) | ||
7791 | tg3_nvram_unlock(tp); | ||
7792 | if (err) | ||
7793 | goto out; | ||
7794 | |||
7795 | for (i = 0; i < cpu_scratch_size; i += sizeof(u32)) | ||
7796 | write_op(tp, cpu_scratch_base + i, 0); | ||
7797 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
7798 | tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT); | ||
7799 | for (i = 0; i < (info->fw_len / sizeof(u32)); i++) | ||
7800 | write_op(tp, (cpu_scratch_base + | ||
7801 | (info->fw_base & 0xffff) + | ||
7802 | (i * sizeof(u32))), | ||
7803 | be32_to_cpu(info->fw_data[i])); | ||
7804 | |||
7805 | err = 0; | ||
7806 | |||
7807 | out: | ||
7808 | return err; | ||
7809 | } | ||
7810 | |||
7811 | /* tp->lock is held. */ | ||
7812 | static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) | ||
7813 | { | ||
7814 | struct fw_info info; | ||
7815 | const __be32 *fw_data; | ||
7816 | int err, i; | ||
7817 | |||
7818 | fw_data = (void *)tp->fw->data; | ||
7819 | |||
7820 | /* Firmware blob starts with version numbers, followed by | ||
7821 | start address and length. We are setting complete length. | ||
7822 | length = end_address_of_bss - start_address_of_text. | ||
7823 | Remainder is the blob to be loaded contiguously | ||
7824 | from start address. */ | ||
7825 | |||
7826 | info.fw_base = be32_to_cpu(fw_data[1]); | ||
7827 | info.fw_len = tp->fw->size - 12; | ||
7828 | info.fw_data = &fw_data[3]; | ||
7829 | |||
7830 | err = tg3_load_firmware_cpu(tp, RX_CPU_BASE, | ||
7831 | RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE, | ||
7832 | &info); | ||
7833 | if (err) | ||
7834 | return err; | ||
7835 | |||
7836 | err = tg3_load_firmware_cpu(tp, TX_CPU_BASE, | ||
7837 | TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE, | ||
7838 | &info); | ||
7839 | if (err) | ||
7840 | return err; | ||
7841 | |||
7842 | /* Now startup only the RX cpu. */ | ||
7843 | tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); | ||
7844 | tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); | ||
7845 | |||
7846 | for (i = 0; i < 5; i++) { | ||
7847 | if (tr32(RX_CPU_BASE + CPU_PC) == info.fw_base) | ||
7848 | break; | ||
7849 | tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); | ||
7850 | tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT); | ||
7851 | tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); | ||
7852 | udelay(1000); | ||
7853 | } | ||
7854 | if (i >= 5) { | ||
7855 | netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x " | ||
7856 | "should be %08x\n", __func__, | ||
7857 | tr32(RX_CPU_BASE + CPU_PC), info.fw_base); | ||
7858 | return -ENODEV; | ||
7859 | } | ||
7860 | tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); | ||
7861 | tw32_f(RX_CPU_BASE + CPU_MODE, 0x00000000); | ||
7862 | |||
7863 | return 0; | ||
7864 | } | ||
7865 | |||
7866 | /* tp->lock is held. */ | ||
7867 | static int tg3_load_tso_firmware(struct tg3 *tp) | ||
7868 | { | ||
7869 | struct fw_info info; | ||
7870 | const __be32 *fw_data; | ||
7871 | unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; | ||
7872 | int err, i; | ||
7873 | |||
7874 | if (tg3_flag(tp, HW_TSO_1) || | ||
7875 | tg3_flag(tp, HW_TSO_2) || | ||
7876 | tg3_flag(tp, HW_TSO_3)) | ||
7877 | return 0; | ||
7878 | |||
7879 | fw_data = (void *)tp->fw->data; | ||
7880 | |||
7881 | /* Firmware blob starts with version numbers, followed by | ||
7882 | start address and length. We are setting complete length. | ||
7883 | length = end_address_of_bss - start_address_of_text. | ||
7884 | Remainder is the blob to be loaded contiguously | ||
7885 | from start address. */ | ||
7886 | |||
7887 | info.fw_base = be32_to_cpu(fw_data[1]); | ||
7888 | cpu_scratch_size = tp->fw_len; | ||
7889 | info.fw_len = tp->fw->size - 12; | ||
7890 | info.fw_data = &fw_data[3]; | ||
7891 | |||
7892 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) { | ||
7893 | cpu_base = RX_CPU_BASE; | ||
7894 | cpu_scratch_base = NIC_SRAM_MBUF_POOL_BASE5705; | ||
7895 | } else { | ||
7896 | cpu_base = TX_CPU_BASE; | ||
7897 | cpu_scratch_base = TX_CPU_SCRATCH_BASE; | ||
7898 | cpu_scratch_size = TX_CPU_SCRATCH_SIZE; | ||
7899 | } | ||
7900 | |||
7901 | err = tg3_load_firmware_cpu(tp, cpu_base, | ||
7902 | cpu_scratch_base, cpu_scratch_size, | ||
7903 | &info); | ||
7904 | if (err) | ||
7905 | return err; | ||
7906 | |||
7907 | /* Now startup the cpu. */ | ||
7908 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
7909 | tw32_f(cpu_base + CPU_PC, info.fw_base); | ||
7910 | |||
7911 | for (i = 0; i < 5; i++) { | ||
7912 | if (tr32(cpu_base + CPU_PC) == info.fw_base) | ||
7913 | break; | ||
7914 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
7915 | tw32(cpu_base + CPU_MODE, CPU_MODE_HALT); | ||
7916 | tw32_f(cpu_base + CPU_PC, info.fw_base); | ||
7917 | udelay(1000); | ||
7918 | } | ||
7919 | if (i >= 5) { | ||
7920 | netdev_err(tp->dev, | ||
7921 | "%s fails to set CPU PC, is %08x should be %08x\n", | ||
7922 | __func__, tr32(cpu_base + CPU_PC), info.fw_base); | ||
7923 | return -ENODEV; | ||
7924 | } | ||
7925 | tw32(cpu_base + CPU_STATE, 0xffffffff); | ||
7926 | tw32_f(cpu_base + CPU_MODE, 0x00000000); | ||
7927 | return 0; | ||
7928 | } | ||
7929 | |||
7930 | |||
7931 | static int tg3_set_mac_addr(struct net_device *dev, void *p) | 7932 | static int tg3_set_mac_addr(struct net_device *dev, void *p) |
7932 | { | 7933 | { |
7933 | struct tg3 *tp = netdev_priv(dev); | 7934 | struct tg3 *tp = netdev_priv(dev); |