aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorMatt Carlson <mcarlson@broadcom.com>2011-08-31 07:44:53 -0400
committerDavid S. Miller <davem@davemloft.net>2011-09-15 15:56:40 -0400
commit997b4f135b8dffea812eda0311c142873804a785 (patch)
tree192d6a6709269594f9c55c7abf6629fab261238a /drivers/net/ethernet/broadcom/tg3.c
parentfd6d3f0ec7050681f65445a38f81c43caea15ea6 (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.c443
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. */
3008static 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
3052struct fw_info {
3053 unsigned int fw_base;
3054 unsigned int fw_len;
3055 const __be32 *fw_data;
3056};
3057
3058/* tp->lock is held. */
3059static 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
3100out:
3101 return err;
3102}
3103
3104/* tp->lock is held. */
3105static 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. */
3160static 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. */
3003static void __tg3_set_mac_addr(struct tg3 *tp, int skip_mac_1) 3225static 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. */
7716static 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
7760struct fw_info {
7761 unsigned int fw_base;
7762 unsigned int fw_len;
7763 const __be32 *fw_data;
7764};
7765
7766/* tp->lock is held. */
7767static 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
7807out:
7808 return err;
7809}
7810
7811/* tp->lock is held. */
7812static 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. */
7867static 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
7931static int tg3_set_mac_addr(struct net_device *dev, void *p) 7932static 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);