Deleted Added
full compact
octeon_machdep.c (202786) octeon_machdep.c (202831)
1/*-
2 * Copyright (c) 2006 Wojciech A. Koszek <wkoszek@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
1/*-
2 * Copyright (c) 2006 Wojciech A. Koszek <wkoszek@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 9 unchanged lines hidden (view full) ---

18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $FreeBSD: head/sys/mips/cavium/octeon_machdep.c 202786 2010-01-22 09:23:34Z imp $
26 * $FreeBSD: head/sys/mips/cavium/octeon_machdep.c 202831 2010-01-22 20:40:07Z imp $
27 */
28#include <sys/cdefs.h>
27 */
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/mips/cavium/octeon_machdep.c 202786 2010-01-22 09:23:34Z imp $");
29__FBSDID("$FreeBSD: head/sys/mips/cavium/octeon_machdep.c 202831 2010-01-22 20:40:07Z imp $");
30
31#include <sys/param.h>
32#include <sys/conf.h>
33#include <sys/kernel.h>
34#include <sys/systm.h>
35#include <sys/imgact.h>
36#include <sys/bio.h>
37#include <sys/buf.h>

--- 34 unchanged lines hidden (view full) ---

72#include <machine/vmparam.h>
73
74#if defined(__mips_n64)
75#define MAX_APP_DESC_ADDR 0xffffffffafffffff
76#else
77#define MAX_APP_DESC_ADDR 0xafffffff
78#endif
79
30
31#include <sys/param.h>
32#include <sys/conf.h>
33#include <sys/kernel.h>
34#include <sys/systm.h>
35#include <sys/imgact.h>
36#include <sys/bio.h>
37#include <sys/buf.h>

--- 34 unchanged lines hidden (view full) ---

