aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2013-03-07 15:31:39 -0500
committerDavid S. Miller <davem@davemloft.net>2013-03-07 15:31:39 -0500
commitf3564b2bb5f86f42b8a068751551b6bd01325d9c (patch)
tree1c448e4f6471dc096ffd86f51380e08cbd1d910c
parenta6f3587ca24da9c150269fe76cb2eabc6df96b90 (diff)
parentc4dab50697ff220e35f7b4464418c5893de4e699 (diff)
Merge branch 'tg3'
Nithin Nayak says: ==================== For the 57766 devices with no NVRAM, there is not enough space for the complete boot code with EEE support. On these devices, the tg3 driver has to download a service patch firmware to the scratchpad for the boot code to execute. This patchset adds support to do the above. A major portion of this patchset is refactoring the existing firmware download section to allow a cleaner merge of the 57766 download. The 57766 firmware differs from previous firmware in that it's not written to a contiguous area in memory. It consists of multiple fragments to be written to different locations. The patchset makes an attempt to make the new firmware format to be an extension of the existing format. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c378
-rw-r--r--drivers/net/ethernet/broadcom/tg3.h18
2 files changed, 288 insertions, 108 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index fdb9b5655414..2b2bee61ddd7 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -212,6 +212,7 @@ static inline void _tg3_flag_clear(enum TG3_FLAGS flag, unsigned long *bits)
212#define TG3_FW_UPDATE_FREQ_SEC (TG3_FW_UPDATE_TIMEOUT_SEC / 2) 212#define TG3_FW_UPDATE_FREQ_SEC (TG3_FW_UPDATE_TIMEOUT_SEC / 2)
213 213
214#define FIRMWARE_TG3 "tigon/tg3.bin" 214#define FIRMWARE_TG3 "tigon/tg3.bin"
215#define FIRMWARE_TG357766 "tigon/tg357766.bin"
215#define FIRMWARE_TG3TSO "tigon/tg3_tso.bin" 216#define FIRMWARE_TG3TSO "tigon/tg3_tso.bin"
216#define FIRMWARE_TG3TSO5 "tigon/tg3_tso5.bin" 217#define FIRMWARE_TG3TSO5 "tigon/tg3_tso5.bin"
217 218
@@ -3452,11 +3453,58 @@ static int tg3_nvram_write_block(struct tg3 *tp, u32 offset, u32 len, u8 *buf)
3452#define TX_CPU_SCRATCH_SIZE 0x04000 3453#define TX_CPU_SCRATCH_SIZE 0x04000
3453 3454
3454/* tp->lock is held. */ 3455/* tp->lock is held. */
3455static int tg3_halt_cpu(struct tg3 *tp, u32 offset) 3456static int tg3_pause_cpu(struct tg3 *tp, u32 cpu_base)
3456{ 3457{
3457 int i; 3458 int i;
3459 const int iters = 10000;
3458 3460
3459 BUG_ON(offset == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)); 3461 for (i = 0; i < iters; i++) {
3462 tw32(cpu_base + CPU_STATE, 0xffffffff);
3463 tw32(cpu_base + CPU_MODE, CPU_MODE_HALT);
3464 if (tr32(cpu_base + CPU_MODE) & CPU_MODE_HALT)
3465 break;
3466 }
3467
3468 return (i == iters) ? -EBUSY : 0;
3469}
3470
3471/* tp->lock is held. */
3472static int tg3_rxcpu_pause(struct tg3 *tp)
3473{
3474 int rc = tg3_pause_cpu(tp, RX_CPU_BASE);
3475
3476 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
3477 tw32_f(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT);
3478 udelay(10);
3479
3480 return rc;
3481}
3482
3483/* tp->lock is held. */
3484static int tg3_txcpu_pause(struct tg3 *tp)
3485{
3486 return tg3_pause_cpu(tp, TX_CPU_BASE);
3487}
3488
3489/* tp->lock is held. */
3490static void tg3_resume_cpu(struct tg3 *tp, u32 cpu_base)
3491{
3492 tw32(cpu_base + CPU_STATE, 0xffffffff);
3493 tw32_f(cpu_base + CPU_MODE, 0x00000000);
3494}
3495
3496/* tp->lock is held. */
3497static void tg3_rxcpu_resume(struct tg3 *tp)
3498{
3499 tg3_resume_cpu(tp, RX_CPU_BASE);
3500}
3501
3502/* tp->lock is held. */
3503static int tg3_halt_cpu(struct tg3 *tp, u32 cpu_base)
3504{
3505 int rc;
3506
3507 BUG_ON(cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS));
3460 3508
3461 if (tg3_asic_rev(tp) == ASIC_REV_5906) { 3509 if (tg3_asic_rev(tp) == ASIC_REV_5906) {
3462 u32 val = tr32(GRC_VCPU_EXT_CTRL); 3510 u32 val = tr32(GRC_VCPU_EXT_CTRL);
@@ -3464,17 +3512,8 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
3464 tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU); 3512 tw32(GRC_VCPU_EXT_CTRL, val | GRC_VCPU_EXT_CTRL_HALT_CPU);
3465 return 0; 3513 return 0;
3466 } 3514 }
3467 if (offset == RX_CPU_BASE) { 3515 if (cpu_base == RX_CPU_BASE) {
3468 for (i = 0; i < 10000; i++) { 3516 rc = tg3_rxcpu_pause(tp);
3469 tw32(offset + CPU_STATE, 0xffffffff);
3470 tw32(offset + CPU_MODE, CPU_MODE_HALT);
3471 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
3472 break;
3473 }
3474
3475 tw32(offset + CPU_STATE, 0xffffffff);
3476 tw32_f(offset + CPU_MODE, CPU_MODE_HALT);
3477 udelay(10);
3478 } else { 3517 } else {
3479 /* 3518 /*
3480 * There is only an Rx CPU for the 5750 derivative in the 3519 * There is only an Rx CPU for the 5750 derivative in the
@@ -3483,17 +3522,12 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
3483 if (tg3_flag(tp, IS_SSB_CORE)) 3522 if (tg3_flag(tp, IS_SSB_CORE))
3484 return 0; 3523 return 0;
3485 3524
3486 for (i = 0; i < 10000; i++) { 3525 rc = tg3_txcpu_pause(tp);
3487 tw32(offset + CPU_STATE, 0xffffffff);
3488 tw32(offset + CPU_MODE, CPU_MODE_HALT);
3489 if (tr32(offset + CPU_MODE) & CPU_MODE_HALT)
3490 break;
3491 }
3492 } 3526 }
3493 3527
3494 if (i >= 10000) { 3528 if (rc) {
3495 netdev_err(tp->dev, "%s timed out, %s CPU\n", 3529 netdev_err(tp->dev, "%s timed out, %s CPU\n",
3496 __func__, offset == RX_CPU_BASE ? "RX" : "TX"); 3530 __func__, cpu_base == RX_CPU_BASE ? "RX" : "TX");
3497 return -ENODEV; 3531 return -ENODEV;
3498 } 3532 }
3499 3533
@@ -3503,19 +3537,41 @@ static int tg3_halt_cpu(struct tg3 *tp, u32 offset)
3503 return 0; 3537 return 0;
3504} 3538}
3505 3539
3506struct fw_info { 3540static int tg3_fw_data_len(struct tg3 *tp,
3507 unsigned int fw_base; 3541 const struct tg3_firmware_hdr *fw_hdr)
3508 unsigned int fw_len; 3542{
3509 const __be32 *fw_data; 3543 int fw_len;
3510}; 3544
3545 /* Non fragmented firmware have one firmware header followed by a
3546 * contiguous chunk of data to be written. The length field in that
3547 * header is not the length of data to be written but the complete
3548 * length of the bss. The data length is determined based on
3549 * tp->fw->size minus headers.
3550 *
3551 * Fragmented firmware have a main header followed by multiple
3552 * fragments. Each fragment is identical to non fragmented firmware
3553 * with a firmware header followed by a contiguous chunk of data. In
3554 * the main header, the length field is unused and set to 0xffffffff.
3555 * In each fragment header the length is the entire size of that
3556 * fragment i.e. fragment data + header length. Data length is
3557 * therefore length field in the header minus TG3_FW_HDR_LEN.
3558 */
3559 if (tp->fw_len == 0xffffffff)
3560 fw_len = be32_to_cpu(fw_hdr->len);
3561 else
3562 fw_len = tp->fw->size;
3563
3564 return (fw_len - TG3_FW_HDR_LEN) / sizeof(u32);
3565}
3511 3566
3512/* tp->lock is held. */ 3567/* tp->lock is held. */
3513static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base, 3568static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base,
3514 u32 cpu_scratch_base, int cpu_scratch_size, 3569 u32 cpu_scratch_base, int cpu_scratch_size,
3515 struct fw_info *info) 3570 const struct tg3_firmware_hdr *fw_hdr)
3516{ 3571{
3517 int err, lock_err, i; 3572 int err, i;
3518 void (*write_op)(struct tg3 *, u32, u32); 3573 void (*write_op)(struct tg3 *, u32, u32);
3574 int total_len = tp->fw->size;
3519 3575
3520 if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) { 3576 if (cpu_base == TX_CPU_BASE && tg3_flag(tp, 5705_PLUS)) {
3521 netdev_err(tp->dev, 3577 netdev_err(tp->dev,
@@ -3524,30 +3580,49 @@ static int tg3_load_firmware_cpu(struct tg3 *tp, u32 cpu_base,
3524 return -EINVAL; 3580 return -EINVAL;
3525 } 3581 }
3526 3582
3527 if (tg3_flag(tp, 5705_PLUS)) 3583 if (tg3_flag(tp, 5705_PLUS) && tg3_asic_rev(tp) != ASIC_REV_57766)
3528 write_op = tg3_write_mem; 3584 write_op = tg3_write_mem;
3529 else 3585 else
3530 write_op = tg3_write_indirect_reg32; 3586 write_op = tg3_write_indirect_reg32;
3531 3587
3532 /* It is possible that bootcode is still loading at this point. 3588 if (tg3_asic_rev(tp) != ASIC_REV_57766) {
3533 * Get the nvram lock first before halting the cpu. 3589 /* It is possible that bootcode is still loading at this point.
3534 */ 3590 * Get the nvram lock first before halting the cpu.
3535 lock_err = tg3_nvram_lock(tp); 3591 */
3536 err = tg3_halt_cpu(tp, cpu_base); 3592 int lock_err = tg3_nvram_lock(tp);
3537 if (!lock_err) 3593 err = tg3_halt_cpu(tp, cpu_base);
3538 tg3_nvram_unlock(tp); 3594 if (!lock_err)
3539 if (err) 3595 tg3_nvram_unlock(tp);
3540 goto out; 3596 if (err)
3597 goto out;
3541 3598
3542 for (i = 0; i < cpu_scratch_size; i += sizeof(u32)) 3599 for (i = 0; i < cpu_scratch_size; i += sizeof(u32))
3543 write_op(tp, cpu_scratch_base + i, 0); 3600 write_op(tp, cpu_scratch_base + i, 0);
3544 tw32(cpu_base + CPU_STATE, 0xffffffff); 3601 tw32(cpu_base + CPU_STATE, 0xffffffff);
3545 tw32(cpu_base + CPU_MODE, tr32(cpu_base+CPU_MODE)|CPU_MODE_HALT); 3602 tw32(cpu_base + CPU_MODE,
3546 for (i = 0; i < (info->fw_len / sizeof(u32)); i++) 3603 tr32(cpu_base + CPU_MODE) | CPU_MODE_HALT);
3547 write_op(tp, (cpu_scratch_base + 3604 } else {
3548 (info->fw_base & 0xffff) + 3605 /* Subtract additional main header for fragmented firmware and
3549 (i * sizeof(u32))), 3606 * advance to the first fragment
3550 be32_to_cpu(info->fw_data[i])); 3607 */
3608 total_len -= TG3_FW_HDR_LEN;
3609 fw_hdr++;
3610 }
3611
3612 do {
3613 u32 *fw_data = (u32 *)(fw_hdr + 1);
3614 for (i = 0; i < tg3_fw_data_len(tp, fw_hdr); i++)
3615 write_op(tp, cpu_scratch_base +
3616 (be32_to_cpu(fw_hdr->base_addr) & 0xffff) +
3617 (i * sizeof(u32)),
3618 be32_to_cpu(fw_data[i]));
3619
3620 total_len -= be32_to_cpu(fw_hdr->len);
3621
3622 /* Advance to next fragment */
3623 fw_hdr = (struct tg3_firmware_hdr *)
3624 ((void *)fw_hdr + be32_to_cpu(fw_hdr->len));
3625 } while (total_len > 0);
3551 3626
3552 err = 0; 3627 err = 0;
3553 3628
@@ -3556,13 +3631,33 @@ out:
3556} 3631}
3557 3632
3558/* tp->lock is held. */ 3633/* tp->lock is held. */
3634static int tg3_pause_cpu_and_set_pc(struct tg3 *tp, u32 cpu_base, u32 pc)
3635{
3636 int i;
3637 const int iters = 5;
3638
3639 tw32(cpu_base + CPU_STATE, 0xffffffff);
3640 tw32_f(cpu_base + CPU_PC, pc);
3641
3642 for (i = 0; i < iters; i++) {
3643 if (tr32(cpu_base + CPU_PC) == pc)
3644 break;
3645 tw32(cpu_base + CPU_STATE, 0xffffffff);
3646 tw32(cpu_base + CPU_MODE, CPU_MODE_HALT);
3647 tw32_f(cpu_base + CPU_PC, pc);
3648 udelay(1000);
3649 }
3650
3651 return (i == iters) ? -EBUSY : 0;
3652}
3653
3654/* tp->lock is held. */
3559static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp) 3655static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
3560{ 3656{
3561 struct fw_info info; 3657 const struct tg3_firmware_hdr *fw_hdr;
3562 const __be32 *fw_data; 3658 int err;
3563 int err, i;
3564 3659
3565 fw_data = (void *)tp->fw->data; 3660 fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
3566 3661
3567 /* Firmware blob starts with version numbers, followed by 3662 /* Firmware blob starts with version numbers, followed by
3568 start address and length. We are setting complete length. 3663 start address and length. We are setting complete length.
@@ -3570,60 +3665,117 @@ static int tg3_load_5701_a0_firmware_fix(struct tg3 *tp)
3570 Remainder is the blob to be loaded contiguously 3665 Remainder is the blob to be loaded contiguously
3571 from start address. */ 3666 from start address. */
3572 3667
3573 info.fw_base = be32_to_cpu(fw_data[1]);
3574 info.fw_len = tp->fw->size - 12;
3575 info.fw_data = &fw_data[3];
3576
3577 err = tg3_load_firmware_cpu(tp, RX_CPU_BASE, 3668 err = tg3_load_firmware_cpu(tp, RX_CPU_BASE,
3578 RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE, 3669 RX_CPU_SCRATCH_BASE, RX_CPU_SCRATCH_SIZE,
3579 &info); 3670 fw_hdr);
3580 if (err) 3671 if (err)
3581 return err; 3672 return err;
3582 3673
3583 err = tg3_load_firmware_cpu(tp, TX_CPU_BASE, 3674 err = tg3_load_firmware_cpu(tp, TX_CPU_BASE,
3584 TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE, 3675 TX_CPU_SCRATCH_BASE, TX_CPU_SCRATCH_SIZE,
3585 &info); 3676 fw_hdr);
3586 if (err) 3677 if (err)
3587 return err; 3678 return err;
3588 3679
3589 /* Now startup only the RX cpu. */ 3680 /* Now startup only the RX cpu. */
3590 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); 3681 err = tg3_pause_cpu_and_set_pc(tp, RX_CPU_BASE,
3591 tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base); 3682 be32_to_cpu(fw_hdr->base_addr));
3592 3683 if (err) {
3593 for (i = 0; i < 5; i++) {
3594 if (tr32(RX_CPU_BASE + CPU_PC) == info.fw_base)
3595 break;
3596 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff);
3597 tw32(RX_CPU_BASE + CPU_MODE, CPU_MODE_HALT);
3598 tw32_f(RX_CPU_BASE + CPU_PC, info.fw_base);
3599 udelay(1000);
3600 }
3601 if (i >= 5) {
3602 netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x " 3684 netdev_err(tp->dev, "%s fails to set RX CPU PC, is %08x "
3603 "should be %08x\n", __func__, 3685 "should be %08x\n", __func__,
3604 tr32(RX_CPU_BASE + CPU_PC), info.fw_base); 3686 tr32(RX_CPU_BASE + CPU_PC),
3687 be32_to_cpu(fw_hdr->base_addr));
3605 return -ENODEV; 3688 return -ENODEV;
3606 } 3689 }
3607 tw32(RX_CPU_BASE + CPU_STATE, 0xffffffff); 3690
3608 tw32_f(RX_CPU_BASE + CPU_MODE, 0x00000000); 3691 tg3_rxcpu_resume(tp);
3609 3692
3610 return 0; 3693 return 0;
3611} 3694}
3612 3695
3696static int tg3_validate_rxcpu_state(struct tg3 *tp)
3697{
3698 const int iters = 1000;
3699 int i;
3700 u32 val;
3701
3702 /* Wait for boot code to complete initialization and enter service
3703 * loop. It is then safe to download service patches
3704 */
3705 for (i = 0; i < iters; i++) {
3706 if (tr32(RX_CPU_HWBKPT) == TG3_SBROM_IN_SERVICE_LOOP)
3707 break;
3708
3709 udelay(10);
3710 }
3711
3712 if (i == iters) {
3713 netdev_err(tp->dev, "Boot code not ready for service patches\n");
3714 return -EBUSY;
3715 }
3716
3717 val = tg3_read_indirect_reg32(tp, TG3_57766_FW_HANDSHAKE);
3718 if (val & 0xff) {
3719 netdev_warn(tp->dev,
3720 "Other patches exist. Not downloading EEE patch\n");
3721 return -EEXIST;
3722 }
3723
3724 return 0;
3725}
3726
3727/* tp->lock is held. */
3728static void tg3_load_57766_firmware(struct tg3 *tp)
3729{
3730 struct tg3_firmware_hdr *fw_hdr;
3731
3732 if (!tg3_flag(tp, NO_NVRAM))
3733 return;
3734
3735 if (tg3_validate_rxcpu_state(tp))
3736 return;
3737
3738 if (!tp->fw)
3739 return;
3740
3741 /* This firmware blob has a different format than older firmware
3742 * releases as given below. The main difference is we have fragmented
3743 * data to be written to non-contiguous locations.
3744 *
3745 * In the beginning we have a firmware header identical to other
3746 * firmware which consists of version, base addr and length. The length
3747 * here is unused and set to 0xffffffff.
3748 *
3749 * This is followed by a series of firmware fragments which are
3750 * individually identical to previous firmware. i.e. they have the
3751 * firmware header and followed by data for that fragment. The version
3752 * field of the individual fragment header is unused.
3753 */
3754
3755 fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
3756 if (be32_to_cpu(fw_hdr->base_addr) != TG3_57766_FW_BASE_ADDR)
3757 return;
3758
3759 if (tg3_rxcpu_pause(tp))
3760 return;
3761
3762 /* tg3_load_firmware_cpu() will always succeed for the 57766 */
3763 tg3_load_firmware_cpu(tp, 0, TG3_57766_FW_BASE_ADDR, 0, fw_hdr);
3764
3765 tg3_rxcpu_resume(tp);
3766}
3767
3613/* tp->lock is held. */ 3768/* tp->lock is held. */
3614static int tg3_load_tso_firmware(struct tg3 *tp) 3769static int tg3_load_tso_firmware(struct tg3 *tp)
3615{ 3770{
3616 struct fw_info info; 3771 const struct tg3_firmware_hdr *fw_hdr;
3617 const __be32 *fw_data;
3618 unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size; 3772 unsigned long cpu_base, cpu_scratch_base, cpu_scratch_size;
3619 int err, i; 3773 int err;
3620 3774
3621 if (tg3_flag(tp, HW_TSO_1) || 3775 if (!tg3_flag(tp, FW_TSO))
3622 tg3_flag(tp, HW_TSO_2) ||
3623 tg3_flag(tp, HW_TSO_3))
3624 return 0; 3776 return 0;
3625 3777
3626 fw_data = (void *)tp->fw->data; 3778 fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
3627 3779
3628 /* Firmware blob starts with version numbers, followed by 3780 /* Firmware blob starts with version numbers, followed by
3629 start address and length. We are setting complete length. 3781 start address and length. We are setting complete length.
@@ -3631,10 +3783,7 @@ static int tg3_load_tso_firmware(struct tg3 *tp)
3631 Remainder is the blob to be loaded contiguously 3783 Remainder is the blob to be loaded contiguously
3632 from start address. */ 3784 from start address. */
3633 3785
3634 info.fw_base = be32_to_cpu(fw_data[1]);
3635 cpu_scratch_size = tp->fw_len; 3786 cpu_scratch_size = tp->fw_len;
3636 info.fw_len = tp->fw->size - 12;
3637 info.fw_data = &fw_data[3];
3638 3787
3639 if (tg3_asic_rev(tp) == ASIC_REV_5705) { 3788 if (tg3_asic_rev(tp) == ASIC_REV_5705) {
3640 cpu_base = RX_CPU_BASE; 3789 cpu_base = RX_CPU_BASE;
@@ -3647,30 +3796,22 @@ static int tg3_load_tso_firmware(struct tg3 *tp)
3647 3796
3648 err = tg3_load_firmware_cpu(tp, cpu_base, 3797 err = tg3_load_firmware_cpu(tp, cpu_base,
3649 cpu_scratch_base, cpu_scratch_size, 3798 cpu_scratch_base, cpu_scratch_size,
3650 &info); 3799 fw_hdr);
3651 if (err) 3800 if (err)
3652 return err; 3801 return err;
3653 3802
3654 /* Now startup the cpu. */ 3803 /* Now startup the cpu. */
3655 tw32(cpu_base + CPU_STATE, 0xffffffff); 3804 err = tg3_pause_cpu_and_set_pc(tp, cpu_base,
3656 tw32_f(cpu_base + CPU_PC, info.fw_base); 3805 be32_to_cpu(fw_hdr->base_addr));
3657 3806 if (err) {
3658 for (i = 0; i < 5; i++) {
3659 if (tr32(cpu_base + CPU_PC) == info.fw_base)
3660 break;
3661 tw32(cpu_base + CPU_STATE, 0xffffffff);
3662 tw32(cpu_base + CPU_MODE, CPU_MODE_HALT);
3663 tw32_f(cpu_base + CPU_PC, info.fw_base);
3664 udelay(1000);
3665 }
3666 if (i >= 5) {
3667 netdev_err(tp->dev, 3807 netdev_err(tp->dev,
3668 "%s fails to set CPU PC, is %08x should be %08x\n", 3808 "%s fails to set CPU PC, is %08x should be %08x\n",
3669 __func__, tr32(cpu_base + CPU_PC), info.fw_base); 3809 __func__, tr32(cpu_base + CPU_PC),
3810 be32_to_cpu(fw_hdr->base_addr));
3670 return -ENODEV; 3811 return -ENODEV;
3671 } 3812 }
3672 tw32(cpu_base + CPU_STATE, 0xffffffff); 3813
3673 tw32_f(cpu_base + CPU_MODE, 0x00000000); 3814 tg3_resume_cpu(tp, cpu_base);
3674 return 0; 3815 return 0;
3675} 3816}
3676 3817
@@ -9777,6 +9918,13 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
9777 return err; 9918 return err;
9778 } 9919 }
9779 9920
9921 if (tg3_asic_rev(tp) == ASIC_REV_57766) {
9922 /* Ignore any errors for the firmware download. If download
9923 * fails, the device will operate with EEE disabled
9924 */
9925 tg3_load_57766_firmware(tp);
9926 }
9927
9780 if (tg3_flag(tp, TSO_CAPABLE)) { 9928 if (tg3_flag(tp, TSO_CAPABLE)) {
9781 err = tg3_load_tso_firmware(tp); 9929 err = tg3_load_tso_firmware(tp);
9782 if (err) 9930 if (err)
@@ -10566,7 +10714,7 @@ static int tg3_test_msi(struct tg3 *tp)
10566 10714
10567static int tg3_request_firmware(struct tg3 *tp) 10715static int tg3_request_firmware(struct tg3 *tp)
10568{ 10716{
10569 const __be32 *fw_data; 10717 const struct tg3_firmware_hdr *fw_hdr;
10570 10718
10571 if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) { 10719 if (request_firmware(&tp->fw, tp->fw_needed, &tp->pdev->dev)) {
10572 netdev_err(tp->dev, "Failed to load firmware \"%s\"\n", 10720 netdev_err(tp->dev, "Failed to load firmware \"%s\"\n",
@@ -10574,15 +10722,15 @@ static int tg3_request_firmware(struct tg3 *tp)
10574 return -ENOENT; 10722 return -ENOENT;
10575 } 10723 }
10576 10724
10577 fw_data = (void *)tp->fw->data; 10725 fw_hdr = (struct tg3_firmware_hdr *)tp->fw->data;
10578 10726
10579 /* Firmware blob starts with version numbers, followed by 10727 /* Firmware blob starts with version numbers, followed by
10580 * start address and _full_ length including BSS sections 10728 * start address and _full_ length including BSS sections
10581 * (which must be longer than the actual data, of course 10729 * (which must be longer than the actual data, of course
10582 */ 10730 */
10583 10731
10584 tp->fw_len = be32_to_cpu(fw_data[2]); /* includes bss */ 10732 tp->fw_len = be32_to_cpu(fw_hdr->len); /* includes bss */
10585 if (tp->fw_len < (tp->fw->size - 12)) { 10733 if (tp->fw_len < (tp->fw->size - TG3_FW_HDR_LEN)) {
10586 netdev_err(tp->dev, "bogus length %d in \"%s\"\n", 10734 netdev_err(tp->dev, "bogus length %d in \"%s\"\n",
10587 tp->fw_len, tp->fw_needed); 10735 tp->fw_len, tp->fw_needed);
10588 release_firmware(tp->fw); 10736 release_firmware(tp->fw);
@@ -10881,7 +11029,15 @@ static int tg3_open(struct net_device *dev)
10881 11029
10882 if (tp->fw_needed) { 11030 if (tp->fw_needed) {
10883 err = tg3_request_firmware(tp); 11031 err = tg3_request_firmware(tp);
10884 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) { 11032 if (tg3_asic_rev(tp) == ASIC_REV_57766) {
11033 if (err) {
11034 netdev_warn(tp->dev, "EEE capability disabled\n");
11035 tp->phy_flags &= ~TG3_PHYFLG_EEE_CAP;
11036 } else if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) {
11037 netdev_warn(tp->dev, "EEE capability restored\n");
11038 tp->phy_flags |= TG3_PHYFLG_EEE_CAP;
11039 }
11040 } else if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) {
10885 if (err) 11041 if (err)
10886 return err; 11042 return err;
10887 } else if (err) { 11043 } else if (err) {
@@ -14511,6 +14667,7 @@ static int tg3_phy_probe(struct tg3 *tp)
14511 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) && 14667 if (!(tp->phy_flags & TG3_PHYFLG_ANY_SERDES) &&
14512 (tg3_asic_rev(tp) == ASIC_REV_5719 || 14668 (tg3_asic_rev(tp) == ASIC_REV_5719 ||
14513 tg3_asic_rev(tp) == ASIC_REV_5720 || 14669 tg3_asic_rev(tp) == ASIC_REV_5720 ||
14670 tg3_asic_rev(tp) == ASIC_REV_57766 ||
14514 tg3_asic_rev(tp) == ASIC_REV_5762 || 14671 tg3_asic_rev(tp) == ASIC_REV_5762 ||
14515 (tg3_asic_rev(tp) == ASIC_REV_5717 && 14672 (tg3_asic_rev(tp) == ASIC_REV_5717 &&
14516 tg3_chip_rev_id(tp) != CHIPREV_ID_5717_A0) || 14673 tg3_chip_rev_id(tp) != CHIPREV_ID_5717_A0) ||
@@ -15293,7 +15450,8 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
15293 } else if (tg3_asic_rev(tp) != ASIC_REV_5700 && 15450 } else if (tg3_asic_rev(tp) != ASIC_REV_5700 &&
15294 tg3_asic_rev(tp) != ASIC_REV_5701 && 15451 tg3_asic_rev(tp) != ASIC_REV_5701 &&
15295 tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) { 15452 tg3_chip_rev_id(tp) != CHIPREV_ID_5705_A0) {
15296 tg3_flag_set(tp, TSO_BUG); 15453 tg3_flag_set(tp, FW_TSO);
15454 tg3_flag_set(tp, TSO_BUG);
15297 if (tg3_asic_rev(tp) == ASIC_REV_5705) 15455 if (tg3_asic_rev(tp) == ASIC_REV_5705)
15298 tp->fw_needed = FIRMWARE_TG3TSO5; 15456 tp->fw_needed = FIRMWARE_TG3TSO5;
15299 else 15457 else
@@ -15304,7 +15462,7 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
15304 if (tg3_flag(tp, HW_TSO_1) || 15462 if (tg3_flag(tp, HW_TSO_1) ||
15305 tg3_flag(tp, HW_TSO_2) || 15463 tg3_flag(tp, HW_TSO_2) ||
15306 tg3_flag(tp, HW_TSO_3) || 15464 tg3_flag(tp, HW_TSO_3) ||
15307 tp->fw_needed) { 15465 tg3_flag(tp, FW_TSO)) {
15308 /* For firmware TSO, assume ASF is disabled. 15466 /* For firmware TSO, assume ASF is disabled.
15309 * We'll disable TSO later if we discover ASF 15467 * We'll disable TSO later if we discover ASF
15310 * is enabled in tg3_get_eeprom_hw_cfg(). 15468 * is enabled in tg3_get_eeprom_hw_cfg().
@@ -15319,6 +15477,9 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
15319 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0) 15477 if (tg3_chip_rev_id(tp) == CHIPREV_ID_5701_A0)
15320 tp->fw_needed = FIRMWARE_TG3; 15478 tp->fw_needed = FIRMWARE_TG3;
15321 15479
15480 if (tg3_asic_rev(tp) == ASIC_REV_57766)
15481 tp->fw_needed = FIRMWARE_TG357766;
15482
15322 tp->irq_max = 1; 15483 tp->irq_max = 1;
15323 15484
15324 if (tg3_flag(tp, 5750_PLUS)) { 15485 if (tg3_flag(tp, 5750_PLUS)) {
@@ -15591,7 +15752,7 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
15591 */ 15752 */
15592 tg3_get_eeprom_hw_cfg(tp); 15753 tg3_get_eeprom_hw_cfg(tp);
15593 15754
15594 if (tp->fw_needed && tg3_flag(tp, ENABLE_ASF)) { 15755 if (tg3_flag(tp, FW_TSO) && tg3_flag(tp, ENABLE_ASF)) {
15595 tg3_flag_clear(tp, TSO_CAPABLE); 15756 tg3_flag_clear(tp, TSO_CAPABLE);
15596 tg3_flag_clear(tp, TSO_BUG); 15757 tg3_flag_clear(tp, TSO_BUG);
15597 tp->fw_needed = NULL; 15758 tp->fw_needed = NULL;
@@ -15779,6 +15940,11 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent)
15779 udelay(50); 15940 udelay(50);
15780 tg3_nvram_init(tp); 15941 tg3_nvram_init(tp);
15781 15942
15943 /* If the device has an NVRAM, no need to load patch firmware */
15944 if (tg3_asic_rev(tp) == ASIC_REV_57766 &&
15945 !tg3_flag(tp, NO_NVRAM))
15946 tp->fw_needed = NULL;
15947
15782 grc_misc_cfg = tr32(GRC_MISC_CFG); 15948 grc_misc_cfg = tr32(GRC_MISC_CFG);
15783 grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK; 15949 grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK;
15784 15950
diff --git a/drivers/net/ethernet/broadcom/tg3.h b/drivers/net/ethernet/broadcom/tg3.h
index 8d7d4c2ab5d6..1cdc1b641c77 100644
--- a/drivers/net/ethernet/broadcom/tg3.h
+++ b/drivers/net/ethernet/broadcom/tg3.h
@@ -2222,6 +2222,12 @@
2222#define NIC_SRAM_MBUF_POOL_BASE5705 0x00010000 2222#define NIC_SRAM_MBUF_POOL_BASE5705 0x00010000
2223#define NIC_SRAM_MBUF_POOL_SIZE5705 0x0000e000 2223#define NIC_SRAM_MBUF_POOL_SIZE5705 0x0000e000
2224 2224
2225#define TG3_SRAM_RXCPU_SCRATCH_BASE_57766 0x00030000
2226#define TG3_SRAM_RXCPU_SCRATCH_SIZE_57766 0x00010000
2227#define TG3_57766_FW_BASE_ADDR 0x00030000
2228#define TG3_57766_FW_HANDSHAKE 0x0003fccc
2229#define TG3_SBROM_IN_SERVICE_LOOP 0x51
2230
2225#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5700 128 2231#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5700 128
2226#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5755 64 2232#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5755 64
2227#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5906 32 2233#define TG3_SRAM_RX_STD_BDCACHE_SIZE_5906 32
@@ -3009,17 +3015,18 @@ enum TG3_FLAGS {
3009 TG3_FLAG_JUMBO_CAPABLE, 3015 TG3_FLAG_JUMBO_CAPABLE,
3010 TG3_FLAG_CHIP_RESETTING, 3016 TG3_FLAG_CHIP_RESETTING,
3011 TG3_FLAG_INIT_COMPLETE, 3017 TG3_FLAG_INIT_COMPLETE,
3012 TG3_FLAG_TSO_BUG,
3013 TG3_FLAG_MAX_RXPEND_64, 3018 TG3_FLAG_MAX_RXPEND_64,
3014 TG3_FLAG_TSO_CAPABLE,
3015 TG3_FLAG_PCI_EXPRESS, /* BCM5785 + pci_is_pcie() */ 3019 TG3_FLAG_PCI_EXPRESS, /* BCM5785 + pci_is_pcie() */
3016 TG3_FLAG_ASF_NEW_HANDSHAKE, 3020 TG3_FLAG_ASF_NEW_HANDSHAKE,
3017 TG3_FLAG_HW_AUTONEG, 3021 TG3_FLAG_HW_AUTONEG,
3018 TG3_FLAG_IS_NIC, 3022 TG3_FLAG_IS_NIC,
3019 TG3_FLAG_FLASH, 3023 TG3_FLAG_FLASH,
3024 TG3_FLAG_FW_TSO,
3020 TG3_FLAG_HW_TSO_1, 3025 TG3_FLAG_HW_TSO_1,
3021 TG3_FLAG_HW_TSO_2, 3026 TG3_FLAG_HW_TSO_2,
3022 TG3_FLAG_HW_TSO_3, 3027 TG3_FLAG_HW_TSO_3,
3028 TG3_FLAG_TSO_CAPABLE,
3029 TG3_FLAG_TSO_BUG,
3023 TG3_FLAG_ICH_WORKAROUND, 3030 TG3_FLAG_ICH_WORKAROUND,
3024 TG3_FLAG_1SHOT_MSI, 3031 TG3_FLAG_1SHOT_MSI,
3025 TG3_FLAG_NO_FWARE_REPORTED, 3032 TG3_FLAG_NO_FWARE_REPORTED,
@@ -3064,6 +3071,13 @@ enum TG3_FLAGS {
3064 TG3_FLAG_NUMBER_OF_FLAGS, /* Last entry in enum TG3_FLAGS */ 3071 TG3_FLAG_NUMBER_OF_FLAGS, /* Last entry in enum TG3_FLAGS */
3065}; 3072};
3066 3073
3074struct tg3_firmware_hdr {
3075 __be32 version; /* unused for fragments */
3076 __be32 base_addr;
3077 __be32 len;
3078};
3079#define TG3_FW_HDR_LEN (sizeof(struct tg3_firmware_hdr))
3080
3067struct tg3 { 3081struct tg3 {
3068 /* begin "general, frequently-used members" cacheline section */ 3082 /* begin "general, frequently-used members" cacheline section */
3069 3083