72#include <machine/vmparam.h>
73
74#if defined(__mips_n64)
75#define MAX_APP_DESC_ADDR 0xffffffffafffffff
76#else
77#define MAX_APP_DESC_ADDR 0xafffffff
78#endif
79
80static struct pcpu pcpu0;
80extern int *edata;
81extern int *end;
82
83uint64_t ciu_get_en_reg_addr_new(int corenum, int intx, int enx, int ciu_ip);
84void ciu_dump_interrutps_enabled(int core_num, int intx, int enx, int ciu_ip);
85
86static void octeon_boot_params_init(register_t ptr);
87static uint64_t ciu_get_intr_sum_reg_addr(int core_num, int intx, int enx);
88static uint64_t ciu_get_intr_en_reg_addr(int core_num, int intx, int enx);
89
81extern int *edata;
82extern int *end;
83
84uint64_t ciu_get_en_reg_addr_new(int corenum, int intx, int enx, int ciu_ip);
85void ciu_dump_interrutps_enabled(int core_num, int intx, int enx, int ciu_ip);
86
87static void octeon_boot_params_init(register_t ptr);
88static uint64_t ciu_get_intr_sum_reg_addr(int core_num, int intx, int enx);
89static uint64_t ciu_get_intr_en_reg_addr(int core_num, int intx, int enx);
90
91static __inline void
92mips_wr_ebase(u_int32_t a0)
93{
94 __asm __volatile("mtc0 %[a0], $15, 1 ;"
95 :
96 : [a0] "r"(a0));
97
98 mips_barrier();
99}
100
90void
91platform_cpu_init()
92{
93 /* Nothing special yet */
94}
95
96/*
97 * Perform a board-level soft-reset.

--- 535 unchanged lines hidden (view full) ---

633#ifdef DEBUG_CIU_EN
634 printf(" Readback: 0x%llX\n\n ",
635 (uint64_t)oct_read64(ciu_intr_reg_addr));
636#endif
637
638 octeon_set_interrupts(cpu_status_bits);
639}
640
101void
102platform_cpu_init()
103{
104 /* Nothing special yet */
105}
106
107/*
108 * Perform a board-level soft-reset.

--- 535 unchanged lines hidden (view full) ---

644#ifdef DEBUG_CIU_EN
645 printf(" Readback: 0x%llX\n\n ",
646 (uint64_t)oct_read64(ciu_intr_reg_addr));
647#endif
648
649 octeon_set_interrupts(cpu_status_bits);
650}
651
652unsigned long
653octeon_get_clock_rate(void)
654{
655 return octeon_cpu_clock;
656}
657
658static void
659octeon_memory_init(void)
660{
661 uint32_t realmem_bytes;
662
663 if (octeon_board_real()) {
664 printf("octeon_dram == %llx\n", octeon_dram);
665 printf("reduced to ram: %u MB", (uint32_t) octeon_dram >> 20);
666
667 realmem_bytes = (octeon_dram - PAGE_SIZE);
668 realmem_bytes &= ~(PAGE_SIZE - 1);
669 printf("Real memory bytes is %x\n", realmem_bytes);
670 } else {
671 /* Simulator we limit to 96 meg */
672 realmem_bytes = (96 << 20);
673 }
674 /* phys_avail regions are in bytes */
675 phys_avail[0] = (MIPS_KSEG0_TO_PHYS((vm_offset_t)&end) + PAGE_SIZE) & ~(PAGE_SIZE - 1);
676 if (octeon_board_real()) {
677 if (realmem_bytes > OCTEON_DRAM_FIRST_256_END)
678 phys_avail[1] = OCTEON_DRAM_FIRST_256_END;
679 else
680 phys_avail[1] = realmem_bytes;
681 realmem_bytes -= OCTEON_DRAM_FIRST_256_END;
682 realmem_bytes &= ~(PAGE_SIZE - 1);
683 printf("phys_avail[0] = %x phys_avail[1] = %x\n",
684 phys_avail[0], phys_avail[1]);
685 } else {
686 /* Simulator gets 96Meg period. */
687 phys_avail[1] = (96 << 20);
688 }
689 /*-
690 * Octeon Memory looks as follows:
691 * PA
692 * 0000 0000 to 0x0 0000 0000 0000
693 * 0FFF FFFF First 256 MB memory Maps to 0x0 0000 0FFF FFFF
694 *
695 * 1000 0000 to 0x1 0000 1000 0000
696 * 1FFF FFFF Uncached Bu I/O space.converted to 0x1 0000 1FFF FFFF
697 *
698 * 2FFF FFFF to Cached 0x0 0000 2000 0000
699 * FFFF FFFF all dram mem above the first 512M 0x3 FFFF FFFF FFFF
700 *
701 */
702 physmem = btoc(phys_avail[1] - phys_avail[0]);
703 if ((octeon_board_real()) &&
704 (realmem_bytes > OCTEON_DRAM_FIRST_256_END)) {
705 /* take out the upper non-cached 1/2 */
706 realmem_bytes -= OCTEON_DRAM_FIRST_256_END;
707 realmem_bytes &= ~(PAGE_SIZE - 1);
708 /* Now map the rest of the memory */
709 phys_avail[2] = 0x20000000;
710 printf("realmem_bytes is now at %x\n", realmem_bytes);
711 phys_avail[3] = ((uint32_t) 0x20000000 + realmem_bytes);
712 printf("Next block of memory goes from %x to %x\n",
713 phys_avail[2], phys_avail[3]);
714 physmem += btoc(phys_avail[3] - phys_avail[2]);
715 } else {
716 printf("realmem_bytes is %d\n", realmem_bytes);
717 }
718 realmem = physmem;
719
720 printf("\nTotal DRAM Size 0x%X", (uint32_t) octeon_dram);
721 printf("\nBank 0 = 0x%8X -> 0x%8X", phys_avail[0], phys_avail[1]);
722 printf("\nBank 1 = 0x%8X -> 0x%8X\n", phys_avail[2], phys_avail[3]);
723 printf("\nphysmem: 0x%lx", physmem);
724
725 Maxmem = physmem;
726
727}
728
641void
642platform_start(__register_t a0, __register_t a1, __register_t a2 __unused,
643 __register_t a3)
644{
645 uint64_t platform_counter_freq;
729void
730platform_start(__register_t a0, __register_t a1, __register_t a2 __unused,
731 __register_t a3)
732{
733 uint64_t platform_counter_freq;
646 int i, mem = 0;
647
648 /* Initialize pcpu stuff */
649 mips_pcpu0_init();
734
735 /* Initialize pcpu stuff */
736 mips_pcpu0_init();
737 mips_timer_early_init(OCTEON_CLOCK_DEFAULT);
738 cninit();
650
739
740 octeon_ciu_reset();
651 octeon_boot_params_init(a3);
741 octeon_boot_params_init(a3);
652 /* XXX octeon boot decriptor has args in it... */
653 octeon_ciu_reset();
654 octeon_uart_write_string(0, "Platform Starting\n");
655
656 bootverbose = 1;
742 bootverbose = 1;
657 if (mem > 0)
658 realmem = btoc(mem << 20);
659 else
660 realmem = btoc(32 << 20);
743 cpuid_to_pcpu[0] = &pcpu0;
661
744
662 for (i = 0; i < 10; i++)
663 phys_avail[i] = 0;
745 /*
746 * For some reason on the cn38xx simulator ebase register is set to
747 * 0x80001000 at bootup time. Move it back to the default, but
748 * when we move to having support for multiple executives, we need
749 * to rethink this.
750 */
751 mips_wr_ebase(0x80000000);
664
752
665 /* phys_avail regions are in bytes */
666 phys_avail[0] = MIPS_KSEG0_TO_PHYS((vm_offset_t)&end);
667 phys_avail[1] = ctob(realmem);
668
669 physmem = realmem;
670
671 pmap_bootstrap();
672 mips_proc0_init();
673
753 octeon_memory_init();
674 init_param1();
754 init_param1();
675 /* TODO: parse argc,argv */
676 platform_counter_freq = 330000000UL; /* XXX: from idt */
677 mips_timer_init_params(platform_counter_freq, 1);
678 cninit();
679 init_param2(physmem);
680 mips_cpu_init();
755 init_param2(physmem);
756 mips_cpu_init();
757 pmap_bootstrap();
758 mips_proc0_init();
681 mutex_init();
682#ifdef DDB
683 kdb_init();
684#endif
759 mutex_init();
760#ifdef DDB
761 kdb_init();
762#endif
763 platform_counter_freq = octeon_get_clock_rate();
764 mips_timer_init_params(platform_counter_freq, 1);
685}
686
765}
766
767/* impSTART: This stuff should move back into the Cavium SDK */
687/*
688 ****************************************************************************************
689 *
690 * APP/BOOT DESCRIPTOR STUFF
691 *
692 ****************************************************************************************
693 */
694

--- 88 unchanged lines hidden (view full) ---

783
784uint32_t octeon_cpu_clock;
785uint64_t octeon_dram;
786uint32_t octeon_bd_ver = 0, octeon_cvmx_bd_ver = 0, octeon_board_rev_major, octeon_board_rev_minor, octeon_board_type;
787uint8_t octeon_mac_addr[6] = { 0 };
788int octeon_core_mask, octeon_mac_addr_count;
789int octeon_chip_rev_major = 0, octeon_chip_rev_minor = 0, octeon_chip_type = 0;
790
768/*
769 ****************************************************************************************
770 *
771 * APP/BOOT DESCRIPTOR STUFF
772 *
773 ****************************************************************************************
774 */
775

--- 88 unchanged lines hidden (view full) ---

864
865uint32_t octeon_cpu_clock;
866uint64_t octeon_dram;
867uint32_t octeon_bd_ver = 0, octeon_cvmx_bd_ver = 0, octeon_board_rev_major, octeon_board_rev_minor, octeon_board_type;
868uint8_t octeon_mac_addr[6] = { 0 };
869int octeon_core_mask, octeon_mac_addr_count;
870int octeon_chip_rev_major = 0, octeon_chip_rev_minor = 0, octeon_chip_type = 0;
871
791extern int32_t app_descriptor_addr;
792static octeon_boot_descriptor_t *app_desc_ptr;
793static cvmx_bootinfo_t *cvmx_desc_ptr;
794
795#define OCTEON_BOARD_TYPE_NONE 0
796#define OCTEON_BOARD_TYPE_SIM 1
797
798#define OCTEON_CLOCK_MIN (100 * 1000 * 1000)
799#define OCTEON_CLOCK_MAX (800 * 1000 * 1000)

--- 16 unchanged lines hidden (view full) ---

816octeon_process_app_desc_ver_unknown(void)
817{
818 printf(" Unknown Boot-Descriptor: Using Defaults\n");
819
820 octeon_cpu_clock = OCTEON_CLOCK_DEFAULT;
821 octeon_dram = OCTEON_DRAM_DEFAULT;
822 octeon_board_rev_major = octeon_board_rev_minor = octeon_board_type = 0;
823 octeon_core_mask = 1;
872static octeon_boot_descriptor_t *app_desc_ptr;
873static cvmx_bootinfo_t *cvmx_desc_ptr;
874
875#define OCTEON_BOARD_TYPE_NONE 0
876#define OCTEON_BOARD_TYPE_SIM 1
877
878#define OCTEON_CLOCK_MIN (100 * 1000 * 1000)
879#define OCTEON_CLOCK_MAX (800 * 1000 * 1000)

--- 16 unchanged lines hidden (view full) ---

896octeon_process_app_desc_ver_unknown(void)
897{
898 printf(" Unknown Boot-Descriptor: Using Defaults\n");
899
900 octeon_cpu_clock = OCTEON_CLOCK_DEFAULT;
901 octeon_dram = OCTEON_DRAM_DEFAULT;
902 octeon_board_rev_major = octeon_board_rev_minor = octeon_board_type = 0;
903 octeon_core_mask = 1;
824 octeon_cpu_clock = OCTEON_CLOCK_DEFAULT;
825 octeon_chip_type = octeon_chip_rev_major = octeon_chip_rev_minor = 0;
826 octeon_mac_addr[0] = 0x00; octeon_mac_addr[1] = 0x0f;
827 octeon_mac_addr[2] = 0xb7; octeon_mac_addr[3] = 0x10;
828 octeon_mac_addr[4] = 0x09; octeon_mac_addr[5] = 0x06;
829 octeon_mac_addr_count = 1;
830}
831
832static int

--- 6 unchanged lines hidden (view full) ---

839 return 1;
840 }
841 cvmx_desc_ptr =
842 (cvmx_bootinfo_t *)(intptr_t)app_desc_ptr->cvmx_desc_vaddr;
843 cvmx_desc_ptr =
844 (cvmx_bootinfo_t *) ((intptr_t)cvmx_desc_ptr | MIPS_KSEG0_START);
845 octeon_cvmx_bd_ver = (cvmx_desc_ptr->major_version * 100) +
846 cvmx_desc_ptr->minor_version;
904 octeon_chip_type = octeon_chip_rev_major = octeon_chip_rev_minor = 0;
905 octeon_mac_addr[0] = 0x00; octeon_mac_addr[1] = 0x0f;
906 octeon_mac_addr[2] = 0xb7; octeon_mac_addr[3] = 0x10;
907 octeon_mac_addr[4] = 0x09; octeon_mac_addr[5] = 0x06;
908 octeon_mac_addr_count = 1;
909}
910
911static int

--- 6 unchanged lines hidden (view full) ---

918 return 1;
919 }
920 cvmx_desc_ptr =
921 (cvmx_bootinfo_t *)(intptr_t)app_desc_ptr->cvmx_desc_vaddr;
922 cvmx_desc_ptr =
923 (cvmx_bootinfo_t *) ((intptr_t)cvmx_desc_ptr | MIPS_KSEG0_START);
924 octeon_cvmx_bd_ver = (cvmx_desc_ptr->major_version * 100) +
925 cvmx_desc_ptr->minor_version;
847 /* Too early for panic? */
848 if (cvmx_desc_ptr->major_version != 1) {
926 if (cvmx_desc_ptr->major_version != 1) {
849 printf("Incompatible CVMX descriptor from bootloader: %d.%d %p\n",
927 panic("Incompatible CVMX descriptor from bootloader: %d.%d %p\n",
850 (int) cvmx_desc_ptr->major_version,
851 (int) cvmx_desc_ptr->minor_version, cvmx_desc_ptr);
928 (int) cvmx_desc_ptr->major_version,
929 (int) cvmx_desc_ptr->minor_version, cvmx_desc_ptr);
852 while (1); /* Never return */
853 return 1; /* Satisfy the compiler */
854 }
855
856 octeon_core_mask = cvmx_desc_ptr->core_mask;
857 octeon_cpu_clock = cvmx_desc_ptr->eclock_hz;
858 octeon_board_type = cvmx_desc_ptr->board_type;
859 octeon_board_rev_major = cvmx_desc_ptr->board_rev_major;
860 octeon_board_rev_minor = cvmx_desc_ptr->board_rev_minor;
861 octeon_chip_type = cvmx_desc_ptr->chip_type;

--- 9 unchanged lines hidden (view full) ---

871
872 if (app_desc_ptr->dram_size > 16*1024*1024)
873 octeon_dram = (uint64_t)app_desc_ptr->dram_size;
874 else
875 octeon_dram = (uint64_t)app_desc_ptr->dram_size << 20;
876 return 0;
877}
878
930 }
931
932 octeon_core_mask = cvmx_desc_ptr->core_mask;
933 octeon_cpu_clock = cvmx_desc_ptr->eclock_hz;
934 octeon_board_type = cvmx_desc_ptr->board_type;
935 octeon_board_rev_major = cvmx_desc_ptr->board_rev_major;
936 octeon_board_rev_minor = cvmx_desc_ptr->board_rev_minor;
937 octeon_chip_type = cvmx_desc_ptr->chip_type;

--- 9 unchanged lines hidden (view full) ---

947
948 if (app_desc_ptr->dram_size > 16*1024*1024)
949 octeon_dram = (uint64_t)app_desc_ptr->dram_size;
950 else
951 octeon_dram = (uint64_t)app_desc_ptr->dram_size << 20;
952 return 0;
953}
954
879static int
880octeon_process_app_desc_ver_3_4_5(void)
881{
882
883 octeon_cvmx_bd_ver = octeon_bd_ver;
884 octeon_core_mask = app_desc_ptr->core_mask;
885
886 if (app_desc_ptr->desc_version > 3)
887 octeon_cpu_clock = app_desc_ptr->eclock_hz;
888 else
889 octeon_cpu_clock = OCTEON_CLOCK_DEFAULT;
890 if (app_desc_ptr->dram_size > 16*1024*1024)
891 octeon_dram = (uint64_t)app_desc_ptr->dram_size;
892 else
893 octeon_dram = (uint64_t)app_desc_ptr->dram_size << 20;
894
895 if (app_desc_ptr->desc_version > 4) {
896 octeon_board_type = app_desc_ptr->board_type;
897 octeon_board_rev_major = app_desc_ptr->board_rev_major;
898 octeon_board_rev_minor = app_desc_ptr->board_rev_minor;
899 octeon_chip_type = app_desc_ptr->chip_type;
900 octeon_chip_rev_major = app_desc_ptr->chip_rev_major;
901 octeon_chip_rev_minor = app_desc_ptr->chip_rev_minor;
902
903 octeon_mac_addr[0] = app_desc_ptr->mac_addr_base[0];
904 octeon_mac_addr[1] = app_desc_ptr->mac_addr_base[1];
905 octeon_mac_addr[2] = app_desc_ptr->mac_addr_base[2];
906 octeon_mac_addr[3] = app_desc_ptr->mac_addr_base[3];
907 octeon_mac_addr[4] = app_desc_ptr->mac_addr_base[4];
908 octeon_mac_addr[5] = app_desc_ptr->mac_addr_base[5];
909 octeon_mac_addr_count = app_desc_ptr->mac_addr_count;
910 }
911 return 0;
912}
913
914
915static void
916octeon_boot_params_init(register_t ptr)
917{
918 int bad_desc = 1;
955static void
956octeon_boot_params_init(register_t ptr)
957{
958 int bad_desc = 1;
919
959
920 if (ptr != 0 && ptr < MAX_APP_DESC_ADDR) {
921 app_desc_ptr = (octeon_boot_descriptor_t *)(intptr_t)ptr;
922 octeon_bd_ver = app_desc_ptr->desc_version;
960 if (ptr != 0 && ptr < MAX_APP_DESC_ADDR) {
961 app_desc_ptr = (octeon_boot_descriptor_t *)(intptr_t)ptr;
962 octeon_bd_ver = app_desc_ptr->desc_version;
923 if ((octeon_bd_ver >= 3) && (octeon_bd_ver <= 5))
924 bad_desc = octeon_process_app_desc_ver_3_4_5();
925 else if (app_desc_ptr->desc_version == 6)
963 if (app_desc_ptr->desc_version == 6)
926 bad_desc = octeon_process_app_desc_ver_6();
927 }
928 if (bad_desc)
929 octeon_process_app_desc_ver_unknown();
930
931 printf("Boot Descriptor Ver: %u -> %u/%u",
932 octeon_bd_ver, octeon_cvmx_bd_ver/100, octeon_cvmx_bd_ver%100);
933 printf(" CPU clock: %uMHz\n", octeon_cpu_clock/1000000);
934 printf(" Dram: %u MB", (uint32_t)(octeon_dram >> 20));
935 printf(" Board Type: %u Revision: %u/%u\n",
936 octeon_board_type, octeon_board_rev_major, octeon_board_rev_minor);
937 printf(" Octeon Chip: %u Rev %u/%u",
938 octeon_chip_type, octeon_chip_rev_major, octeon_chip_rev_minor);
939
964 bad_desc = octeon_process_app_desc_ver_6();
965 }
966 if (bad_desc)
967 octeon_process_app_desc_ver_unknown();
968
969 printf("Boot Descriptor Ver: %u -> %u/%u",
970 octeon_bd_ver, octeon_cvmx_bd_ver/100, octeon_cvmx_bd_ver%100);
971 printf(" CPU clock: %uMHz\n", octeon_cpu_clock/1000000);
972 printf(" Dram: %u MB", (uint32_t)(octeon_dram >> 20));
973 printf(" Board Type: %u Revision: %u/%u\n",
974 octeon_board_type, octeon_board_rev_major, octeon_board_rev_minor);
975 printf(" Octeon Chip: %u Rev %u/%u",
976 octeon_chip_type, octeon_chip_rev_major, octeon_chip_rev_minor);
977
940 printf(" Mac Address %02X.%02X.%02X.%02X.%02X.%02X\n",
941 octeon_mac_addr[0], octeon_mac_addr[1], octeon_mac_addr[2],
942 octeon_mac_addr[3], octeon_mac_addr[4], octeon_mac_addr[5]);
978 printf(" Mac Address %02X.%02X.%02X.%02X.%02X.%02X (%d)\n",
979 octeon_mac_addr[0], octeon_mac_addr[1], octeon_mac_addr[2],
980 octeon_mac_addr[3], octeon_mac_addr[4], octeon_mac_addr[5],
981 octeon_mac_addr_count);
943}
982}
983/* impEND: This stuff should move back into the Cavium SDK */